您的位置:首页 > 其它

百度地图-定位

2016-03-21 11:25 323 查看

定位

配置环境

设置AndroidManifest.xml

在application标签中声明service组件,每个app拥有自己单独的定位service

<serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service>
【重要提醒】定位SDKv3.1版本之后,以下权限已不需要,请取消声明,否则将由于Android5.0多帐户系统加强权限管理而导致应用安装失败。<uses-permissionandroid:name="android.permission.BAIDU_LOCATION_SERVICE"></uses-permission>来源:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/buildprojec

声明使用权限

<!--这个权限用于进行网络定位-->
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--这个权限用于访问GPS定位-->
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--访问网络,网络定位需要上网-->
<uses-permissionandroid:name="android.permission.INTERNET"/>
<!--SD卡读取权限,用户写入离线定位数据-->
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

相关的类

首先我们先了解一下有关定位的核心类,这些类搞清楚了就没有问题了。

重要的接口BDLocationListener定位的请求回调接口,返回定位的结果下面来讲解一下BDLocation类可以看出这个类中封装这定位信息,那么我们如何获取定位信息呢?接下来我们看一下这个类的方法有哪些。从上图中,我们可以看出,调用get...()我们可以得到相关的定位信息如城市、经度、维度等。既然我们已经知道了如何得到定位的信息,接下来我们要初始化定位:初始化定位的类:LocationClient定位服务的客户端我们看以下,关于这个类的描述:LocationClient类的方法:

从上图中,我们看到了有关LocationClient类的所有方法,其中start()、stop()方法我们可以很快的就能想到要在onCreate()方法中调用start()方法,来开启定位服务,在onDestroy()中调用stop()停止定位服务。

最重要的是下面这个方法注册定位监听我们看一下BDLocationListener接口在这个接口中有BDLocation参数,看到这里,就一目了然了,我们可以通过

LocationClient.registerLocationListener(newMyLocationListener);

