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

接上文

实现BDLocationListener接口


  1. /***** 
  2.      * 定位结果回调,重写onReceiveLocation方法 
  3.      * 
  4.      */ 
  5.     private BDLocationListener mListener = new BDLocationListener() { 
  6.   
  7.         @Override 
  8.         public void onReceiveLocation(BDLocation location) { 
  9.             // TODO Auto-generated method stub 
  10.             if (null != location ) { 
  11.                 StringBuffer sb = new StringBuffer(256); 
  12.                 sb.append("time : "); 
  13.                 /** 
  14.                  * 时间也可以使用systemClock.elapsedRealtime()方法 获取的是自从开机以来,每次回调的时间; 
  15.                  * location.getTime() 是指服务端出本次结果的时间,如果位置不发生变化,则时间不变 
  16.                  */ 
  17.                 sb.append(location.getTime()); 
  18.                 sb.append("\nlocType : ");// 定位类型 
  19.                 sb.append(location.getLocType()); 
  20.                 sb.append("\nlocType description : ");// *****对应的定位类型说明***** 
  21.                 //sb.append(location.getLocTypeDescription()); 
  22.                 sb.append("\nlatitude : ");// 纬度 
  23.                 sb.append(location.getLatitude()); 
  24.                 sb.append("\nlontitude : ");// 经度 
  25.                 sb.append(location.getLongitude()); 
  26.                 sb.append("\nradius : ");// 半径 
  27.                 sb.append(location.getRadius()); 
  28.                 sb.append("\nCountryCode : ");// 国家码 
  29.                 sb.append(location.getCountryCode()); 
  30.                 sb.append("\nCountry : ");// 国家名称 
  31.                 sb.append(location.getCountry()); 
  32.                 sb.append("\ncitycode : ");// 城市编码 
  33.                 sb.append(location.getCityCode()); 
  34.                 sb.append("\ncity : ");// 城市 
  35.                 sb.append(location.getCity()); 
  36.                 sb.append("\nDistrict : ");// 区 
  37.                 sb.append(location.getDistrict()); 
  38.                 sb.append("\nStreet : ");// 街道 
  39.                 sb.append(location.getStreet()); 
  40.                 sb.append("\naddr : ");// 地址信息 
  41.                 sb.append(location.getAddrStr()); 
  42.                 sb.append("\nUserIndoorState: ");// *****返回用户室内外判断结果***** 
  43.                 //sb.append(location.getUserIndoorState()); 
  44.                 sb.append("\nDirection(not all devices have value): "); 
  45.                 sb.append(location.getDirection());// 方向 
  46.                 sb.append("\nlocationdescribe: "); 
  47.                 sb.append(location.getLocationDescribe());// 位置语义化信息 
  48.                 sb.append("\nPoi: ");// POI信息 
  49.                 if (location.getPoiList() != null && !location.getPoiList().isEmpty()) { 
  50.                     for (int i = 0; i append(poi.getName() + ";"); 
  51.                     } 
  52.    } 
  53.                 if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果 
  54.                     sb.append("\nspeed : "); 
  55.                     sb.append(location.getSpeed());// 速度 单位:km/h 
  56.                     sb.append("\nsatellite : "); 
  57.                     sb.append(location.getSatelliteNumber());// 卫星数目 
  58.                     sb.append("\nheight : "); 
  59.                     sb.append(location.getAltitude());// 海拔高度 单位:米 
  60.                     sb.append("\ngps status : "); 
  61.                     //sb.append(location.getGpsAccuracyStatus());// *****gps质量判断***** 
  62.                     sb.append("\ndescribe : "); 
  63.                     sb.append("gps定位成功"); 
  64.                 } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果 
  65.                     // 运营商信息 
  66.                     if (location.hasAltitude()) {// *****如果有海拔高度***** 
  67.                         sb.append("\nheight : "); 
  68.                         sb.append(location.getAltitude());// 单位:米 
  69.                     } 
  70.                     sb.append("\noperationers : ");// 运营商信息 
  71.                     sb.append(location.getOperators()); 
  72.                     sb.append("\ndescribe : "); 
  73.                     sb.append("网络定位成功"); 
  74.                 } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果 
  75.                     sb.append("\ndescribe : "); 
  76.                     sb.append("离线定位成功,离线定位结果也是有效的"); 
  77.                 } else if (location.getLocType() == BDLocation.TypeServerError) { 
  78.                     sb.append("\ndescribe : "); 
  79.                     sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因"); 
  80.                 } else if (location.getLocType() == BDLocation.TypeNetWorkException) { 
  81.                     sb.append("\ndescribe : "); 
  82.                     sb.append("网络不同导致定位失败,请检查网络是否通畅"); 
  83.                 } else if (location.getLocType() == BDLocation.TypeCriteriaException) { 
  84.                     sb.append("\ndescribe : "); 
  85.                     sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机"); 
  86.                 } 
  87.                 tv_location.setText(sb+"\n定位结束"); 
  88.                 locationService.stop(); 
  89.             }else{ 
  90.                 tv_location.setText("\n定位失败"); 
  91.             } 
  92.         } 
  93.   
  94.     };  

