近期发现很多开发者反馈定位开發过程中遇到返回错误码 167 的情况原因是:Google在Android 6.0中引入了动态权限获取机制(Runtime
动态权限获取要求开发者在调用涉及相关权限的代码时,使用系统接口来动态得申请相应权限我们定位SDK涉及权限即在此范畴中。
在未获取到定位权限情况下定位SDK获取到的定位依据(基站,Wifi)均为涳值因此无法有效定位,定位服务会返回167结果
6.0对于动态权限机制的开启主要根据应用设定的targetSdkVersion,具体来讲:
因此需要在项目配置文件中修改您的targetSdkVersion配置
在Android 6.0系统中,需要动态获取的权限涉及到:
此接口会触发系统弹窗用户选择后触发Activity中的回调函数:
// 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)
我的手机是6.0系统定位误差非常大,是怎么回事
Android 6.0原生系统与部分厂商定制的6.0系统在系统萣位开关表现上稍有差异。具体来讲:
|
原生系统(也包括未进行定制的系统)
|
原生系统下位置开关控制影响到系统级的GPS及网络定位:
在關闭位置开关情况下,应用无法获取到Wifi信息也无法使用GPS,仅可使用基站定位(cl类型)*造成定位误差变大;
打开位置开关后,应用可以使用Wifi信息或GPS进行定位会大幅提升定位精度
|
厂商定制系统(部分)开关仅影响GPS使用:
关闭GPS开关情况下,应用仍可访问到Wifi信息可以使用wifi定位
打开GPS开关情况下,应用才可以使用GPS定位
|
1.关于原生系统定位开关会影响Wifi获取的问题可参照Google Android Bug反馈论坛:
这是6.0原生系统已知问题,需要Google修复;厂商定制ROM表现会有所差异
也可参照国内一些开发者文章描述:
2.部分早期6.0版存在位置开关关闭后无法定位的问题目前测试最新的6.0版本原苼系统,已不存在此问题
针对6.0系统的位置开关问题。由于GPS设置的行为在各版本中一致因此可以简单的使用系统API来判断用户是否打开了位置按钮,
让检测到系统版本为6.0并且用户未打开按钮时,进行提示
// 未打开位置开关,可能导致定位失败或定位不准提示用户或做相應处理