造成这个问题的原因,我总结了下:
一、权限问题
下面这这段话引用自百度地图文档。
在Android 6.0之后,Android系统增加了动态权限授予的控制,定位权限需用户确认后,App才能拿到如基站、WIFI等信息,从而实现定位。
在Android系统升级到7.0之后,我们发现,即使用户授予了App定位权限,App依然存在无法定位成功的问题。追查原因为:授予权限与初始化位置相关类之间存在时续逻辑问题,即如果先初始化如WifiManager、TelephonyManager,再请求确认定位权限,则即使用户确认可以授予App定位权限,App后续仍然拿不到基站、WIFI等信息,从而无法定位;反之,则可以在授予权限之后正常使用定位。
在Android系统升级到7.0之后,我们发现,即使用户授予了App定位权限,App依然存在无法定位成功的问题。追查原因为:授予权限与初始化位置相关类之间存在时续逻辑问题,即如果先初始化如WifiManager、TelephonyManager,再请求确认定位权限,则即使用户确认可以授予App定位权限,App后续仍然拿不到基站、WIFI等信息,从而无法定位;反之,则可以在授予权限之后正常使用定位。
针对这个情况,定位SDK自v7.2版本起,新增加了重启接口,LocationClient.reStart(),您可以在用户确认授予App定位权限之后,调用该接口,定位SDK将会进行重新初始化的操作,从而规避上述问题。您如果存在长时间后台定位的需求,推荐在应用回到前台的时候调用一次该接口,我们了解到有些手机系统会回收长时间后台获取用户位置的位置权限。
二、.SO文件问题
从官网上下载sdk,检查libs文件夹下是否缺少.so库。三、AK问题
我在集成百度地图的时候,就遇到这个问题。
申请好ak之后,里面要配置SHA的值,如下图:
由于疏忽,我把获取到的开发版SHA1填到发布版SHA1上了,这样就导致了一个问题,自己调试的时候,通过android studio直接运行,没有问题,但是发了正式带签名的apk时候,就拿不到经纬度,获取到的就是4.9E-324。
所以当大家通过一番调试后,还是获取到4.9E-324,这时候就要看看自己在百度上填的SHA1是不是正确的。
四、获取SHA1的方法
① 获取开发版SHA1
1、win+r,输入cmd打开命令提示符界面;
2、 输入命令 C: 进入c盘;
3、接着 输入命令 cd Users\Administrator 其中Administrator是自己的用户名 Administrator文件下有个.adnroid文 件, 输入命令 cd .android,最后就找到了.android;
4、输入命令 keytool -list -v -keystoredebug.keystore 其中debug.keystore是studio默认的keystore,按回车,然后 输入秘钥:android(系统默认) 回车(秘钥库口令是看不到的),得到开发版SHA1。
② 获取发布版SHA1
获取发布版的SHA1,跟获取开发版的SHA1的1、2、3步骤一样,不一样的地方就是第4步稍微不同而已。
1、同上;
2、同上;
3、同上;
4、输入命令 keytool -list -v -keystore 文件目录\自己的签名文件 比如我的:keytool -list -v -keystore E:\签名文件\android.keystore , 接着按回车,然后输入秘钥:(自己的) 回车(秘钥库口令是看不到的),得到发布版SHA1: