Android版本百度地图开发(四)——定位

本来这里应该继续讲述百度地图相关的知识,但继续向前会遇到定位相关的内容,所以我们先来讲解如何处理定位的内容。


1 导入库文件

  1. 我们去http://developer.baidu.com/map/geosdk-android-download.htm找到相关下载内容,找到4.0版本SDK并下载下来;
  2. 解压,将locaSDK_4.0.jar拷贝到工程的/libs目录;
  3. 将liblocSDK4.so拷贝到工程的/libs/armeabi目录;

2 设置AndroidManifest.xml文件

  1. 在Application标签中声明service:
    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. <service  
    2.     android:name="com.baidu.location.f"  
    3.     android:enabled="true"  
    4.     android:process=":remote" >  
    5. </service>  

  2. 声明使用权限:
    [html]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >  
    2. </uses-permission>  
    3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >  
    4. </uses-permission>  
    5. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >  
    6. </uses-permission>  
    7. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >  
    8. </uses-permission>  
    9. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >  
    10. </uses-permission>  
    11. <uses-permission android:name="android.permission.READ_PHONE_STATE" >  
    12. </uses-permission>  
    13. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >  
    14. </uses-permission>  
    15. <uses-permission android:name="android.permission.INTERNET" />  
    16. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >  
    17. </uses-permission>  
    18. <uses-permission android:name="android.permission.READ_LOGS" >  
    19. </uses-permission>  

3 开始定位

  1. 在Activity中import相关类,添加成员变量:
    [java]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. private LocationClient locationClient = null;  
    2.     private MyLocationListener listener = new MyLocationListener();  
  2. 在onCreate中启动定位服务:
    [java]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. // 构造函数中的Context参数需要指定对整个进程有效的Context,所以使用Application的Context  
    2.         locationClient = new LocationClient(getApplicationContext());  
    3.         locationClient.setAK(KEY);  
    4.         locationClient.registerLocationListener(listener);  
    5.         // 设置定位参数  
    6.         LocationClientOption option = new LocationClientOption();  
    7.         option.setOpenGps(true);  
    8.         option.setAddrType("all");// 返回的定位结果包含地址信息  
    9.         option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02  
    10.         option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms  
    11.         option.disableCache(true);// 禁止启用缓存定位  
    12.         option.setPoiNumber(5); // 最多返回POI个数  
    13.         option.setPoiDistance(1000); // poi查询距离  
    14.         option.setPoiExtraInfo(true); // 是否需要POI的电话和地址等详细信息  
    15.         locationClient.setLocOption(option);  
    16.         // 启动定位服务  
    17.         locationClient.start();  

  3. 异步定位回调处理:
    [java]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. public class MyLocationListener implements BDLocationListener {  
    2.   
    3.     @Override  
    4.     public void onReceiveLocation(BDLocation location) {  
    5.         if (location == null)  
    6.             return;  
    7.         StringBuffer sb = new StringBuffer(256);  
    8.         sb.append("time : ");  
    9.         // 时间  
    10.         sb.append(location.getTime());  
    11.         sb.append("\nLoc Type : ");  
    12.         // 定位类型:  
    13.         // 61 : GPS定位结果  
    14.         // 62 : 扫描整合定位依据失败。此时定位结果无效。  
    15.         // 63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。  
    16.         // 65 : 定位缓存的结果。  
    17.         // 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果  
    18.         // 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果  
    19.         // 68 : 网络连接失败时,查找本地离线定位时对应的返回结果  
    20.         // 161: 表示网络定位结果  
    21.         // 162~167: 服务端定位失败。  
    22.         sb.append(location.getLocType());  
    23.         sb.append("\nlatitude : ");  
    24.         // 纬度  
    25.         sb.append(location.getLatitude());  
    26.         sb.append("\nlontitude : ");  
    27.         // 经度  
    28.         sb.append(location.getLongitude());  
    29.         sb.append("\nradius : ");  
    30.         // 半径  
    31.         sb.append(location.getRadius());  
    32.         if (location.getLocType() == BDLocation.TypeGpsLocation) {  
    33.             sb.append("\nspeed : ");  
    34.             sb.append(location.getSpeed());  
    35.             sb.append("\nsatellite : ");  
    36.             sb.append(location.getSatelliteNumber());  
    37.         } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {  
    38.             sb.append("\naddr : ");  
    39.             // 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。  
    40.             sb.append(location.getAddrStr());  
    41.             // 2.6以上版本SDK支持单独获取省份城市区县信息  
    42.             sb.append("\n省份 : " + location.getProvince() + "; 城市:" + location.getCity() + "; 区县:" + location.getDistrict());  
    43.         }  
    44.   
    45.         System.out.println(sb.toString());  
    46.     }  
    47.   
    48.     @Override  
    49.     public void onReceivePoi(BDLocation poiLocation) {  
    50.         if (poiLocation == null) {  
    51.             return;  
    52.         }  
    53.         StringBuffer sb = new StringBuffer(256);  
    54.         sb.append("Poi time : ");  
    55.         sb.append(poiLocation.getTime());  
    56.         sb.append("\nerror code : ");  
    57.         sb.append(poiLocation.getLocType());  
    58.         sb.append("\nlatitude : ");  
    59.         sb.append(poiLocation.getLatitude());  
    60.         sb.append("\nlontitude : ");  
    61.         sb.append(poiLocation.getLongitude());  
    62.         sb.append("\nradius : ");  
    63.         sb.append(poiLocation.getRadius());  
    64.         if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation) {  
    65.             sb.append("\naddr : ");  
    66.             sb.append(poiLocation.getAddrStr());  
    67.         }  
    68.         if (poiLocation.hasPoi()) {  
    69.             sb.append("\nPoi:");  
    70.             sb.append(poiLocation.getPoi());  
    71.         } else {  
    72.             sb.append("noPoi information");  
    73.         }  
    74.         System.out.println(sb.toString());  
    75.     }  
    76.   
    77. }  
    上面的onReceivePoi只有在调用getPoi方法后才可能产生异步回调。


