[Android]百度地图使用心得
写在前面的话:最近手机上的各种应用对地图的要求越来越高,人们对地图的依赖也越来越明显,之前零零碎碎的做了些地图先关的功能,一直没有系统的学习过,今天抽空就整理一下。
使用百度地图的步骤:
1、去百度地图API官网(http://developer.baidu.com/map/sdkandev-download.htm)下载jar包和库文件(我使用的是Android SDKv2.1.3和locSDK_3.3);
2、申请自己的秘钥(自Android SDKv2.1.3之后,申请秘钥的方式有所改变);
3、在AndroidManifest.xml中添加权限和定位服务;
添加权限:
<!-- 使用网络功能所需权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission> <!-- SDK离线地图和cache功能需要读写外部存储器 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <!-- 获取设置信息和详情页直接拨打电话需要以下权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <uses-permission android:name="android.permission.CALL_PHONE" > </uses-permission> <!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6项 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <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_COARSE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_GPS" />
在Application下添加服务:
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>
4、在Acitivity的onCreate()方法中引用我们申请的key,初始化百度地图;
mMapManager = new BMapManager(getApplication()); mMapManager.init("你的key", null); setContentView(R.layout.activity_map);
5、在布局文件中导入地图视图;
<com.baidu.mapapi.map.MapView android:id="@+id/baiduMap" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" />
6、在Activity中初始化地图,并根据自己的需要个性化;
mMapView = (MapView) this.findViewById(R.id.baiduMap); // 启用缩放控件 mMapView.setBuiltInZoomControls(true); // 得到MapView的控制权,可以用它控制和驱动平移和缩放 controller = mMapView.getController(); // 用给定的经纬度构造一个GeoPoint,单位是微度(度*1E6) // GeoPoint point = new GeoPoint((int) (31.223872 * 1E6), // (int) (121.538746 * 1E6)); // controller.setCenter(point); controller.setZoom(14); controller.enableClick(true);
7、初始化定位相关类(定位必须和其监听类一起使用,否则无法定位);
/* 2、定位 获取坐标 */ // 定位初始化 mLocation = new LocationClient(this); mLocation.registerLocationListener(mLocationListener); // 定位的选项 LocationClientOption option = new LocationClientOption(); option.setProdName("你的应用名称"); // 优先网络定位 option.setPriority(LocationClientOption.NetWorkFirst); // 百度地图的坐标形式 option.setCoorType("bd09ll"); // 每10秒 更新一次 option.setScanSpan(10 * 1000); mLocation.setLocOption(option); mLocation.start();
监听类:
/** * 定位监类,定位时需要调用 **/ class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (mLocation == null) { return; } else { mData.longitude = location.getLongitude(); mData.latitude = location.getLatitude(); mData.accuracy = location.getRadius(); mData.direction = location.getDerect(); System.out.println(mData.longitude + "," + mData.latitude); mLocationOverlay.setData(mData); mMapView.refresh(); // 定位时移到定位点 if (manualRequest) { controller.animateTo(new GeoPoint((int)(mData.latitude* 1e6), (int)(mData.longitude * 1e6))); manualRequest = false; } } }
8、将定位坐标绑定在定位图层;
/* 3、将坐标绑定在定位图层上 */ // 初始化定位图层 mLocationOverlay = new LocationOverlay(mMapView); mData = new LocationData(); mData.latitude = 31.223829; mData.longitude = 121.538746; mLocationOverlay.setData(mData); // 在地图上添加,定位图层 mMapView.getOverlays().add(mLocationOverlay); mLocationOverlay.enableCompass(); mMapView.refresh();
基本步骤就是这些,步骤可能显得比较多,我是尽量拆分开来,容易记忆便于理解。
值的说明的是:
1、百度地图和定位是分开的jar包和库文件,需要分别下载;
2、定位必须要和监听类一起使用;
3、百度地图API和定位API现在是分开独立的,但是百度地图中提供定位图层,若要显示定位信息,必须引用次图层。
下面是Acitivity的完整代码:
1 package cn.newtouch.map; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.Toast; 9 10 import com.baidu.location.BDLocation; 11 import com.baidu.location.BDLocationListener; 12 import com.baidu.location.LocationClient; 13 import com.baidu.location.LocationClientOption; 14 import com.baidu.mapapi.BMapManager; 15 import com.baidu.mapapi.map.LocationData; 16 import com.baidu.mapapi.map.MapController; 17 import com.baidu.mapapi.map.MapView; 18 import com.baidu.mapapi.map.MyLocationOverlay; 19 import com.baidu.platform.comapi.basestruct.GeoPoint; 20 21 public class MapActivity extends Activity { 22 // 地图相关 23 private BMapManager mMapManager = null; 24 private MapView mMapView = null; 25 private MapController controller = null; 26 // 定位相关 27 private LocationClient mLocation = null; 28 private LocationData mData = null; 29 // 定位图层 30 private LocationOverlay mLocationOverlay = null; 31 public MyLocationListener mLocationListener = new MyLocationListener(); 32 33 // 手动定位请求 34 private boolean manualRequest = false; 35 36 // 手动定位按钮 37 private static Button locationBtn = null; 38 39 @Override 40 protected void onCreate(Bundle savedInstanceState) { 41 super.onCreate(savedInstanceState); 42 /* 1、绑定地图 */ 43 mMapManager = new BMapManager(getApplication()); 44 mMapManager.init("你的key", null); 45 setContentView(R.layout.activity_map); 46 47 mMapView = (MapView) this.findViewById(R.id.baiduMap); 48 // 启用缩放控件 49 mMapView.setBuiltInZoomControls(true); 50 51 // 得到MapView的控制权,可以用它控制和驱动平移和缩放 52 controller = mMapView.getController(); 53 // 用给定的经纬度构造一个GeoPoint,单位是微度(度*1E6) 54 // GeoPoint point = new GeoPoint((int) (31.223872 * 1E6), 55 // (int) (121.538746 * 1E6)); 56 57 // controller.setCenter(point); 58 controller.setZoom(14); 59 controller.enableClick(true); 60 61 /* 2、定位 获取坐标 */ 62 63 // 定位初始化 64 mLocation = new LocationClient(this); 65 mLocation.registerLocationListener(mLocationListener); 66 67 // 定位的选项 68 LocationClientOption option = new LocationClientOption(); 69 option.setProdName("你的应用名称"); 70 // 优先网络定位 71 option.setPriority(LocationClientOption.NetWorkFirst); 72 option.setCoorType("bd09ll"); 73 option.setScanSpan(10 * 1000); 74 mLocation.setLocOption(option); 75 mLocation.start(); 76 77 /* 3、将坐标绑定在定位图层上 */ 78 79 // 初始化定位图层 80 mLocationOverlay = new LocationOverlay(mMapView); 81 mData = new LocationData(); 82 mData.latitude = 31.223829; 83 mData.longitude = 121.538746; 84 mLocationOverlay.setData(mData); 85 86 // 在地图上添加,定位图层 87 mMapView.getOverlays().add(mLocationOverlay); 88 mLocationOverlay.enableCompass(); 89 90 mMapView.refresh(); 91 92 locationBtn = (Button) this.findViewById(R.id.locationBtn); 93 locationBtn.setOnClickListener(new OnClickListener() { 94 @Override 95 public void onClick(View v) { 96 locationNow(); 97 } 98 99 }); 100 } 101 102 @Override 103 protected void onDestroy() { 104 mMapView.destroy(); 105 if (mMapManager != null) { 106 mMapManager.destroy(); 107 mMapManager = null; 108 } 109 super.onDestroy(); 110 } 111 112 @Override 113 protected void onPause() { 114 mMapView.onPause(); 115 if (mMapManager != null) { 116 mMapManager.stop(); 117 } 118 super.onPause(); 119 } 120 121 @Override 122 protected void onResume() { 123 mMapView.onResume(); 124 if (mMapManager != null) { 125 mMapManager.start(); 126 } 127 super.onResume(); 128 } 129 130 /** 131 * 手动定位请求 132 **/ 133 private void locationNow() { 134 manualRequest = true; 135 mLocation.requestLocation(); 136 System.out.println("---- " + mLocation.requestLocation()); 137 Toast.makeText(this, "locating ...", Toast.LENGTH_SHORT).show(); 138 } 139 140 /** 141 * 定位监类,定位时需要调用 142 **/ 143 class MyLocationListener implements BDLocationListener { 144 @Override 145 public void onReceiveLocation(BDLocation location) { 146 if (mLocation == null) { 147 return; 148 } else { 149 mData.longitude = location.getLongitude(); 150 mData.latitude = location.getLatitude(); 151 mData.accuracy = location.getRadius(); 152 mData.direction = location.getDerect(); 153 154 System.out.println(mData.longitude + "," + mData.latitude); 155 mLocationOverlay.setData(mData); 156 mMapView.refresh(); 157 158 // 定位时移到定位点 159 if (manualRequest) { 160 controller.animateTo(new GeoPoint((int)(mData.latitude* 1e6), (int)(mData.longitude * 1e6))); 161 manualRequest = false; 162 } 163 } 164 } 165 166 @Override 167 public void onReceivePoi(BDLocation arg0) { 168 169 } 170 } 171 172 /** 173 * 定义定位图层 174 **/ 175 class LocationOverlay extends MyLocationOverlay { 176 177 public LocationOverlay(MapView mapView) { 178 super(mapView); 179 } 180 181 // 重写点击事件 182 @Override 183 protected boolean dispatchTap() { 184 Toast.makeText(MapActivity.this, "I've touch the map lay", 185 Toast.LENGTH_SHORT).show(); 186 return true; 187 } 188 189 } 190 191 }

浙公网安备 33010602011771号