Android_百度地图BaiduMap_LocationClient本地定位

本系列百度地图开发是基于Android定位SDKv4.0Android SDK v2.3.0

1.AndroidManifest.xml文件配置

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

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

<!-- 需要出示的权限 -->
<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

{
	//Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context
	mLocationClient = 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");//返回的定位结果是百度经纬度,默认值gcj02
option.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);
	}

	@Override
	protected 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);
		//配置密钥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;
	}
}
public class MainActivity extends Activity implements BDLocationListener {

	BMapManager mBMapMan = null;
	MapView mMapView = null;
	LocationClient client;
	LocationData locationData;
	MyLocationOverlay locationOverlay;
	MapController mMapController;

	LocationProvider provider;

	@Override
	protected 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();	//开始定位
	}

	@Override
	public 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)));
	}
	@Override
	public void onReceivePoi(BDLocation location) {

	}
	@Override
	protected void onResume() {
		mMapView.onResume();
		if (mBMapMan != null) {
			mBMapMan.start();
		}
		super.onResume();
	}
	
	@Override
	protected void onPause() {
		mMapView.onPause();
		if (mBMapMan != null) {
			mBMapMan.stop();
		}
		//如果没有必要,应该停止定位
		if(provider != null){
			provider.stop();
			provider = null;
		}
		super.onPause();
	}

	@Override
	protected void onDestroy() {
		mMapView.destroy();
		if (mBMapMan != null) {
			mBMapMan.destroy();
			mBMapMan = null;
		}
		super.onDestroy();
	}
}

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
百度地图定位Cordova插件,支持Android,IOS 可以在此地址查看example 基于百度地图Android定位SDK(v7.1)以及百度地图IOS SDK (v3.2.1) 一,申请Android及IOS版密钥 申请密钥Android定位SDK 每一个AndroidManifest.xml 中的package属性 对应一个AK,不可混用 iOS SDK开发密钥 每一个Bundle Identifier 对应一个AK,不可混用 二,安装插件```` cordova plugin add cordova-plugin-baidumaplocation --variable ANDROID_KEY="" --variable IOS_KEY="" //此处的API_KEY_XX来自于第一步,直接替换,也可以最后跟 --save 参数,将插件信息保存到config.xml中 //如果只需要Android端或者IOS端,可以只填写一个相应的AK,但是都不填肯定不行 三,使用方法 // 进行定位 baidumap_location.getCurrentPosition(function (result) {     console.log(JSON.stringify(result, null, 4)); }, function (error) { }); 获得定位信息,返回JSON格式数据: {     "time": "2017-02-25 17:30:00",//获取时间     "latitude": 34.6666666,//纬度     "lontitude": 117.8888,//经度     "radius": 61.9999999,//半径     //--------Android 独享 begin     "locType": 161,//定位类型                                                 "locTypeDescription": "NetWork location successful!",//定位类型解释        "userIndoorState": 1,//是否室内                                          //--------Android 独享 end     //--------IOS 独享 begin     "title": "我的位置",//定位标注点标题信息     "subtitle": "我的位置",//定位标注点子标题信息     //--------IOS 独享 end } 具体字段内容请参照: Android版 BDLocation v7.1 IOS版 BMKUserLocation 如果Android版获取到的信息是: {     "locType": 505,     "locTypeDescription": "NetWork location failed because baidu location service check the key is unlegal, please check the key in AndroidManifest.xml !",     "latitude": 5e-324,     "lontitude": 5e-324,     "radius": 0,     "userIndoorState": -1,     "direction": -1 } 说明Key有问题,可以检查下生成的AndroidManifest.xml文件里面是否有如下信息                                                           如果没有,说明插件使用不当,尝试重新安装,如果有这些信息,说明Key与当前程序AndroidManifest.xml 中的package名不一致,请检查Key的申请信息是否正确 四,查看当前安装了哪些插件 cordova plugin ls 五,删除本插件 cordova plugin rm cordova-plugin-baidumaplocation 标签:cordova

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值