开发百度地图之实现

在地图上标记用户当前所处位置其实是一个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="@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" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值