前言
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了龙口免费建站欢迎大家使用!
最近更新项目中用的百度定位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获取
- -rfc 以 RFC 样式输出
- -alias
要处理的条目的别名 - -keystore
密钥库名称 - -storepass
密钥库口令 - -storetype
密钥库类型 - -providername
提供方名称 - -providerclass
提供方类名 - -providerarg
提供方参数 - -providerpath
提供方类路径 - -v 详细输出
- -protected 通过受保护的机制的口令
上面是获取密钥库信息的一些命令,则在此获取SHA1可以
- keytool -v -list -keystore 【密钥库文件路径】 -storepass 【密钥库文件密码】
在Terminal执行命令后就出现上面的详细信息。SHA1后面的那一串字符就是我们需要的SHA1.
CMD方式
如果要在CMD中获取,必须先要设置环境变量,具体设置方式可谷歌搜索。当然获取的命令和在AndroidStudio中获取是一样的。在上面我获取下开发版SHA1。对于debug版一般存用户下的.android目录下,我们打开CMD后执行 cd .android然后通过dir就可以看到目录下会有一个debug.keystore文件,我们找的就是它。
在图中你会看到没有写-storepass参数(当然也可和上面一样)。在回车后会提示输入密钥库口令,对于我们的debug版本口令默认是android,输入后回车即可看到详细信息了。
环境配置
要想实现定位,我们必须在清单文件中加入一些必要的权限以及key等信息,如下
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- android:name="com.baidu.location.f"
- android:enabled="true"
- android:process=":remote" >
- android:name="com.baidu.lbsapi.API_KEY"
- android:value="w7NQOKL8SpxHrs6lixBNoe90" />
定位实现
对于定位的实现我们可以分为三步,第一步:初始化LocationClient;第二步:通过LocationClientOption设置定位参数;第三步:实现BDLocationListener接口。看着是不是很简单,你没看错,确实很简单。
初始化LocationClient
- /**
- * 获取LocationService实例
- *
- * @param context
- * @return
- */
- public static LocationService getInstance(Context context) {
- if (locationClient == null) {
- synchronized (LocationService.class) {
- locationService= new LocationService(context);
- }
- }
- return locationService;
- }
- private LocationService(Context context) {
- if (locationClient == null) {
- locationClient = new LocationClient(context);
- locationClient.setLocOption(getDefaultLocationClientOption());
- }
- }
设置定位参数
- /***
- * 配置参数
- *
- * @return DefaultLocationClientOption
- */
- public LocationClientOption getDefaultLocationClientOption() {
- if (locationClientOption == null) {
- locationClientOption = new LocationClientOption();
- locationClientOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
- locationClientOption.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
- locationClientOption.setScanSpan(3000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
- locationClientOption.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
- locationClientOption.setIsNeedLocationDescribe(true);//可选,设置是否需要地址描述
- locationClientOption.setNeedDeviceDirect(true);//可选,设置是否需要设备方向结果
- locationClientOption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
- locationClientOption.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
- locationClientOption.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
- locationClientOption.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
- locationClientOption.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
- locationClientOption.setIsNeedAltitude(false);//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
- }
- return locationClientOption;
- }
接下文
文章标题:重拾百度定位之踩坑篇(上)
标题来源:http://www.mswzjz.cn/qtweb/news1/299451.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能