您是否已经厌倦了这样的经纬度返回值?
WX20200402-140732.jpg高德的那个则是返回错误信息:ErrorCode:12, errorInfo:缺少定位权限 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/
我的问题路径
首先从百度地图下手(这里很啰嗦,解决办法最后面看)
Round1
我们项目集成的是百度地图,最开始测试的最高机型是8.0,进去定位啥的都挺快,直到最近测试小哥说经常刚安装之后的5-10次 都没有定位,后面才开始有定位。
然后我开始了操作,首先看手机有没有同意权限,我还特意手动把所有权限都给勾上了,重开APP,在我认为这又是一个无趣的Bug的时候,定位值一看:4.9E-324
Round2
动态申请权限我们也是有做的,毕竟集成那会用的可是8.0的机器开整的。
例如代码(用的第三方框架申请):
new RxPermissions(this).request(Manifest.permission.ACCESS_FINE_LOCATION)
.subscribeWith(new PermissionSubscriber() {
@Override
public void onSuccess(Boolean granted) {
if (!granted) {
}
}
@Override
public void onFailed(String msg) {
FLog.e("", "RxPermissions: onFailed -> " + msg);
}
});
Round3
我承认我错了,于是我去下载了百度的Demo。跑起来,然后第一次能获取,2秒后瞬间报错505拿不到位置。Dome也真的是醉了。
准备弃坑去高德地图
Round1
Demo跑起来太香了,秒定! 这种感觉,如果要说形容起来的话,那应该,是恋爱的感觉⑧!
心动.AVI
二话不说直接集成进去! 步骤我很懂,动态权限要申请,我已经有了,所以直接略过。定位的一瞬间,我直接裂开,提示没有权限。然后我重新打开APP,也不好使。 反复打开10次都没有定位。
Round2
老老实实看看高德的Demo,看它申请了这几个权限:
//定位权限
Manifest.permission.ACCESS_COARSE_LOCATION
Manifest.permission.ACCESS_FINE_LOCATION
//存储权限
Manifest.permission.WRITE_EXTERNAL_STORAGE
Manifest.permission.READ_EXTERNAL_STORAGE
//手机电话状态权限
Manifest.permission.READ_PHONE_STATE
我看了一下最后这个权限,我们项目也是有的,因为需要获取IMEI,所以是申请了这个权限的。这个权限我有一篇文章看到解释是能获取电话状态什么的,大概是和定位当中的通过信号获取大概位置,以达到快速定位的目的,还可以通过wifi快速获取位置。但是还是不行。
然后我开始一个一个的权限删掉,因为高德的Demo是三个权限必须同意的那种,我先盲猜! 干掉了存储权限,我发现定位不受影响。秒定
然后我干掉了手机电话状态权限,又是秒定。这里补充一下,我有卸载重装,因为我怕定位缓存在糊弄我。
接下来就剩下定位权限了,我总不可能去掉这个权限了。于是我突然想起,那是夕阳下的。。。。 不对,高德Demo里面的定位权限为啥申请了俩
//定位权限
Manifest.permission.ACCESS_COARSE_LOCATION (访问CellID或WiFi,只要当前设备可以接收到基站的服务信号,便可获得位置信息)
Manifest.permission.ACCESS_FINE_LOCATION(通过GPS硬件获取精确定位)
我自己的是这幅模样
new RxPermissions(this).request(Manifest.permission.ACCESS_FINE_LOCATION)
.subscribeWith(new PermissionSubscriber() {
@Override
public void onSuccess(Boolean granted) {
if (!granted) {
}
}
@Override
public void onFailed(String msg) {
FLog.e("", "RxPermissions: onFailed -> " + msg);
}
});
这。。我要的不就是快速定位嘛~ 我一直测试的位置是在室内,搜星肯定成问题。而且我们项目也不是啥滴滴X车,不需要很准确的定位。于是乎我加上了一条,俩权限我都给申请了。
然后TIMI和APP同时启动,因为我感觉,这波,我赢定了! 果不其然~ 问题解决,百度也可以定位了,这里记录一下。
百度地图注意事项我也放一下上来
百度地图:
Android 7.0 开发须知
更新时间:2019年06月03日
在Android 6.0之后,Android系统增加了动态权限授予的控制,定位权限需用户确认后,App才能拿到如基站、WIFI等信息,从而实现定位。
在Android系统升级到7.0之后,我们发现,即使用户授予了App定位权限,App依然存在无法定位成功的问题。追查原因为:授予权限与初始化位置相关类之间存在时续逻辑问题,即如果先初始化如WifiManager、TelephonyManager,再请求确认定位权限,则即使用户确认可以授予App定位权限,App后续仍然拿不到基站、WIFI等信息,从而无法定位;反之,则可以在授予权限之后正常使用定位。
针对这个情况,定位SDK自v7.2版本起,新增加了重启接口,LocationClient.reStart(),您可以在用户确认授予App定位权限之后,调用该接口,定位SDK将会进行重新初始化的操作,从而规避上述问题。您如果存在长时间后台定位的需求,推荐在应用回到前台的时候调用一次该接口,我们了解到有些手机系统会回收长时间后台获取用户位置的位置权限。
更新一下,百度出来了这个问题的解决方案
Android 10.0 开发须知
更新时间:2020年03月05日
1.在Android10.0系统上,当应用退到后台后为了保留对设备位置信息的访问权,需要在清单中声明服务类型为:android:foregroundServiceType="location"的前台服务或者添加后台定位权限android.permission.ACCESS_BACKGROUND_LOCATION。
注意:个别厂商会对定制版本的机型做特别适配,例如华为手机会严格限制后台定位导致无法使用后台定位功能,开发者需要自行和厂商联系。
2.如果应用以 Android 10 或更高版本为目标平台,则它必须具有 ACCESS_FINE_LOCATION 权限才能使用 WLAN、WLAN 感知或蓝牙 API 中的一些方法。
注意:如果您的应用在 Android 10 或更高版本平台上运行,但其目标平台是 Android 9(API 级别 28)或更低版本,则只要您的应用已声明 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限,您就可以使用受影响的 API(WifiP2pManager API 除外)。
结语:菜鸡问题多,很简单的问题都没发现。
网友评论