Android_百度地图BaiduMap_LocationClient本地定位

本文详细介绍如何使用百度地图SDK v4.0进行Android本地定位,包括AndroidManifest.xml文件配置、定位过程实现、MyLocationOverlay覆盖物定位实例等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        Android_百度地图BaiduMap_LocationClient本地定位       

        分类:            百度地图Android基础 1894人阅读 评论(0) 收藏 举报
本系列百度地图开发是基于Android定位SDKv4.0Android SDK v2.3.0

1.AndroidManifest.xml文件配置

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

  1. <!-- com.baidu.location.f 为百度定位的服务 --> 
  2. <service 
  3.     android:name="com.baidu.location.f" 
  4.     android:enabled="true" 
  5.     android:process=":remote" > 
  6. </service> 
<!-- com.baidu.location.f 为百度定位的服务 -->
<service
    android:name="com.baidu.location.f"
    android:enabled="true"
    android:process=":remote" >
</service>

  1. <!-- 需要出示的权限 --> 
  2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
  3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
  4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
  5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
  6. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 
  7. <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
  8. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
  9. <uses-permission android:name="android.permission.INTERNET" /> 
  10. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
  11. <uses-permission android:name="android.permission.READ_LOGS"/> 
<!-- 需要出示的权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.READ_LOGS"/>

2.定位过程

(1).实例化LocationClient

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

(2).实现BDLocationListener接口

  1. public class MyLocationListener implements BDLocationListener { 
  2.     @Override 
  3.     public void onReceiveLocation(BDLocation location) { 
  4.         /*
  5.          * mLocClient.requestLocation();执行后,前提client已经开启
  6.          */ 
  7.         if (location == null
  8.             return
  9.         if (location.getLocType() == BDLocation.TypeGpsLocation){//卫星定位 
  10.             location.getSpeed(); 
  11.             location.getSatelliteNumber(); 
  12.         } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){//网络定位 
  13.             location.getAddrStr();//LocationClientOption.setAddrType("all");需要设置 
  14.         } 
  15.     } 
  16.     public void onReceivePoi(BDLocation poiLocation) { 
  17.         /*
  18.          * mLocClient.requestPoi();执行后,前提client已经开启
  19.          */ 
  20.         if (poiLocation == null){ 
  21.         return
  22.         } 
  23.         poiLocation.getTime(); 
  24.         poiLocation.getLocType(); 
  25.         poiLocation.getLatitude(); 
  26.         poiLocation.getLongitude(); 
  27.         poiLocation.getRadius(); 
  28.         if (poiLocation.getLocType() == BDLocation.TypeGpsLocation){//卫星定位 
  29.             poiLocation.getSpeed(); 
  30.             poiLocation.getSatelliteNumber(); 
  31.         } else if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation){//网络定位 
  32.             poiLocation.getAddrStr();//LocationClientOption.setAddrType("all");需要设置 
  33.         } 
  34.     } 
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).设置定位参数

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

(4).发起定位请求

  1. /**
  2. * 在请求定位之前应该确定mCLient已经启动
  3. */ 
  4. if (mClient != null && mClient.isStarted()) 
  5.     mClient.requestLocation(); 
  6.     //onReceiveLocation();将得到定位数据 
  7. else
  8.  
/**
 * 在请求定位之前应该确定mCLient已经启动
 */
if (mClient != null && mClient.isStarted())
	mClient.requestLocation();
	//onReceiveLocation();将得到定位数据
else{

}
  1. // 发起POI查询请求 
  2. if (mClient != null && mClient.isStarted()) 
  3.     mClient.requestPoi(); 
  4.     //onReceivePoi();将得到定位数据 
  5. else
  6.  
// 发起POI查询请求
if (mClient != null && mClient.isStarted())
	mClient.requestPoi();
	//onReceivePoi();将得到定位数据
else{

}

3.MyLocationOverlay覆盖物

  1. // MyLocationOverlay实例化 
  2. locationOverlay = new MyLocationOverlay(mMapView); 
  3. locationOverlay.enableCompass(); 
  4. locationData = new LocationData(); 
  5. // 设置定位数据 
  6. locationOverlay.setData(locationData); 
  7. // 设置中心图片 
  8. // locationOverlay.setMarker(getResources().getDrawable(R.drawable.ic_launcher)); 
  9. // 设置定位的模式(NORMAL, FOLLOWING,COMPASS )三种 
  10. locationOverlay.setLocationMode(LocationMode.FOLLOWING); 
  11.  
  12. // 添加定位图层 
  13. mMapView.getOverlays().add(locationOverlay); 
  14. // 修改定位数据后刷新图层生效 
  15. mMapView.refresh(); 