通过上面的实现后,我们在想要定位的地方注册下回调,并调用start()方法即可以获取位置了,我对注册开始暂停做了下简单封装,具体代码参考LocationService。如果要写的项目里也要把回调接口封装,自定义一个接口回调返回定位后的详细位置信息。到这里即可成功定位了,下面就开始介绍下这个过程会出现的问题。

定位问题分析

在分析之前我们先看下百度定位返回的错误码,分析定位的问题也就是分析出现错误码的原因。


  1. 获取定位返回错误码:: 
  2. public int getLocType ( ) 
  3. 返回值: 
  4. 61 : GPS定位结果,GPS定位成功。 
  5. 62 : 无法获取有效定位依据,定位失败,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位。 
  6. 63 : 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。 
  7. 65 : 定位缓存的结果。 
  8. 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。 
  9. 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。 
  10. 68 : 网络连接失败时,查找本地离线定位时对应的返回结果。 
  11. 161: 网络定位结果,网络定位成功。 
  12. 162: 请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件。 
  13. 167: 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。 
  14. 502: AK参数错误,请按照说明文档重新申请AK。 
  15. 505:AK不存在或者非法,请按照说明文档重新申请AK。 
  16. 601: AK服务被开发者自己禁用,请按照说明文档重新申请AK。 
  17. 602: key mcode不匹配,您的AK配置过程中安全码设置有问题,请确保:SHA1正确,“;”分号是英文状态;且包名是您当前运行应用的包名,请按照说明文档重新申请AK。 
  18. 501~700:AK验证失败,请按照说明文档重新申请AK。  

其实知道上面错误码代表的含义后,我们就很快速的定位问题出现地方。当然有些时候不如此,可能需要走一些弯路。

505错误

在我升级定位SDK版本后遇到得到就是这个问题,没有更改任何代码但是就是一直返回错误码是505.通过上面错误码表我们看到时AK不存在或者非法,但是依然很纠结,因为代码时点儿也没有改,只是替换了jar和.so文件为最新版就不能用了。定位一直返回505,最后在官网更新日志看到V7.0版本有一条记录 是优化、完善AK校验机制,充分保证开发者合法权益,保证开发者应用的安全性。具体怎么优化并没有说明。不过也能猜测应该是SHA1的值问题。我先将demo用的定位SDK用V6.2.2(项目中用的此版本),然后更改SHA1的值,不管怎么改依然能成功定位。但是更改为了V7.0版本发现SHA1的值并不能随便改,只能是运行程序用的key文件的SHA1的值,否则就出现505错误。至此问题解决。在V7.0之前版本虽说让填写SHA1的值,但是并没有什么有效作用,在V7.0版本开始加入了严格的校验。在这里提供一个软件可以校验APK的SHA1值,他提供了SHA1的和AK的校验功能。

如上图,这上面显示的SHA1的值应该和你开发版或者发布版中至少其中的一个相同。否则V7.0定位就不会成功。校验工具百度网盘下载链接,提取码:je4r。

162错误

162错误一般是.so文件加载失败引起的。在AndroidStudio中.so文件的位置和Eclipse中的是不一样的。默认情况下,AndroidStudio中.so文件放在main目录下,在该文件夹下创建jniLibs,然后将不同内核的.so文件放到该文件夹下就可以了。当然一些人延续了Eclipse位置,将.so文件放置在libs目录下,如果此时没有其他一些配置.so文件是不能加载的。此时再gradle文件加入下面代码即可


  1. sourceSets { 
  2.         main { 
  3.             jniLibs.srcDirs = ['libs'] 
  4.         } 
  5.     }  

其实最多出现的问题也就是这两种情况。正常情况下百度定位成功返回的是161也就是网络定位结果(如上图),但是有时候无网络会返回66机离线定位结果,离线定位是小区定位,需要手机手机中有SIM卡,否则不会返回66,你可以尝试下,把手机调到飞行模式,发现离线定位会失败。百度定位默认GPS定位是关闭的,如果想用GPS定位可以通过下面代码打开,


  1. locationClientOption.setOpenGps(true); 

BDLocationListener只回调一次

对于很多刚接触定位的人可能还会遇到一个问题就是,为何多次调用start()方法但是BDLocationListener回调只执行一次。每次只要程序刚启动时才能定位成功。之后再定位就没有反应了。如果你第一次遇到这个问题,确实很棘手,不管怎么改定位相关的代码,并不能解决问题。其实此时只需要在清单文件加入下面代码既可以解决BDLocationListener只会回调一次的问题


  1. <service 
  2.             android:name="com.baidu.location.f" 
  3.             android:enabled="true" 
  4.             android:process=":remote" > 
  5.         </service>  

好了,到此,本篇文章真的结束了,若文章有不足或者错误的地方,欢迎指正,以防止给其他读者错误引导

本文作者:佚名

来源:51CTO

时间: 2024-08-04 05:52:58

重拾百度定位之踩坑篇(下)的相关文章

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

前言 最近更新项目中用的百度定位SDK时遇见了一个奇葩的问题.当升级SDK后百度定位一直返回505,通过百度定位官网查看该码表示AK非法或者不存在.很纠结,于是自己又写了一个demo来研究一下百度定位以及大家使用百度定位经常出现的问题,特此记录.这篇文章我先将百度定位的实现也介绍一下,最后再分析遇到的问题及解决方案. 定位分析 目前百度定位提供了WIFI,基站,GPS等多种定位方式,适用于室内.室外多种定位场景,具有出色的定位性能:定位精度高(其实我是想吐槽的).覆盖率广.网络定位请求流量小.定

SQL Server在AlwaysOn中使用内存表的“踩坑”记录

前言 最近因为线上alwayson环境的一个数据库上使用内存表.经过大概一个星期监控程序发现了一个非常严重问题这个数据库的日志文件不会截断,已用空间一直在增加(存在定时的每个小时的日志备份),同时内存表数据库文件也无法删除,下面就介绍一下后面我的处理过程,话不多说了,来一起看看详细的介绍吧. 数据库:SQL Server2014 Enterprise Edition (64-bit) 删除文件 使用一个单独非alwayson环境的数据库测试. 一.创建内存表 ---创建内存表文件组 ALTER

JavaScript 踩坑心得— 为了高速(下)

一.前言 本文的上一篇 JavaScript 踩坑心得- 为了高速(上) 主要和大家分享的是 JavaScript 使用过程中的基本原则以及编写过程中的心得分享,本文主要和大家聊聊在各个使用场景下的 JavaScript 使用,以及在性能优化方面的优化经验等 二.各种场景下的 JavaScript 1.用于 UI 应用的 JavaScript 与大多数服务器端语言一样,用于客户端应用的 JavaScript 框架从来就不缺少.然而,和用在后端应用与服务中一样,笔者偏好使用较小的模块,将这些小模块

JavaScript 踩坑心得— 为了高速(上)

一.前言 很多情况下,产品的设计与开发人员一直想打造一套高品质的解决方案,从而快速.平稳地适应产品迭代.速度是衡量产品适应性的真正且唯一的标准,而且,这并不是笔者的一家之言. 「速度是衡量适应能力的真正指标.」 --艾瑞克·埃利奥特 许多公司选择 JavaScript,就是看中了它灵活.快速的优点.尽管此言非虚,但如果你在构建 JavaScript 系统时考虑得不够周全,灵活与高速的特性反而可能将你带入歧途. 一些值得特别关注的问题包括: 代码重复 样式或风格不一致 无法随意扩展 工具与模块选择

Android Studio踩坑记

拾起Android项目,需要使用Goolgle Play Services.顺应潮流换了Android Studio,开启了踩坑之旅. 尝试直接将Eclipse项目导入AS,结果根本没法用啊.正确的方法应该是升级ADT,在Eclipse下导出build.gradle然后再导入.但是升级的时间还不如直接新建项目把资源拷进去,同时也能了解一下AS默认的项目结构. 第一个遇到的问题是新建的项目没有assert和lib目录.java和res等资源都在src/main目录下,于是我将assets和libs

曾经踩坑党,如今护航忙 | 袋鼠云的双11故事之一

普通人提起双11,谈的都是剁手党 袋鼠云提起双11,谈的却是踩坑党 每年双11,同样的通宵达旦.同样的激动万分.同样的心跳加速,同样的肾上腺素增加,不一样的是:剁手党在Happy,踩坑党在忧虑. 这个双11,袋鼠小妹采访了曾经参与过阿里双11的几位袋鼠云技术专家,为大家分享他们别样的双11故事.他们分别是袋鼠云首席大数据架构师申杭.首席数据库架构师俊达(大家尊称:达叔),首席运维专家留良.首席售后服务专家南晨.(恩,都是首席,Teamleader级别) 袋鼠小妹有故事,那你准备好酒了么? ---

秦苍科技是如何管理数百个微服务并避免踩坑的?

[编者的话]过去两年中,微服务架构是一个非常热门的技术名词.秦苍科技也在微服务方面做了大量的投资和实践,我们有开发.测试.准生产.生产四套环境,每套环境有230+个微服务,总共有近1000个微服务. 本文讲的是秦苍科技是如何管理数百个微服务并避免踩坑的?秦苍科技为什么要采用微服务的架构?如何管理这么多微服务?本文将对这些问题进行阐述,希望对正在踩坑路上和即将踩坑的朋友们有所帮助. 为什么要使用微服务 关于微服务架构优点有很多讨论.但是,个人认为许多优点都可以算作一些"伪优点".例如:

【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历

2013年给1个大学的小客户部署过一个小型的Asp.NET网站,非常小,用的sqlite数据库,今年人家说要换台服务器,要重新部署一下,好吧,虽然早就过了服务时间,但无奈谁叫人家是客户了,二话不说,上,源代码和以前的文件都有,部署还不是分分钟的事情,打开IIS挂上去就行了.谁知道,这个部署将近花了2天的时间.看看踩坑过程和解决方法. 本文原文地址:http://www.cnblogs.com/asxinyu/p/4380380.html 回来一看,9个反对,我心痛啊,这些童鞋,你们觉得这篇文章哪

Android 百度定位SDK(v6.1.3)结合方向传感器

概述 这是第二篇关于百度地图SDK的博客. 推荐阅读: Android 百度地图周边雷达(v6.1.3) Android 百度鹰眼轨迹SDK(v2.1.6) 今天主要写百度地图定位和方向传感器结合这么一个中间块案例. 流程 申请密钥及相关配置请看:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/buildprojec 初始化百度地图SDK 定位到当前位置 获取方向传感器方向 设定到百度地图SDK 努力总会有收获,go! 为