首页 > 代码库 > 开发百度地图之实现
开发百度地图之实现
在地图上标记用户当前所处位置其实是一个GPS定位应用。首先通过GPS定位获取到用户当前所在位置的经纬度,再将该经纬度所代表的点在地图上标出来。其实除了在地图上标注自己所处的位置外,我们通常还有这样的需求:“如果我的位置发生改变,要能够实时在地图上体现出来”。
新建项目baidumaplocation.设计main.xml文件这里注意的是MapView控件必须使用来自百度库封装好的com.baidu.mapapi.MapView 。设计代码如下:
Xml代码 [url=]
[/url]
1.<?xml version="1.0" encoding="utf-8"?> 2.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. android:layout_width="fill_parent" 4. android:layout_height="fill_parent" 5. android:orientation="vertical" > 6. <FrameLayout 7. android:id="@+id/map_layout" 8. android:layout_width="fill_parent" 9. android:layout_height="fill_parent" 10. android:orientation="vertical" > 11. <!-- 百度MapView控件 --> 12. <com.baidu.mapapi.MapView 13. android:id="@+id/map_view" 14. android:layout_width="fill_parent" 15. android:layout_height="fill_parent" 16. android:apiKey="0Mg_koWoyZUiYLfZxmPfp4LKInB5LqTnagYueaw" 17. android:clickable="true" 18. android:enabled="true" /> 19. <LinearLayout 20. android:layout_width="wrap_content" 21. android:layout_height="wrap_content" 22. android:layout_gravity="center" 23. android:orientation="vertical" 24. android:paddingBottom="105dip" > 25. <!-- 地址信息显示TextView --> 26. <TextView 27. android:id="@+id/map_bubbleText" 28. android:layout_width="wrap_content" 29. android:layout_height="wrap_content" 30. android:background="@drawable/location_tips" 31. android:gravity="left|center" 32. android:maxEms="12" 33. android:paddingLeft="12dip" 34. android:paddingRight="10dip" 35. android:text="@string/load_tips" 36. android:textColor="#cfcfcf" 37. android:textSize="14sp" /> 38. </LinearLayout> 39. <LinearLayout 40. android:layout_width="wrap_content" 41. android:layout_height="wrap_content" 42. android:layout_gravity="center" 43. android:orientation="vertical" > 44. <!-- 位置指标显示ImageView --> 45. <ImageView 46. android:id="@+id/point_image" 47. android:layout_width="wrap_content" 48. android:layout_height="wrap_content" 49. android:layout_gravity="center" 50. android:layout_marginBottom="30dip" 51. android:src="http://www.mamicode.com/@drawable/point_start" /> 52. </LinearLayout> 53. </FrameLayout> 54.</LinearLayout>
三:创建覆盖整个地图捕捉触控事件的MyMapOverlay继承Overlay
Java代码 [url=]
[/url]
1.import android.view.MotionEvent; 2.import com.baidu.mapapi.GeoPoint; 3.import com.baidu.mapapi.MapView; 4.import com.baidu.mapapi.Overlay; 5.//覆盖整个地图捕捉触控事件的OverLay 6.public abstract class MyMapOverlay extends Overlay{ 7.private int point_X; 8.private int point_Y; 9.private GeoPoint newPoint; 10.public MyMapOverlay(int x,int y){ 11.point_X = x; 12.point_Y = y; 13.} 14.boolean flagMove=false; 15.//这里实现根据地图移动时重新获取屏幕中心点的经纬度坐标 16. @Override 17. public boolean onTouchEvent(MotionEvent event, MapView mapView) { 18. System.out.println("X->"+event.getX()+":"+point_X); 19. System.out.println("Y->"+event.getY()+":"+point_Y); 20. if(event.getAction() == MotionEvent.ACTION_DOWN){ 21. changePoint(newPoint,1); 22. }else if(event.getAction() == MotionEvent.ACTION_UP){ 23. newPoint = mapView.getProjection().fromPixels(point_X,point_Y); 24. changePoint(newPoint,2); 25. } 26. return false; 27. } 28. 29. public abstract void changePoint(GeoPoint newPoint,int type); 30.}
四:LocationActivity类继承百度库的MapActivity以及实现LocationListener接口,代码如下: package com.location.activity;Java代码 [url=]
[/url]
1.import java.io.IOException; 2.import java.util.List; 3.import java.util.Locale; 4. 5.import android.content.Intent; 6.import android.location.Address; 7.import android.location.Geocoder; 8.import android.location.Location; 9.import android.os.Bundle; 10.import android.os.Handler; 11.import android.os.Message; 12.import android.view.View; 13.import android.view.Window; 14.import android.widget.TextView; 15. 16.import com.android.map.MyMapOverlay; 17.import com.baidu.mapapi.BMapManager; 18.import com.baidu.mapapi.GeoPoint; 19.import com.baidu.mapapi.LocationListener; 20.import com.baidu.mapapi.MKAddrInfo; 21.import com.baidu.mapapi.MKBusLineResult; 22.import com.baidu.mapapi.MKDrivingRouteResult; 23.import com.baidu.mapapi.MKLocationManager; 24.import com.baidu.mapapi.MKPoiResult; 25.import com.baidu.mapapi.MKSearch; 26.import com.baidu.mapapi.MKSearchListener; 27.import com.baidu.mapapi.MKSuggestionResult; 28.import com.baidu.mapapi.MKTransitRouteResult; 29.import com.baidu.mapapi.MKWalkingRouteResult; 30.import com.baidu.mapapi.MapActivity; 31.import com.baidu.mapapi.MapController; 32.import com.baidu.mapapi.MapView; 33.import com.baidu.mapapi.Overlay; 34. 35.public class LocationActivity extends MapActivity implements LocationListener { 36. 37. private MapView mapView; 38. private MapController mMapCtrl; 39. private List<Overlay> mapOverlays; 40. public GeoPoint locPoint; 41. private MyMapOverlay mOverlay; 42. private TextView desText; 43. private String lost_tips; 44. private int point_X; 45. private int point_Y; 46. 47. public final int MSG_VIEW_LONGPRESS = 10001; 48. public final int MSG_VIEW_ADDRESSNAME = 10002; 49. public final int MSG_GONE_ADDRESSNAME = 10003; 50. private Intent mIntent; 51. private int mLatitude; 52. private int mLongitude; 53. private String name; 54. private BMapManager mapManager; 55. private MKLocationManager mLocationManager = null; 56. private boolean isLoadAdrr = true; 57. private MKSearch mMKSearch; 58. 59. @Override 60. public void onCreate(Bundle savedInstanceState) { 61. super.onCreate(savedInstanceState); 62. requestWindowFeature(Window.FEATURE_NO_TITLE); 63. setContentView(R.layout.main); 64. initMap(); 65. mIntent = getIntent(); 66. mLatitude = mIntent.getIntExtra("latitude", 0); 67. mLongitude = mIntent.getIntExtra("longitude", 0); 68. name = mIntent.getStringExtra("name"); 69. mapView = (MapView) findViewById(R.id.map_view); 70. desText = (TextView) this.findViewById(R.id.map_bubbleText); 71. lost_tips = getResources().getString(R.string.load_tips); 72. if (mLatitude != 0 && mLongitude != 0) { 73. locPoint = new GeoPoint((int) (mLatitude * 1E6), 74. (int) (mLongitude * 1E6)); 75. desText.setText(name); 76. } 77. mapView.setBuiltInZoomControls(true); 78. mapView.setClickable(true); 79. mMapCtrl = mapView.getController(); 80. point_X = this.getWindowManager().getDefaultDisplay().getWidth() / 2; 81. point_Y = this.getWindowManager().getDefaultDisplay().getHeight() / 2; 82. mOverlay = new MyMapOverlay(point_X, point_Y) { 83. @Override 84. public void changePoint(GeoPoint newPoint, int type) { 85. if (type == 1) { 86. mHandler.sendEmptyMessage(MSG_GONE_ADDRESSNAME); 87. } else { 88. locPoint = newPoint; 89. mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS); 90. } 91. 92. } 93. }; 94. mapOverlays = mapView.getOverlays(); 95. if (mapOverlays.size() > 0) { 96. mapOverlays.clear(); 97. } 98. mapOverlays.add(mOverlay); 99. mMapCtrl.setZoom(20); 100. 101. } 102. 103. private void initMap() { 104. 105. // 初始化MapActivity 106. mapManager = new BMapManager(getApplication()); 107. // init方法的第一个参数需填入申请的API Key 108. mapManager.init("C66C0501D0280744759A6957C42543AE38F5D540", null); 109. super.initMapActivity(mapManager); 110. // 实例化搜索地址类 111. mMKSearch = new MKSearch(); 112. // 初始化搜索地址实例 113. mMKSearch.init(mapManager, new MySearchListener()); 114. mLocationManager = mapManager.getLocationManager(); 115. // 注册位置更新事件 116. mLocationManager.requestLocationUpdates(this); 117. // 使用GPS定位 118. mLocationManager 119. .enableProvider((int) MKLocationManager.MK_GPS_PROVIDER); 120. } 121. 122. @Override 123. protected void onResume() { 124. if (mapManager != null) { 125. mapManager.start(); 126. } 127. super.onResume(); 128. 129. } 130. 131. @Override 132. protected void onPause() { 133. isLoadAdrr = false; 134. if (mapManager != null) { 135. mapManager.stop(); 136. } 137. super.onPause(); 138. } 139. 140. @Override 141. protected boolean isRouteDisplayed() { 142. // TODO Auto-generated method stub 143. return false; 144. } 145. 146. 147. /** 148. * 通过经纬度获取地址 149. * 150. * @param point 151. * @return 152. */ 153. private String getLocationAddress(GeoPoint point) { 154. String add = ""; 155. Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault()); 156. try { 157. List<Address> addresses = geoCoder.getFromLocation( 158. point.getLatitudeE6() / 1E6, point.getLongitudeE6() / 1E6, 159. 1); 160. Address address = addresses.get(0); 161. int maxLine = address.getMaxAddressLineIndex(); 162. if (maxLine >= 2) { 163. add = address.getAddressLine(1) + address.getAddressLine(2); 164. } else { 165. add = address.getAddressLine(1); 166. } 167. } catch (IOException e) { 168. add = ""; 169. e.printStackTrace(); 170. } 171. return add; 172. } 173. 174. 175. private Handler mHandler = new Handler() { 176. @Override 177. public void handleMessage(Message msg) { 178. switch (msg.what) { 179. case MSG_VIEW_LONGPRESS:// 处理长按时间返回位置信息 180. { 181. if (null == locPoint) 182. return; 183. mMKSearch.reverseGeocode(locPoint); 184. desText.setVisibility(View.VISIBLE); 185. desText.setText(lost_tips); 186. mMapCtrl.animateTo(locPoint); 187. mapView.invalidate(); 188. } 189. break; 190. case MSG_VIEW_ADDRESSNAME: 191. desText.setText((String) msg.obj); 192. desText.setVisibility(View.VISIBLE); 193. break; 194. case MSG_GONE_ADDRESSNAME: 195. desText.setVisibility(View.GONE); 196. break; 197. } 198. } 199. }; 200. 201. // 关闭程序也关闭定位 202. @Override 203. protected void onDestroy() { 204. if (mapManager != null) { 205. mapManager.destroy(); 206. mapManager = null; 207. } 208. super.onDestroy(); 209. } 210. 211. /** 212. * 根据MyLocationOverlay配置的属性确定是否在地图上显示当前位置 213. */ 214. @Override 215. protected boolean isLocationDisplayed() { 216. return false; 217. } 218. 219. /** 220. * 当位置发生变化时触发此方法 221. * 222. * @param location 223. * 当前位置 224. */ 225. public void onLocationChanged(Location location) { 226. if (location != null) { 227. locPoint = new GeoPoint((int) (location.getLatitude()* 1E6), 228. (int) (location.getLongitude()* 1E6)); 229. mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS); 230. } 231. } 232. 233. /** 234. * 内部类实现MKSearchListener接口,用于实现异步搜索服务 235. * 236. * @author liufeng 237. */ 238. public class MySearchListener implements MKSearchListener { 239. /** 240. * 根据经纬度搜索地址信息结果 241. * 242. * @param result 243. * 搜索结果 244. * @param iError 245. * 错误号(0表示正确返回) 246. */ 247. public void onGetAddrResult(MKAddrInfo result, int iError) { 248. if (result == null) { 249. return; 250. } 251. Message msg = new Message(); 252. msg.what = MSG_VIEW_ADDRESSNAME; 253. msg.obj = result.strAddr; 254. mHandler.sendMessage(msg); 255. 256. } 257. 258. /** 259. * 驾车路线搜索结果 260. * 261. * @param result 262. * 搜索结果 263. * @param iError 264. * 错误号(0表示正确返回) 265. */ 266. public void onGetDrivingRouteResult(MKDrivingRouteResult result, 267. int iError) { 268. } 269. 270. /** 271. * POI搜索结果(范围检索、城市POI检索、周边检索) 272. * 273. * @param result 274. * 搜索结果 275. * @param type 276. * 返回结果类型(11,12,21:poi列表 7:城市列表) 277. * @param iError 278. * 错误号(0表示正确返回) 279. */ 280. public void onGetPoiResult(MKPoiResult result, int type, int iError) { 281. } 282. 283. /** 284. * 公交换乘路线搜索结果 285. * 286. * @param result 287. * 搜索结果 288. * @param iError 289. * 错误号(0表示正确返回) 290. */ 291. public void onGetTransitRouteResult(MKTransitRouteResult result, 292. int iError) { 293. } 294. 295. /** 296. * 步行路线搜索结果 297. * 298. * @param result 299. * 搜索结果 300. * @param iError 301. * 错误号(0表示正确返回) 302. */ 303. public void onGetWalkingRouteResult(MKWalkingRouteResult result, 304. int iError) { 305. } 306. 307. public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { 308. // TODO Auto-generated method stub 309. 310. } 311. 312. public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) { 313. // TODO Auto-generated method stub 314. 315. } 316. } 317. 318.}
五:在AndroidManifest.xml住添加相关的访问权限
<!-- 访问网络的权限 --> Xml代码 [url=]
[/url]
1. <uses-permission android:name="android.permission.INTERNET" /> 2. <!-- 访问精确位置的权限 --> 3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 4. <!-- 访问网络状态的权限 --> 5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 6. <!-- 访问WIFI网络状态的权限 --> 7. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 8. <!-- 改变WIFI网络状态的权限 --> 9. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 10. <!-- 读写存储卡的权限 --> 11. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 12. <!-- 读取电话状态的权限 --> 13.<uses-permission android:name="android.permission.READ_PHONE_STATE" />