百度地图-定位
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>来源:
声明使用权限
<!--这个权限用于进行网络定位-->
<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()停止定位服务。
最重要的是下面这个方法注册定位监听LocationClient.registerLocationListener(newMyLocationListener);
自定义类MyLocationListenerextendBDLocationListener{//在定位的回调函数中进行操作onReceiveLocation(BDLocationlocation){.....//得到定位的结果}}接下来我们来实现具体的定位功能
初始化LocationClient类和BaiduMap此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的contextprivateMapViewmapView=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);
相关文章推荐
- 有符号数和无符号数
- 为什么要使用SLF4J而不是Log4J
- ****如何优雅的用Axure装逼?高保真原型心得分享
- iOS_SN_CoreData数据迁移
- iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html
- Eclipse远程调试HDP源代码
- GDC 2016 神秘海域4中使用Substance制作Texture
- 美好的一天(Weather Live)
- 华为设计总监:年轻设计师如何进步?
- PHP计算两个经纬度之间的距离
- PHP socket实现 writeInt 和 writeLong 和 writeUTF 以及和Java端对接
- MySQL 5.6 for Windows 配置安装
- 330. Patching Array
- Android Dalvik虚拟机初识
- iOS微信支付
- 十天学会web标准(DIV+CSS)系列(四)纵向导航菜单及二级弹出菜单
- 本地如何无密码登录linux服务器
- flume+Kafka+Storm实时框架
- 阅读C#程序,理解并分析
- 老李的blog使用日记(3)