最近搞的项目中需要用到地图,用来展示使用者附近如肯德基餐厅的位置。之前通过高德地图实现了,今天又通过百度地图来实现一下。废话不多说!
首先,从百度地图下载Android平台下面的API开发包,示例代码和http://dev.baidu.com/wiki/imap/index.php。
解压示例代码,导入eclipse运行,如下图:
但是没有我们所需要的代码,所以还是要自己动手来实现一个DEMO,创建一个Android工程,在manifest加入百度地图所需权限:
1 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 2 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 3 <uses-permission android:name="android.permission.INTERNET"></uses-permission> 4 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 5 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 6 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 7 <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
在main.xml中加入:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent"> 6 7 <TextView 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="@string/hello" /> 11 12 <com.baidu.mapapi.MapView 13 android:id="@+id/bmapsView" 14 android:layout_width="fill_parent" 15 android:layout_height="fill_parent" 16 android:clickable="true" /> 17 18 </LinearLayout>
根据百度的开发指南在MyBaiduMap的文件中添加如下代码:
1 package com.lee.mybaidumap; 2 3 import com.baidu.mapapi.BMapManager; 4 import com.baidu.mapapi.GeoPoint; 5 import com.baidu.mapapi.LocationListener; 6 import com.baidu.mapapi.MKAddrInfo; 7 import com.baidu.mapapi.MKBusLineResult; 8 import com.baidu.mapapi.MKDrivingRouteResult; 9 import com.baidu.mapapi.MKPoiResult; 10 import com.baidu.mapapi.MKSearch; 11 import com.baidu.mapapi.MKSearchListener; 12 import com.baidu.mapapi.MKTransitRouteResult; 13 import com.baidu.mapapi.MKWalkingRouteResult; 14 import com.baidu.mapapi.MapActivity; 15 import com.baidu.mapapi.MapView; 16 import com.baidu.mapapi.MyLocationOverlay; 17 import com.baidu.mapapi.PoiOverlay; 18 19 import android.location.Location; 20 import android.os.Bundle; 21 22 public class MyBaiduMap extends MapActivity { 23 24 MapView mMapView = null; 25 BMapManager mBMapMan = null; 26 LocationListener mLocationListener = null;//onResume时注册此listener,onPause时需要Remove 27 MyLocationOverlay mLocationOverlay = null; //定位图层 28 29 MKSearchListener mMKSearchListener = null; 30 MKSearch mMKSearch = null; 31 32 /** Called when the activity is first created. */ 33 @Override 34 public void onCreate(Bundle savedInstanceState) { 35 super.onCreate(savedInstanceState); 36 setContentView(R.layout.main); 37 38 mBMapMan = new BMapManager(getApplication()); 39 mBMapMan.init(this.getString(R.string.baidumap_key), null); 40 // 如果使用地图SDK,请初始化地图Activity 41 super.initMapActivity(mBMapMan); 42 mMapView = (MapView) findViewById(R.id.bmapsView); 43 mMapView.setBuiltInZoomControls(true); //设置启用内置的缩放控件 44 //设置在缩放动画过程中也显示overlay,默认为不绘制 45 mMapView.setDrawOverlayWhenZooming(true); 46 47 // 添加我的位置定位图层 48 mLocationOverlay = new MyLocationOverlay(this, mMapView); 49 mMapView.getOverlays().add(mLocationOverlay); 50 51 // 初始化搜索模块,注册事件监听 52 mMKSearch = new MKSearch(); 53 mMKSearch.init(mBMapMan, new MKSearchListener(){ 54 55 @Override 56 public void onGetAddrResult(MKAddrInfo arg0, int arg1) { 57 // TODO Auto-generated method stub 58 59 } 60 61 @Override 62 public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { 63 // TODO Auto-generated method stub 64 65 } 66 67 @Override 68 public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, 69 int arg1) { 70 // TODO Auto-generated method stub 71 72 } 73 74 @Override 75 public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { 76 // TODO Auto-generated method stub 77 if(arg0 == null){ 78 return; 79 } 80 PoiOverlay poioverlay = new PoiOverlay(MyBaiduMap.this, mMapView); 81 poioverlay.setData(arg0.getAllPoi()); 82 mMapView.getOverlays().add(poioverlay); 83 } 84 85 @Override 86 public void onGetTransitRouteResult(MKTransitRouteResult arg0, 87 int arg1) { 88 // TODO Auto-generated method stub 89 90 } 91 92 @Override 93 public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, 94 int arg1) { 95 // TODO Auto-generated method stub 96 97 } 98 99 }); 100 101 // 注册定位事件 102 mLocationListener = new LocationListener(){ 103 104 @Override 105 public void onLocationChanged(Location location) { 106 if (location != null){ 107 GeoPoint pt = new GeoPoint((int)(location.getLatitude()*1e6), 108 (int)(location.getLongitude()*1e6)); 109 mMapView.getController().animateTo(pt); 110 mMapView.getController().setZoom(15); //设置地图zoom级别 111 //寻找我的位置附近的KFC餐厅 112 mMKSearch.poiSearchNearBy("KFC", pt, 2000); 113 } 114 } 115 }; 116 } 117 118 @Override 119 protected void onDestroy(){ 120 // 在activity destroy前mBMapMan.destroy() 121 if(mBMapMan != null){ 122 mBMapMan.destroy(); 123 mBMapMan = null; 124 } 125 super.onDestroy(); 126 } 127 128 @Override 129 protected void onPause(){ 130 if(mBMapMan != null){ 131 mBMapMan.getLocationManager().removeUpdates(mLocationListener); 132 mLocationOverlay.disableMyLocation(); 133 mLocationOverlay.disableCompass(); // 关闭指南针 134 mBMapMan.stop(); //终止百度地图API,调用此函数后,不会再发生回调 135 } 136 super.onPause(); 137 } 138 139 @Override 140 protected void onResume(){ 141 if(mBMapMan != null){ 142 // 注册定位事件,定位后将地图移动到定位点 143 mBMapMan.getLocationManager().requestLocationUpdates(mLocationListener); 144 mLocationOverlay.enableMyLocation(); 145 mLocationOverlay.enableCompass(); // 打开指南针 146 mBMapMan.start(); //开启百度地图API 147 } 148 super.onResume(); 149 } 150 151 @Override 152 protected boolean isRouteDisplayed() { 153 // TODO Auto-generated method stub 154 return false; 155 } 156 }
上述代码可以实现显示使用者附近2000以内的肯德基餐厅。需要在string.xml文件中增加 baidumap_key 字段。运行如下图:
