Android使用百度地图结合GPS进行定位

jopen 10年前

本文在上文基础上加入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" />

布局文件也和上文完全一样。
附上图片效果:

d2.jpeg

来自:http://blog.csdn.net/u010142437/article/details/10567667