百度地图API Android(安卓)SDK开发笔记二实现公交车查询
在上次正常显示百度地图的基础上,这次添加了搜索公交车功能,显示交通路线,以及卫星地图切换功能。整个过程如下
一、注册账号,获取key
这个和google有点类似,不过要简单的多,并且也没有使用限次,据说是免费的。
进入百度开发者中心http://developer.baidu.com/,注册个账号,安要求做OK。在主页点百度地图API,接着在下面些点Android SDK,开始百度地图Android SDK开发。获取密钥,申请key简单描述哈,就可以生成API密钥,记下这个以后程序会用到。
二、新建AVD模拟器
启动eclipse。选择Window/Android Virtual Device Manager,弹出Android Virtual Device Manager选择New,新建AVD信息如下:
接着选择新建的AVD,start接着Launch就开启AVD了,开启时间有点长,一般开了就不关。不管它下面新建Android工程
三、新建Android Application Project
File/New/Android Application Project,创建自己的工程,我的如下:
Application Name:mapsearch
Porject Name:mapsearch
Package Name: com.example.mapsearch
Minimum Required SDK:API 10:Android 2.3.3(Gingerbread)
Target SDK:API 14:Android 4.0(IceCreamSandwich)
Compile With:API 14:Android 4.0(IceCreamSandwich)
Theme:None
剩下的Next保持默认不变,Finish就OK。下面仿照官方编写代码http://developer.baidu.com/map/sdkandev-2.htm,我完全按官方的来发现编译通不过,就仿照给的例子修改。其中用到的库在官方网站上都有下的,在相关下载下BaiduMap_AndroidSDK_v2.1.1_Lib.zip、BaiduMap_AndroidSDK_v2.1.1_Sample.zip即可。
1.添加库、设置工程属性
将下载的库添加到新建工程中。在左边Package Explore,mapsbase工程libs目录下新建armeabi文件夹。接着把下载的baidumapapi_v2_1_1.jar、locSDK_3.1.jar拖到libs目录,libapp_BaiduMapApplib_v2_1_1.so、libvi_voslib.so和liblocSDK3.so拖到刚刚建的armeabi目录。接着在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_v2_1_1.jar,确定后返回。通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。
2.编写代码
在前面正常显示地图基础上,增加搜索功能及地图图层显示·,我的代码如下:
根目录下AndroidMainfest.xml:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mapsearch" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MapDemo" android:screenOrientation="sensor" android:configChanges="orientation|keyboardHidden"></activity> <activity android:name="com.example.mapsearch.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application><uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > </permission> <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.ACCES_MOCK_LOCATION" > </uses-permission> <!-- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? --> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.CAMERA" > </uses-permission> <uses-permission android:name="android.permission.RECORD_AUDIO" > </uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 来电消音 --> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" > </uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:resizeable="true" android:anyDensity="true"/></manifest>
文件
res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:text="在" android:layout_width="wrap_content" android:layout_height="wrap_content" /><EditTextandroid:id="@+id/city" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="成都" /> <TextView android:text="市内找" android:layout_width="wrap_content" android:layout_height="wrap_content" /><EditTextandroid:id="@+id/searchkey" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="96" /><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="公交车" /> <Button android:id="@+id/search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换" /> </LinearLayout> <com.baidu.mapapi.map.MapView android:id="@+id/bmapsView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" > </com.baidu.mapapi.map.MapView></LinearLayout>
文件src/com.example.mapsearch/MainActivity.java:
package com.example.mapsearch;import android.app.Activity;import android.content.res.Configuration;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.FrameLayout;import android.widget.Toast;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.map.MKMapViewListener;import com.baidu.mapapi.map.MapController;import com.baidu.mapapi.map.MapPoi;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.RouteOverlay;import com.baidu.mapapi.search.MKAddrInfo;import com.baidu.mapapi.search.MKBusLineResult;import com.baidu.mapapi.search.MKDrivingRouteResult;import com.baidu.mapapi.search.MKPoiInfo;import com.baidu.mapapi.search.MKPoiResult;import com.baidu.mapapi.search.MKSearch;import com.baidu.mapapi.search.MKSearchListener;import com.baidu.mapapi.search.MKSuggestionResult;import com.baidu.mapapi.search.MKTransitRouteResult;import com.baidu.mapapi.search.MKWalkingRouteResult;import com.baidu.platform.comapi.basestruct.GeoPoint;public class MainActivity extends Activity {BMapManager mBMapMan = null;MapView mMapView = null;Button mBtnSearch = null;// 搜索按钮Button mBtnAlt = null;// 切换按钮MKSearch mSearch = null;// 搜索模块,也可去掉地图模块独立使用String mCityName = null;int i = 1;//@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBMapMan=new BMapManager(getApplication());mBMapMan.init("填你申请的key", null); //注意:请在试用setContentView前初始化BMapManager对象,否则会报错setContentView(R.layout.activity_main);mMapView=(MapView)findViewById(R.id.bmapsView);mMapView.setBuiltInZoomControls(true);mMapView.setTraffic(true);//mMapView.setSatellite(true);//设置启用内置的缩放控件MapController mMapController=mMapView.getController();// 得到mMapView的控制权,可以用它控制和驱动平移和缩放GeoPoint point =new GeoPoint((int)(30.664* 1E6),(int)(104.071* 1E6));//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)mMapController.setCenter(point);//设置地图中心点mMapController.setZoom(12);//设置地图zoom级别 // 初始化搜索模块,注册事件监听 mSearch = new MKSearch(); mSearch.init(mBMapMan, new MKSearchListener(){ @Override public void onGetPoiDetailSearchResult(int type, int error) { } public void onGetPoiResult(MKPoiResult res, int type, int error) {// 错误号可参考MKEvent中的定义if (error != 0 || res == null) {Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();return; }// 找到公交路线poi node MKPoiInfo curPoi = null; int totalPoiNum = res.getCurrentNumPois();for( int idx = 0; idx < totalPoiNum; idx++ ) { if ( 2 == res.getPoi(idx).ePoiType ) { // poi类型,0:普通点,1:公交站,2:公交线路,3:地铁站,4:地铁线路 curPoi = res.getPoi(idx); mSearch.busLineSearch(mCityName, curPoi.uid); break; }}// 没有找到公交信息 if (curPoi == null) { Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show(); return; }}public void onGetDrivingRouteResult(MKDrivingRouteResult res,int error) {}public void onGetTransitRouteResult(MKTransitRouteResult res,int error) {}public void onGetWalkingRouteResult(MKWalkingRouteResult res,int error) {}public void onGetAddrResult(MKAddrInfo res, int error) {}public void onGetBusDetailResult(MKBusLineResult result, int iError) {if (iError != 0 || result == null) {Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();return; }RouteOverlay routeOverlay = new RouteOverlay(MainActivity.this, mMapView); // 此处仅展示一个方案作为示例 routeOverlay.setData(result.getBusRoute()); mMapView.getOverlays().clear(); mMapView.getOverlays().add(routeOverlay); mMapView.refresh(); mMapView.getController().animateTo(result.getBusRoute().getStart());}@Overridepublic void onGetSuggestionResult(MKSuggestionResult res, int arg1) {} }); // 设定搜索按钮的响应 mBtnSearch = (Button)findViewById(R.id.search); mBtnAlt = (Button)findViewById(R.id.button1); OnClickListener clickListener = new OnClickListener(){public void onClick(View v) {switch (v.getId()) {case R.id.search:SearchButtonProcess(v);break;case R.id.button1:i++;//SearchButtonProcess(v);if (i%2 == 0)mMapView.setSatellite(true);elsemMapView.setSatellite(false);break;default:break;}} }; mBtnSearch.setOnClickListener(clickListener); mBtnAlt.setOnClickListener(clickListener); }@Overrideprotected void onDestroy(){ mMapView.destroy(); if(mBMapMan!=null){ mBMapMan.destroy(); mBMapMan=null; } super.onDestroy();}void SearchButtonProcess(View v) {if (mBtnSearch.equals(v)) {EditText editCity = (EditText)findViewById(R.id.city);EditText editSearchKey = (EditText)findViewById(R.id.searchkey);mCityName = editCity.getText().toString(); mSearch.poiSearchInCity(mCityName, editSearchKey.getText().toString());}}@Overrideprotected void onPause(){ mMapView.onPause(); if(mBMapMan!=null){ mBMapMan.stop(); } super.onPause();}@Overrideprotected void onResume(){ mMapView.onResume(); if(mBMapMan!=null){ mBMapMan.start(); } super.onResume();}}
代码就写完了,下面开始测试。
四、编译、测试
Project/Build all,修改直至无误,上面的程序在我机子上编译是OK的。开始测试吧,点DDMS看有没有发现模拟器设备,没有就Reset adb下,等发现设备后开始运行。右击工程属性选Run As/Android Application.开始运行,在Console/Android 就可以看到如下加载信息
[2013-05-17 21:01:59 - mapsearch] Android Launch!
[2013-05-17 21:01:59 - mapsearch] adb is running normally.
[2013-05-17 21:01:59 - mapsearch] Performing com.example.mapsearch.MainActivity activity launch
[2013-05-17 21:02:00 - mapsearch] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'em40'
[2013-05-17 21:02:00 - mapsearch] Uploading mapsearch.apk onto device 'emulator-5554'
[2013-05-17 21:02:11 - mapsearch] Installing mapsearch.apk...
[2013-05-17 21:02:49 - mapsearch] Success!
[2013-05-17 21:02:50 - mapsearch] Starting activity com.example.mapsearch.MainActivity on device emulator-5554
[2013-05-17 21:02:53 - mapsearch] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.mapsearch/.MainActivity }
单击开始搜索,如下:
查看卫星高清图,单击切换
单击切换,又回到以前
这是在模拟器的运行效果,安装到手机或平板界面也是这样,百度地图显示效果真心不错,百度地图给力
更多相关文章
- Android周学习Step By Step(3)--应用工程文件组成
- 高德地图的调试版SHA1与发布版SHA1分别的获取,申请到KEY
- Android应用程序整合第三方API(以高德Map API为例)
- r.java文件没有生成
- 关于谷歌地图的问题:requires unavailable shared library com.go
- Android集成百度地图-----显示地图、定位、长按显示地址信息
- Android(安卓)Studio问题收集
- 【Android(安卓)Native Code开发系列】四 编译自己的Native Code
- 【已解决】Android(安卓)Studio 加载自定义properties文件出错ja