Android使用百度地圖結合GPS進行定位
本文在上文基礎上加入GPS定位功能,實現實時定位,代碼如下:
Activity:
package com.home; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; 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.platform.comapi.basestruct.GeoPoint; public class LocationActivity extends Activity { /** 定義LocationManager對象 */ private LocationManager locationManager; /** 定義當前Location對象 */ private Location currentLocation; /** 顯示地圖的View */ private MapView mMapView = null; /** * 用MapController完成地圖控制 */ private MapController mMapController = null; /** * MKMapViewListener 用于處理地圖事件回調 */ MKMapViewListener mMapListener = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** * 使用地圖sdk前需先初始化BMapManager. BMapManager是全局的,可為多個MapView共用,它需要地圖模塊創建前創建, * 并在地圖地圖模塊銷毀后銷毀,只要還有地圖模塊在使用,BMapManager就不應該銷毀 */ DemoApplication app = (DemoApplication) this.getApplication(); if (app.mBMapManager == null) { app.mBMapManager = new BMapManager(this); /** * 如果BMapManager沒有初始化則初始化BMapManager */ app.mBMapManager.init(DemoApplication.strKey, new DemoApplication.MyGeneralListener()); } setContentView(R.layout.main); init(); } /** * 初始化 */ private void init() { // 獲取系統LocationManager服務 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // // 從GPS獲取最近的定位信息 currentLocation = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); // 綁定監聽,有4個參數 // 參數1,設備:有GPS_PROVIDER和NETWORK_PROVIDER兩種 // 參數2,位置信息更新周期,單位毫秒 // 參數3,位置變化最小距離:當位置距離變化超過此值時,將更新位置信息 // 參數4,監聽 // 備注:對于參數2和3:若參數3不為0,則以參數3為準;若參數3為0,則通過時間來定時更新;兩者為0,則隨時刷新 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2, 1, new LocationListener() { @Override public void onLocationChanged(Location location) { updateMap(location); } @Override public void onProviderDisabled(String provider) { updateMap(null); } @Override public void onProviderEnabled(String provider) { updateMap(locationManager .getLastKnownLocation(provider)); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } }); initMap(); } /** * 初始化地圖 */ private void initMap() { mMapView = (MapView) findViewById(R.id.main_bmapView); /** * 獲取地圖控制器 */ mMapController = mMapView.getController(); /** * 設置地圖是否響應點擊事件 . */ mMapController.enableClick(true); /** * 設置地圖縮放級別 */ mMapController.setZoom(12); double cLat = 39.945; double cLon = 116.404; // 如果未能定位則設置默認中心點為天安門 GeoPoint p = new GeoPoint((int) (cLat * 1E6), (int) (cLon * 1E6)); mMapController.setCenter(p); updateMap(currentLocation); mMapListener = new MKMapViewListener() { @Override public void onMapMoveFinish() { /** * 在此處理地圖移動完成回調 縮放,平移等操作完成后,此回調被觸發 */ } @Override public void onClickMapPoi(MapPoi mapPoiInfo) { /** * 在此處理底圖poi點擊事件 顯示底圖poi名稱并移動至該點 設置過: * mMapController.enableClick(true); 時,此回調才能被觸發 * */ String title = ""; if (mapPoiInfo != null) { title = mapPoiInfo.strText; Toast.makeText(LocationActivity.this, title, Toast.LENGTH_SHORT).show(); mMapController.animateTo(mapPoiInfo.geoPt); } } @Override public void onGetCurrentMap(Bitmap b) { /** * 當調用過 mMapView.getCurrentMap()后,此回調會被觸發 可在此保存截圖至存儲設備 */ } @Override public void onMapAnimationFinish() { /** * 地圖完成帶動畫的操作(如: animationTo())后,此回調被觸發 */ } /** * 在此處理地圖加載完成事件 */ @Override public void onMapLoadFinish() { Toast.makeText(LocationActivity.this, "地圖加載完成", Toast.LENGTH_SHORT).show(); } }; mMapView.regMapViewListener(DemoApplication.getInstance().mBMapManager, mMapListener); } @Override protected void onPause() { /** * MapView的生命周期與Activity同步,當activity掛起時需調用MapView.onPause() */ mMapView.onPause(); super.onPause(); } @Override protected void onResume() { /** * MapView的生命周期與Activity同步,當activity恢復時需調用MapView.onResume() */ mMapView.onResume(); super.onResume(); } @Override protected void onDestroy() { /** * MapView的生命周期與Activity同步,當activity銷毀時需調用MapView.destroy() */ mMapView.destroy(); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mMapView.onRestoreInstanceState(savedInstanceState); } /** * 更新地圖 */ private void updateMap(Location location) { if (location != null) { // 緯度 double latitude = location.getLatitude(); // 經度 double longitude = location.getLongitude(); GeoPoint p = new GeoPoint((int) (latitude * 1E6), (int) (longitude * 1E6)); mMapController.setCenter(p); } } }
Application類與上文完全一樣。
Manifest里面比上文多加一個如下權限:
<!-- 使用GPS需要的權限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
布局文件也和上文完全一樣。
附上圖片效果:
來自:http://blog.csdn.net/u010142437/article/details/10567667
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!