本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/16898023 本系列百度地图开发是基于Android定位SDKv4.0Android SDK v2.3.0

1.AndroidManifest.xml文件配置

在application标签中声明service组件,为了避免多个app公用1个service出现的权限问题,新版本各个app单独拥有自己的定位service.

2.定位过程

(1).实例化LocationClient

{//Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的contextmLocationClient = new LocationClient(getApplicationContext());mLocationClient.setAK("我的密钥");//写入密钥//注册监听函数mLocationClient.registerLocationListener( myListener ); }

(2).实现BDLocationListener接口

public class MyLocationListener implements BDLocationListener {    @Override    public void onReceiveLocation(BDLocation location) {    /*     * mLocClient.requestLocation();执行后,前提client已经开启     */    if (location == null)    return;    if (location.getLocType() == BDLocation.TypeGpsLocation){//卫星定位    location.getSpeed();    location.getSatelliteNumber();    } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){//网络定位    location.getAddrStr();//LocationClientOption.setAddrType("all");需要设置    }    }    public void onReceivePoi(BDLocation poiLocation) {    /*     * mLocClient.requestPoi();执行后,前提client已经开启     */    if (poiLocation == null){    return ;    }    poiLocation.getTime();    poiLocation.getLocType();    poiLocation.getLatitude();    poiLocation.getLongitude();    poiLocation.getRadius();    if (poiLocation.getLocType() == BDLocation.TypeGpsLocation){//卫星定位    poiLocation.getSpeed();    poiLocation.getSatelliteNumber();    } else if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation){//网络定位    poiLocation.getAddrStr();//LocationClientOption.setAddrType("all");需要设置    }    }}

(3).设置定位参数

LocationClientOption option = new LocationClientOption();option.setOpenGps(true);//打开GPS/* * 返回的定位结果包含地址信息, 如果不设置,location.getAddrStr();返回为null */option.setAddrType("all");option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02option.setScanSpan(1000 * 60);//设置发起定位请求的间隔时间option.disableCache(true);//禁止启用缓存定位option.setPoiNumber(5);//最多返回POI个数option.setPoiDistance(1000); //poi查询距离option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息mClient.setLocOption(getClientOptions());

(4).发起定位请求

/** * 在请求定位之前应该确定mCLient已经启动 */if (mClient != null && mClient.isStarted())mClient.requestLocation();//onReceiveLocation();将得到定位数据else{}
// 发起POI查询请求if (mClient != null && mClient.isStarted())mClient.requestPoi();//onReceivePoi();将得到定位数据else{}

3.MyLocationOverlay覆盖物

// MyLocationOverlay实例化locationOverlay = new MyLocationOverlay(mMapView);locationOverlay.enableCompass();locationData = new LocationData();// 设置定位数据locationOverlay.setData(locationData);// 设置中心图片// locationOverlay.setMarker(getResources().getDrawable(R.drawable.ic_launcher));// 设置定位的模式(NORMAL, FOLLOWING,COMPASS )三种 locationOverlay.setLocationMode(LocationMode.FOLLOWING);// 添加定位图层mMapView.getOverlays().add(locationOverlay);// 修改定位数据后刷新图层生效mMapView.refresh();
如果想处理MyLocationOverlay的tap时间,必须覆写dispatchTap()方法,但是mMapController.enableClick(true)

/** * 覆写MyLocationOverlay,处理Tap(简单的click)事件 * */private class LocationOverlay extends MyLocationOverlay {public LocationOverlay(MapView mapView) {super(mapView);}@Overrideprotected boolean dispatchTap() {/* * click事件的处理,如果想处理事件必须,mMapController.enableClick(true); * 否则无响应 */Toast.makeText(getApplicationContext(), "click~~", 0).show();return true;}}

4.定位实例

/** *  * @author zimo * @see http://blog.csdn.net/zimo2013 */public class LocationProvider {private static final String TAG = "LocationProvider";private LocationClient mClient;private BDLocationListener mListener;public LocationProvider(Context context){mClient = new LocationClient(context);//配置密钥keymClient.setAK("我的密钥");//配置定位参数信息    mClient.setLocOption(getClientOptions());}/** * 请求开始定位 */public void start(){if(mListener == null){LogUtil.e(TAG, "请在调用start()之前,先调用setLocationListener设定监听器");return;}if(!mClient.isStarted()){LogUtil.i(TAG, "定位开启!");mClient.start();}mClient.requestLocation();}public void stop(){if(mClient.isStarted()){LogUtil.i(TAG, "定位关闭!");mClient.stop();}}public void setLocationListener(BDLocationListener l){mListener = l;mClient.registerLocationListener(l);}private LocationClientOption getClientOptions(){LocationClientOption option = new LocationClientOption();    option.setOpenGps(true);//打开GPS    /*     * 返回的定位结果包含地址信息, 如果不设置,location.getAddrStr();返回为null     */    option.setAddrType("all");    option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02    option.setScanSpan(1000 * 60);//设置发起定位请求的间隔时间    option.disableCache(true);//禁止启用缓存定位    option.setPoiNumber(5);//最多返回POI个数    option.setPoiDistance(1000); //poi查询距离    option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息    return option;}}
public class MainActivity extends Activity implements BDLocationListener {BMapManager mBMapMan = null;MapView mMapView = null;LocationClient client;LocationData locationData;MyLocationOverlay locationOverlay;MapController mMapController;LocationProvider provider;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBMapMan = new BMapManager(getApplication());mBMapMan.init("647a2e8859989d9d6e1e6d5db525e177", null);// 注意:请在试用setContentView前初始化BMapManager对象,否则会报错setContentView(R.layout.activity_main);mMapView = (MapView) findViewById(R.id.bmapsView);mMapView.setBuiltInZoomControls(true);mMapController = mMapView.getController();// 设置启用内置的缩放控件mMapController.setZoom(14);// 得到mMapView的控制权,可以用它控制和驱动平移和缩放GeoPoint point = new GeoPoint((int) (39.915 * 1E6),(int) (116.404 * 1E6));// 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)mMapController.setCenter(point);// 设置地图中心点mMapController.setZoom(14);// 设置地图zoom级别locationData = new LocationData();locationOverlay = new MyLocationOverlay(mMapView);// 设置定位数据locationOverlay.setData(locationData);// 添加定位图层mMapView.getOverlays().add(locationOverlay);locationOverlay.enableCompass();// 修改定位数据后刷新图层生效mMapView.refresh();}public void click(View view) {//click button请求定位provider = new LocationProvider(getApplicationContext());provider.setLocationListener(this);provider.start();//开始定位}@Overridepublic void onReceiveLocation(BDLocation location) {locationData.latitude = location.getLatitude();locationData.longitude = location.getLongitude();// 如果不显示定位精度圈,将accuracy赋值为0即可locationData.accuracy = location.getRadius();// 此处可以设置 locData的方向信息, 如果定位 SDK 未返回方向信息,用户可以自己实现罗盘功能添加方向信息。locationData.direction = location.getDerect();// 更新定位数据locationOverlay.setData(locationData);// 更新图层数据执行刷新后生效mMapView.refresh();Toast.makeText(getApplicationContext(), location.getAddrStr(), 1).show();mMapController.animateTo(new GeoPoint((int) (locationData.latitude * 1e6),(int) (locationData.longitude * 1e6)));}@Overridepublic void onReceivePoi(BDLocation location) {}@Overrideprotected void onResume() {mMapView.onResume();if (mBMapMan != null) {mBMapMan.start();}super.onResume();}@Overrideprotected void onPause() {mMapView.onPause();if (mBMapMan != null) {mBMapMan.stop();}//如果没有必要,应该停止定位if(provider != null){provider.stop();provider = null;}super.onPause();}@Overrideprotected void onDestroy() {mMapView.destroy();if (mBMapMan != null) {mBMapMan.destroy();mBMapMan = null;}super.onDestroy();}}

更多相关文章

  1. [转]SimpleCursorAdapter类与数据绑定
  2. Android音视频 - Camera+AudioRecord采集数据
  3. 抖音数据采集教程,Android群控黑盒调用,Sekiro使用手册
  4. [Android]使用Spring for Android改善数据交互流程
  5. 打造android ORM框架opendroid(七)——数据库升级方案
  6. Android数据通信--USB通信的几种方式及使用场景

随机推荐

  1. Solr1.4+Nutch1.2构建分布式搜索服务
  2. Linux 设置Redis开机启动
  3. linux 用户和组操作
  4. 搭建linux服务器并部署java web项目(CentO
  5. vs code远程编辑文件
  6. 用另外两个文件过滤一个文件
  7. Mono、asp.net c#和MVC How to和教程
  8. Linux 命令行快捷键
  9. 如何从PHP的mail()失败中获取额外的错误信
  10. 如何使用sed删除特殊字符