// 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)

  1. /**
  2. * 覆写MyLocationOverlay,处理Tap(简单的click)事件
  3. *
  4. */ 
  5. private class LocationOverlay extends MyLocationOverlay { 
  6.  
  7.     public LocationOverlay(MapView mapView) { 
  8.         super(mapView); 
  9.     } 
  10.  
  11.     @Override 
  12.     protected boolean dispatchTap() { 
  13.         /*
  14.          * click事件的处理,如果想处理事件必须,mMapController.enableClick(true);
  15.          * 否则无响应
  16.          */ 
  17.         Toast.makeText(getApplicationContext(), "click~~", 0).show(); 
  18.         return true
  19.     } 
  20.  
/**
 * 覆写MyLocationOverlay,处理Tap(简单的click)事件
 *
 */
private class LocationOverlay extends MyLocationOverlay {

	public LocationOverlay(MapView mapView) {
		super(mapView);
	}

	@Override
	protected boolean dispatchTap() {
		/*
		 * click事件的处理,如果想处理事件必须,mMapController.enableClick(true);
		 * 否则无响应
		 */
		Toast.makeText(getApplicationContext(), "click~~", 0).show();
		return true;
	}

}

4.定位实例

  1. /**
  2. *
  3. * @author zimo
  4. * @see http://blog.youkuaiyun.com/zimo2013
  5. */ 
  6. public class LocationProvider { 
  7.     private static final String TAG = "LocationProvider"
  8.      
  9.     private LocationClient mClient; 
  10.     private BDLocationListener mListener; 
  11.      
  12.     public LocationProvider(Context context){ 
  13.         mClient = new LocationClient(context); 
  14.         //配置密钥key 
  15.         mClient.setAK("我的密钥"); 
  16.         //配置定位参数信息 
  17.         mClient.setLocOption(getClientOptions()); 
  18.     } 
  19.      
  20.     /**
  21.      * 请求开始定位
  22.      */ 
  23.     public void start(){ 
  24.         if(mListener == null){ 
  25.             LogUtil.e(TAG, "请在调用start()之前,先调用setLocationListener设定监听器"); 
  26.             return
  27.         } 
  28.         if(!mClient.isStarted()){ 
  29.             LogUtil.i(TAG, "定位开启!"); 
  30.             mClient.start(); 
  31.         } 
  32.         mClient.requestLocation(); 
  33.     } 
  34.     public void stop(){ 
  35.         if(mClient.isStarted()){ 
  36.             LogUtil.i(TAG, "定位关闭!"); 
  37.             mClient.stop(); 
  38.         } 
  39.     } 
  40.      
  41.     public void setLocationListener(BDLocationListener l){ 
  42.         mListener = l; 
  43.         mClient.registerLocationListener(l); 
  44.     } 
  45.      
  46.     private LocationClientOption getClientOptions(){ 
  47.          
  48.         LocationClientOption option = new LocationClientOption(); 
  49.         option.setOpenGps(true);    //打开GPS 
  50.         /*
  51.          * 返回的定位结果包含地址信息, 如果不设置,location.getAddrStr();返回为null
  52.          */ 
  53.         option.setAddrType("all");   
  54.         option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02 
  55.         option.setScanSpan(1000 * 60);  //设置发起定位请求的间隔时间 
  56.         option.disableCache(true);  //禁止启用缓存定位 
  57.         option.setPoiNumber(5);     //最多返回POI个数 
  58.         option.setPoiDistance(1000); //poi查询距离 
  59.         option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息 
  60.         return option; 
  61.     } 
/**
 * 
 * @author zimo
 * @see http://blog.youkuaiyun.com/zimo2013
 */
public class LocationProvider {
	private static final String TAG = "LocationProvider";
	
	private LocationClient mClient;
	private BDLocationListener mListener;
	
	public LocationProvider(Context context){
		mClient = new LocationClient(context);
		//配置密钥key
		mClient.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;
	}
}
  1. public class MainActivity extends Activity implements BDLocationListener { 
  2.  
  3.     BMapManager mBMapMan = null
  4.     MapView mMapView = null
  5.     LocationClient client; 
  6.     LocationData locationData; 
  7.     MyLocationOverlay locationOverlay; 
  8.     MapController mMapController; 
  9.  
  10.     LocationProvider provider; 
  11.  
  12.     @Override 
  13.     protected void onCreate(Bundle savedInstanceState) { 
  14.         super.onCreate(savedInstanceState); 
  15.  
  16.         mBMapMan = new BMapManager(getApplication()); 
  17.         mBMapMan.init("647a2e8859989d9d6e1e6d5db525e177", null); 
  18.         // 注意:请在试用setContentView前初始化BMapManager对象,否则会报错 
  19.  
  20.         setContentView(R.layout.activity_main); 
  21.         mMapView = (MapView) findViewById(R.id.bmapsView); 
  22.         mMapView.setBuiltInZoomControls(true); 
  23.          
  24.         mMapController = mMapView.getController(); 
  25.         // 设置启用内置的缩放控件 
  26.         mMapController.setZoom(14); 
  27.         // 得到mMapView的控制权,可以用它控制和驱动平移和缩放 
  28.         GeoPoint point = new GeoPoint((int) (39.915 * 1E6), 
  29.                 (int) (116.404 * 1E6)); 
  30.         // 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) 
  31.         mMapController.setCenter(point);// 设置地图中心点 
  32.         mMapController.setZoom(14);// 设置地图zoom级别 
  33.  
  34.         locationData = new LocationData(); 
  35.         locationOverlay = new MyLocationOverlay(mMapView); 
  36.         // 设置定位数据 
  37.         locationOverlay.setData(locationData); 
  38.         // 添加定位图层 
  39.         mMapView.getOverlays().add(locationOverlay); 
  40.         locationOverlay.enableCompass(); 
  41.         // 修改定位数据后刷新图层生效 
  42.         mMapView.refresh(); 
  43.     } 
  44.  
  45.     public void click(View view) { 
  46.         //click button请求定位 
  47.         provider = new LocationProvider(getApplicationContext()); 
  48.         provider.setLocationListener(this); 
  49.         provider.start();   //开始定位 
  50.     } 
  51.  
  52.     @Override 
  53.     public void onReceiveLocation(BDLocation location) { 
  54.         locationData.latitude = location.getLatitude(); 
  55.         locationData.longitude = location.getLongitude(); 
  56.         // 如果不显示定位精度圈,将accuracy赋值为0即可 
  57.         locationData.accuracy = location.getRadius(); 
  58.         // 此处可以设置 locData的方向信息, 如果定位 SDK 未返回方向信息,用户可以自己实现罗盘功能添加方向信息。 
  59.         locationData.direction = location.getDerect(); 
  60.         // 更新定位数据 
  61.         locationOverlay.setData(locationData); 
  62.         // 更新图层数据执行刷新后生效 
  63.         mMapView.refresh(); 
  64.  
  65.         Toast.makeText(getApplicationContext(), location.getAddrStr(), 1
  66.                 .show(); 
  67.         mMapController.animateTo(new GeoPoint( 
  68.                 (int) (locationData.latitude * 1e6), 
  69.                 (int) (locationData.longitude * 1e6))); 
  70.     } 
  71.     @Override 
  72.     public void onReceivePoi(BDLocation location) { 
  73.  
  74.     } 
  75.     @Override 
  76.     protected void onResume() { 
  77.         mMapView.onResume(); 
  78.         if (mBMapMan != null) { 
  79.             mBMapMan.start(); 
  80.         } 
  81.         super.onResume(); 
  82.     } 
  83.      
  84.     @Override 
  85.     protected void onPause() { 
  86.         mMapView.onPause(); 
  87.         if (mBMapMan != null) { 
  88.             mBMapMan.stop(); 
  89.         } 
  90.         //如果没有必要,应该停止定位 
  91.         if(provider != null){ 
  92.             provider.stop(); 
  93.             provider = null
  94.         } 
  95.         super.onPause(); 
  96.     } 
  97.  
  98.     @Override 
  99.     protected void onDestroy() { 
  100.         mMapView.destroy(); 
  101.         if (mBMapMan != null) { 
  102.             mBMapMan.destroy(); 
  103.             mBMapMan = null
  104.         } 
  105.         super.onDestroy(); 
  106.     } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值