重拾百度定位之踩坑篇(上)-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

重拾百度定位之踩坑篇(上)

简介:

前言

最近更新项目中用的百度定位SDK时遇见了一个奇葩的问题。当升级SDK后百度定位一直返回505,通过百度定位官网查看该码表示AK非法或者不存在。很纠结,于是自己又写了一个demo来研究一下百度定位以及大家使用百度定位经常出现的问题,特此记录。这篇文章我先将百度定位的实现也介绍一下,最后再分析遇到的问题及解决方案。

定位分析

目前百度定位提供了WIFI,基站,GPS等多种定位方式,适用于室内、室外多种定位场景,具有出色的定位性能:定位精度高(其实我是想吐槽的)、覆盖率广、网络定位请求流量小、定位速度快。

集成定位SDK

现在官网提供的最新的定位SDK版本是v7.0,官网SDK下载地址请戳 定位SDK,可根据自己的需要下载,在这里我进入全部下载,只下载了全量定位。在新版本V7.0中百度将定位对开发包实现了分离

(1)基础定位:开发包体积最小,但只包含基础定位能力(GPS/WiFi/基站)、基础位置描述能力;

(2)离线定位:在基础定位能力基础之上,提供离线定位能力,可在网络环境不佳时,进行精准定位;

(3)室内定位:在基础定位能力基础之上,提供室内高精度定位能力,精度可达1-3米;

(4)全量定位:包含离线定位、室内高精度定位能力,同时提供更人性化的位置描述服务;

对于这四种类型定位开发包是互斥的,一个应用中只需集成一种定位开发包即可。下载成功之后,将jar包和.so文件放到对应的文件下即可。

申请秘钥

使用百度定位,我们需要在官网申请一个AK,项目定位时需要使用这个Ak,一个应用对于一个AK,AK申请时需要提供包名及SHA1值。具体方式

可去官网查看。在这里我简单介绍下SHA1获取方式。在申请Ak时,页面填写发布版SHA1和开发版SHA1。下面我提供两种方式获取SHA1值。

AndroidStudio Terminal获取


  1. -rfc                            以 RFC 样式输出                                                                                
  2. -alias <alias>                  要处理的条目的别名                                                                             
  3. -keystore <keystore>            密钥库名称                                                                                     
  4. -storepass <arg>                密钥库口令                                                                                     
  5. -storetype <storetype>          密钥库类型                                                                                     
  6. -providername <providername>    提供方名称                                                                                     
  7. -providerclass <providerclass>  提供方类名                                                                                     
  8. -providerarg <arg>              提供方参数                                                                                     
  9. -providerpath <pathlist>        提供方类路径                                                                                   
  10. -v                              详细输出                                                                                       
  11. -protected                      通过受保护的机制的口令  

上面是获取密钥库信息的一些命令,则在此获取SHA1可以


  1. keytool -v -list -keystore 【密钥库文件路径】 -storepass 【密钥库文件密码】 

在Terminal执行命令后就出现上面的详细信息。SHA1后面的那一串字符就是我们需要的SHA1.

CMD方式

如果要在CMD中获取,必须先要设置环境变量,具体设置方式可谷歌搜索。当然获取的命令和在AndroidStudio中获取是一样的。在上面我获取下开发版SHA1。对于debug版一般存用户下的.android目录下,我们打开CMD后执行 cd .android然后通过dir就可以看到目录下会有一个debug.keystore文件,我们找的就是它。

在图中你会看到没有写-storepass参数(当然也可和上面一样)。在回车后会提示输入密钥库口令,对于我们的debug版本口令默认是android,输入后回车即可看到详细信息了。

环境配置

要想实现定位,我们必须在清单文件中加入一些必要的权限以及key等信息,如下


  1. <!--百度定位权限相关--> 
  2.     <!-- 这个权限用于进行网络定位--> 
  3.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> 
  4.     <!-- 这个权限用于访问GPS定位--> 
  5.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 
  6.     <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> 
  7.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
  8.     <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> 
  9.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
  10.     <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> 
  11.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
  12.     <!-- 用于读取手机当前的状态--> 
  13.     <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
  14.     <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--> 
  15.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
  16.     <!-- 访问网络,网络定位需要上网--> 
  17.     <uses-permission android:name="android.permission.INTERNET" /> 
  18.     <!-- SD卡读取权限,用户写入离线定位数据--> 
  19.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">       </uses-permission> 
  20.     <application 
  21.         android:allowBackup="true" 
  22.         android:icon="@mipmap/ic_launcher" 
  23.         android:label="@string/app_name" 
  24.         android:supportsRtl="true" 
  25.         android:theme="@style/AppTheme"
  26.         <service 
  27.             android:name="com.baidu.location.f" 
  28.             android:enabled="true" 
  29.             android:process=":remote" > 
  30.         </service> 
  31.         <meta-data 
  32.             android:name="com.baidu.lbsapi.API_KEY" 
  33.             android:value="w7NQOKL8SpxHrs6lixBNoe90" /> 
  34.      </application>  

定位实现

对于定位的实现我们可以分为三步,第一步:初始化LocationClient;第二步:通过LocationClientOption设置定位参数;第三步:实现BDLocationListener接口。看着是不是很简单,你没看错,确实很简单。

初始化LocationClient


  1. /** 
  2.      * 获取LocationService实例 
  3.      * 
  4.      * @param context 
  5.      * @return 
  6.      */ 
  7.     public static LocationService getInstance(Context context) { 
  8.         if (locationClient == null) { 
  9.             synchronized (LocationService.class) { 
  10.                 locationService= new LocationService(context); 
  11.             } 
  12.         } 
  13.         return locationService; 
  14.     } 
  15.   
  16.     private LocationService(Context context) { 
  17.         if (locationClient == null) { 
  18.             locationClient = new LocationClient(context); 
  19.             locationClient.setLocOption(getDefaultLocationClientOption()); 
  20.         } 
  21.     }  

设置定位参数


  1. /*** 
  2.      * 配置参数 
  3.      * 
  4.      * @return DefaultLocationClientOption 
  5.      */ 
  6.     public LocationClientOption getDefaultLocationClientOption() { 
  7.         if (locationClientOption == null) { 
  8.             locationClientOption = new LocationClientOption(); 
  9.             locationClientOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 
  10.             locationClientOption.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll; 
  11.             locationClientOption.setScanSpan(3000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 
  12.             locationClientOption.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 
  13.             locationClientOption.setIsNeedLocationDescribe(true);//可选,设置是否需要地址描述 
  14.             locationClientOption.setNeedDeviceDirect(true);//可选,设置是否需要设备方向结果 
  15.             locationClientOption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 
  16.             locationClientOption.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 
  17.             locationClientOption.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” 
  18.             locationClientOption.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 
  19.             locationClientOption.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 
  20.   
  21.             locationClientOption.setIsNeedAltitude(false);//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用 
  22.         } 
  23.         return locationClientOption; 
  24.     }  

接下文





本文作者:佚名
来源:51CTO

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章