4 设置位置提醒

对于某些应用(例如导航),需要在到达某位置之后振动提醒用户,可设置位置提醒。
相关代码:
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. // 位置提醒相关代码  
  2. notifyListener = new MyNotifyListener();  
  3. // 4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)  
  4. notifyListener.SetNotifyLocation(31.209294,121.472471,3000,"gps");  
  5. // 注册位置提醒监听事件后,可以通过SetNotifyLocation 来修改位置提醒设置,修改后立刻生效。  
  6. // 位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。  
  7. locationClient.registerNotify(notifyListener);  
  8. // 取消位置提醒  
  9. // locationClient.removeNotifyEvent(notifyListener);  

用于提醒的Listener:
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class MyNotifyListener extends BDNotifyListener {  
  2.     /** 
  3.      * mlocation表示当前位置,distance是当前坐标中心点与设定位置提醒的坐标点之间的距离值。 
  4.      */  
  5.     @Override  
  6.     public void onNotify(BDLocation mlocation, float distance) {  
  7.         super.onNotify(mlocation, distance);  
  8.         System.out.println("已经到设定位置附近。");  
  9.     }  
  10.   
  11. }  

5 地理围栏

地理围栏服务目前处于Beta阶段,主要用于提供比Notify更低功耗的提醒,使用上和Notify差不多,暂不做介绍。

6 注意事项

  • 定位SDK必须注册GPS和网络的使用权限。
  • 使用定位SDK请保证网络连接通畅(GPS定位方式不需要连网)。
  • 我们强烈建议您设置自己的prodName,并保管好,这样方便我们为您提供更好的定位服务。
  • 若需要返回的定位结果里包含地址信息,请保证网络连接。
  • 定位SDK可以返回bd09、bd09ll、gcj02三种类型坐标,若需要将定位点的位置通过百度Android地图 SDK进行地图展示,请返回bd09ll,将无偏差的叠加在百度地图上。
  • 有的移动设备锁屏后为了省电会自动关闭网络连接,此时网络定位模式的定位失效。此外,锁屏后移动设备若进入cpu休眠,定时定位功能也失效。若您需要实现在cpu休眠状态仍需定时定位,可以用alarmManager 实现1个cpu可叫醒的timer,定时请求定位。
  • 使用SDK4.0需要设置Accesskey,设置有误会引起定位和地理围栏服务不能正常使用,必须进行Accesskey的正确设置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值