自定义类MyLocationListenerextendBDLocationListener{//在定位的回调函数中进行操作onReceiveLocation(BDLocationlocation){.....//得到定位的结果}}

接下来我们来实现具体的定位功能

初始化LocationClient类和BaiduMap此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context
privateMapViewmapView=null;
privateBaiduMapmap;
privateLocationClientmLocationClient=null;//LocationClient类是定位sdk的核心类
privateBDLocationListenermyListener=newMyLocationListener();//注册定位监听,返回定位的结果
privateLocationModemCurrentMode;//定位模式
privateBitmapDescriptormCurrentMarker;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
//初始化地图mapView=(MapView)findViewById(R.id.bmapView);map=mapView.getMap();//开启定位图层map.setMyLocationEnabled(true);//初始化定位mLocationClient=newLocationClient(getApplicationContext());//注册定位监听mLocationClient.registerLocationListener(myListener);//配置定位SDK参数initLocation();
}
2.配置定位SDK参数设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。LocationClientOption类,该类用来设置定位SDK的定位方式,还有一些参数设置请参考百度地图定位APIe.g.:
privatevoidinitLocation(){
LocationClientOptionoption=newLocationClientOption();
//option.setLocationMode(LocationMode.Hight_Accuracy);//
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
//坐标类型分为三种:国测局经纬度坐标系(gcj02),百度墨卡托坐标系(bd09),百度经纬度坐标系(bd09ll)。
option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
intspan=1000;
option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setIsNeedAddress(true);//返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);//返回的结果包含手机的方向
//option.setLocationNotify(true);//
//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
//option.setIsNeedLocationDescribe(true);//
//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);//
//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
//option.setIgnoreKillProcess(false);//
//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
//option.SetIgnoreCacheException(false);//
//可选,默认false,设置是否收集CRASH信息,默认收集
//option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
mLocationClient.setLocOption(option);
mLocationClient.start();//开始定位
}
3.实现BDLocationListener接口
privateclassMyLocationListenerimplementsBDLocationListener{
@Override
		publicvoidonReceiveLocation(BDLocationlocation){
//mapview销毁后不在处理新接收的位置
			if(location==null||mapView==null){
return;
}
//构造定位数据
			MyLocationDatalocData=newMyLocationData.Builder()
.accuracy(location.getRadius())
		//此处设置开发者获取到的方向信息,顺时针0-360
.direction(location.getDirection())//获取方向
.latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
//设置定位数据
map.setMyLocationData(locData);
//
			if(isFirstLoc){//判断是否是第一次定位
				isFirstLoc=false;
	//获取精度维度坐标
	//LatLngll=newLatLng(location.getLatitude(),
			//location.getLongitude());
	//MapStatus.Builderbuilder=newMapStatus.Builder();
	//builder.target(ll).zoom(18.0f);
	//animationMapStatus()方法把定位到的点移动到地图中心
	//map.animateMapStatus(MapStatusUpdateFactory
			//.newMapStatus(builder.build()));
	//ReceiveLocation
				StringBuffersb=newStringBuffer(256);
				sb.append("time:");
sb.append(location.getTime());
				sb.append("\nerrorcode:");
sb.append(location.getLocType());
				sb.append("\nlatitude:");
sb.append(location.getLatitude());
				sb.append("\nlontitude:");
sb.append(location.getLongitude());
				sb.append("\nradius:");
sb.append(location.getRadius());
				if(location.getLocType()==BDLocation.TypeGpsLocation){//GPS定位结果
					sb.append("\nspeed:");
					sb.append(location.getSpeed());//单位:公里每小时
					sb.append("\nsatellite:");
sb.append(location.getSatelliteNumber());
					sb.append("\nheight:");
					sb.append(location.getAltitude());//单位:米
					sb.append("\ndirection:");
					sb.append(location.getDirection());//单位度
					sb.append("\naddr:");
sb.append(location.getAddrStr());
					sb.append("\ndescribe:");
sb.append("gps定位成功");
}elseif(location.getLocType()==BDLocation.TypeNetWorkLocation){//网络定位结果
					sb.append("\naddr:");
sb.append(location.getAddrStr());
		//运营商信息
					sb.append("\noperationers:");
sb.append(location.getOperators());
					sb.append("\ndescribe:");
sb.append("网络定位成功");
}elseif(location.getLocType()==BDLocation.TypeOffLineLocation){//离线定位结果
					sb.append("\ndescribe:");
sb.append("离线定位成功,离线定位结果也是有效的");
}elseif(location.getLocType()==BDLocation.TypeServerError){
					sb.append("\ndescribe:");
sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
}elseif(location.getLocType()==BDLocation.TypeNetWorkException){
					sb.append("\ndescribe:");
sb.append("网络不同导致定位失败,请检查网络是否通畅");
}elseif(location.getLocType()==BDLocation.TypeCriteriaException){
					sb.append("\ndescribe:");
sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
}
				sb.append("\nlocationdescribe:");
				sb.append(location.getLocationDescribe());//位置语义化信息
				List<Poi>list=location.getPoiList();//POI数据
				if(list!=null){
					sb.append("\npoilistsize=:");
sb.append(list.size());
					for(Poip:list){
						sb.append("\npoi=:");
						sb.append(p.getId()+""+p.getName()+""
								+p.getRank());
}
}
				System.out.println("BaiduLocationApiDem"+sb.toString());
				newAlertDialog.Builder(LocationActivity.this).setTitle("定位")
.setMessage(sb.toString()).show();
}
}
}
4.地图定位生命周期的管理
@Override
	protectedvoidonPause(){
mapView.onPause();
super.onPause();
}
@Override
	protectedvoidonResume(){
mapView.onResume();
super.onResume();
}
@Override
	protectedvoidonDestroy(){
		//退出时销毁定位
mLocationClient.stop();
		//关闭定位图层
map.setMyLocationEnabled(false);
//取消位置提醒
mLocationClient.removeNotifyEvent(mNotifyer);
mapView.onDestroy();
		mapView=null;
super.onDestroy();
}
5.位置提醒位置提醒最多提醒3次,3次过后将不再提醒。假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。
//位置提醒相关代码
mNotifyer=newNotifyLister();
mNotifyer.SetNotifyLocation(42.03249652949337,113.3129895882556,3000,"gps");//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)
mLocationClient.registerNotify(mNotifyer);
//注册位置提醒监听事件后,可以通过SetNotifyLocation来修改位置提醒设置,修改后立刻生效。
//BDNotifyListner实现
publicclassNotifyListerextendsBDNotifyListener{
publicvoidonNotify(BDLocationmlocation,floatdistance){
	mVibrator01.vibrate(1000);//振动提醒已到设定位置附近
}
}
//取消位置提醒
mLocationClient.removeNotifyEvent(mNotifyer);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: