百度android定位返回161,重拾百度定位之踩坑篇(下)接上⽂
实现BDLocationListener接⼝
/*****
* 定位结果回调,重写onReceiveLocation⽅法
*
*/
private BDLocationListener mListener = new BDLocationListener() {
@Override
publicvoid onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
if (null!= location ) {
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
/**
* 时间也可以使⽤systemClock.elapsedRealtime()⽅法 获取的是⾃从开机以来,每次回调的时间;
* Time() 是指服务端出本次结果的时间,如果位置不发⽣变化,则时间不变
*/
sb.Time());
sb.append("\nlocType : ");// 定位类型
sb.LocType());
sb.append("\nlocType description : ");// *****对应的定位类型说明*****
//sb.LocTypeDescription());
sb.append("\nlatitude : ");// 纬度
sb.Latitude());
sb.append("\nlontitude : ");// 经度
sb.Longitude());
sb.append("\nradius : ");// 半径
sb.Radius());
sb.append("\nCountryCode : ");// 国家码
sb.CountryCode());
sb.append("\nCountry : ");// 国家名称
sb.Country());
sb.append("\ncitycode : ");// 城市编码
sb.CityCode());
sb.append("\ncity : ");// 城市
sb.City());降息对银行股是利好还是利空
sb.append("\nDistrict : ");// 区
sb.District());
sb.append("\nStreet : ");// 街道
sb.Street());
sb.append("\naddr : ");// 地址信息
sb.AddrStr());
sb.append("\nUserIndoorState: ");// *****返回⽤户室内外判断结果*****
刘强东奶茶妹妹十一在澳洲举行婚礼//sb.UserIndoorState());
sb.append("\nDirection(not all devices have value): ");
sb.Direction());// ⽅向
sb.append("\nlocationdescribe: ");
sb.LocationDescribe());// 位置语义化信息
sb.append("\nPoi: ");// POI信息
if (PoiList() != null&& !PoiList().isEmpty()) {
西游记红孩儿扮演者for(inti = 0; i Name() +";");
}
}
if (LocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
sb.append("\nspeed : ");
sb.Speed());// 速度 单位:km/h
sb.append("\nsatellite : ");
sb.SatelliteNumber());// 卫星数⽬
sb.append("\nheight : ");
sb.Altitude());// 海拔⾼度 单位:⽶
sb.append("\ngps status : ");
//sb.GpsAccuracyStatus());// *****gps质量判断*****
sb.append("\ndescribe : ");
sb.append("gps定位成功");
} elseif (LocType() == BDLocation.TypeNetWorkLocation) {// ⽹络定位结果// 运营商信息
if (location.hasAltitude()) {// *****如果有海拔⾼度*****
sb.append("\nheight : ");
sb.Altitude());// 单位:⽶
}
sb.append("\noperationers : ");// 运营商信息
sb.Operators());
sb.append("\ndescribe : ");
sb.append("⽹络定位成功");
} elseif (LocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
sb.append("\ndescribe : ");
sb.append("离线定位成功,离线定位结果也是有效的");
} elseif (LocType() == BDLocation.TypeServerError) {
sb.append("\ndescribe : ");
sb.append("服务端⽹络定位失败,可以反馈IMEI号和⼤体定位时间到loc-bugs@baidu,会有⼈追查原因");
} elseif (LocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("⽹络不同导致定位失败,请检查⽹络是否通畅");
} elseif (LocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("⽆法获取有效定位依据导致定位失败,⼀般是由于⼿机的原因,处于飞⾏模式下⼀般会造成这种结果,可以试着重启⼿机");
跨行转账要收多少手续费}
tv_location.setText(sb+"\n定位结束");
locationService.stop();
}else{
tv_location.setText("\n定位失败");
}
}
};
通过上⾯的实现后,我们在想要定位的地⽅注册下回调,并调⽤start()⽅法即可以获取位置了,我对注册开始暂停做了下简单封装,具体代码参考LocationService。如果要写的项⽬⾥也要把回调接⼝封装,⾃定义⼀个接⼝回调返回定位后的详细位置信息。到这⾥即可成功定位了,下⾯就开始介绍下这个过程会出现的问题。
定位问题分析
在分析之前我们先看下百度定位返回的错误码,分析定位的问题也就是分析出现错误码的原因。
获取定位返回错误码::
publicintgetLocType ( )
返回值:
61 : GPS定位结果,GPS定位成功。
62 : ⽆法获取有效定位依据,定位失败,请检查运营商⽹络或者WiFi⽹络是否正常开启,尝试重新请求定位。
63 : ⽹络异常,没有成功向服务器发起请求,请确认当前测试⼿机⽹络是否通畅,尝试重新请求定位。
65 : 定位缓存的结果。
66 : 离线定位结果。通过requestOfflineLocaiton调⽤时对应的返回结果。莫小棋电影
67 : 离线定位失败。通过requestOfflineLocaiton调⽤时对应的返回结果。
68 : ⽹络连接失败时,查本地离线定位时对应的返回结果。
西出阳关无故人全诗161: ⽹络定位结果,⽹络定位成功。
162: 请求串密⽂解析失败,⼀般是由于客户端SO⽂件加载失败造成,请严格参照开发指南或demo开发,放⼊对应SO⽂件。
167: 服务端定位失败,请您检查是否禁⽤获取位置信息权限,尝试重新请求定位。
502: AK参数错误,请按照说明⽂档重新申请AK。
505:AK不存在或者⾮法,请按照说明⽂档重新申请AK。
601: AK服务被开发者⾃⼰禁⽤,请按照说明⽂档重新申请AK。
602: keymcode不匹配,您的AK配置过程中安全码设置有问题,请确保:SHA1正确,“;”分号是英⽂状态;且包名是您当前运⾏应⽤的包名,请按照说明⽂档重新申请AK。
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⽂件加⼊下⾯代码即可
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}