Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框

背景:android

近期因实际项目须要,在特定操做下触发定位请求,取到用户位置及附近位置。

网络

问题:app

经初步选型,最终决定接入百度定位,按照百度定位SDK Android文档,接入过程相对顺利。
但随后发现,在小米系列等部分机型上,进入app后会出现"正在尝试 经过网络或者卫星对您的手机进行定位"。
很影响用户体验。测试

  

解决过程:ui

1.Flurry的小坑spa

项目中引入了数个第三方SDK,主要包括Flurry,友盟,个推,百度定位SDK等。在App启动初始化及进入到首页的执行流中,主要涉及到Flurry,友盟,个推。code

且经过对项目中全部引入第三方SDK JAR包中逐一搜索LocationManager,发现仅有Flurry和百度定位中含有。因而,初步定位到Flurry。去掉Flurry后,发如今此类机型上一进入app就出现定位请求弹框现场确实消失。blog

在Flurry官方文档上终于找到相应的开关接口:FlurryAgent.setReportLocation(boolean);此方法直接决定了Flurry是否上报用户地址位置信息,且其默认值为true。接口

因而,在对Flurry进行init后,直接调用FlurryAgent.setReportLocation(false); 再次测试,上述必现问题解决。rem

 

2.友盟的善良

本觉得问题至此已经结束,不想在随后的使用过程当中,在小米系列等机型上会不按期出现位置请求弹出框,且通过仔细核验,此时也并未触发app内自身的定位请求,且主要问题是:不按期出现,太诡异了!

网上查阅了一些资料,没有较好头绪。不过上面的Flurry解决过程给了一些思路,既然Flurry在有定位权限的状况下默认会获取地理位置信息,那么其余SDK会不会也相似呢?抱着好奇心态,看了下友盟的class文件,

发现了其中有一个方法setAutoLocation(boolean),哈,这不是跟Flurry一模一样嘛。可是,发现一个奇怪的现象,友盟中setAutoLocation方法已经废弃。

 1 public class MobclickAgent {
 2     private static final String a = "input map is null";
 3     private static final d b = new d();
 4 
 5     public MobclickAgent() {
 6     
 7     }
 8 
 9     /** @deprecated */
10     public static void setAutoLocation(boolean var0) {
11     
12     }
13     
14     ...
15     
16 }

 

已经废弃,且变成了一个空方法,那会不会就是友盟的霸道,在偷偷获取地理位置信息的时候甚至不给app提供开关接口呢?

此开关方法已经废弃,必有缘由,终于找到了老版的此方法没有废弃的友盟SDK,比较下class文件,发现老版的友盟SDK中存在LocationManager方法,但新版已经没有了。且友盟论坛上也有人说到了此问题,且去掉友盟后,

大量测试后发现此问题确实存在,看样子友盟仍是很善良的,直接去掉了获取用户定位信息,因此此开关方法固然废弃了。

值得赞一个。

 

3.百度定位的疑惑

百度定位SDK文档中要求具备定位权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

实际上,具备ACCESS_FINE_LOCATION权限也就具备了ACCESS_COARSE_LOCATION权限。大量测试结果代表,当手机上GPS开启时,定位弹出框出现几率较大,且百度定位是采用混合定位方式,项目中的实际需求无需精肯定位,

粗略定位已经能够知足需求,那么会不会跟权限有些关系,因而将ACCESS_FINE_LOCATION改为ACCESS_COARSE_LOCATION,且经过与其余app反解后横向对比,发现其余使用百度定位的app也只是使用了粗略定位权限,果断改之。

改后发现定位弹框不按期出现几率果真下降。

百度定位配置中还有以下Service配置

1 <!--百度定位服务-->
2 <service
3     android:name="com.baidu.location.f"
4     android:enabled="true"
5     android:process=":remote" >
6 </service>

实际测试中,发现若是权限是ACCESS_FINE_LOCATION,此处Service配置上加上android:exported="false"也必定程度上使得定位弹框出现几率下降,

此处果断加上。

1 <!--百度定位服务-->
2 <service
3     android:name="com.baidu.location.f"
4     android:enabled="true"
5     android:exported="false"
6     android:process=":remote" >
7 </service>

 

4.个推的坑货

上述修改后,不按期出现位置请求弹框几率相对已经较小。在长时间使用中偶有一次。那这定位请求究竟是谁触发的呢?大量测试下,发现当修改系统时间后,此问题变成必现。

既然找到了一个蹊跷的必现路径,就好定位了许多。果断去掉百度定位,友盟及Flurry。但保留定位权限,此问题在上述必现路径下依然必现。

去掉个推初始化等相关,此问题在上述必现路径下果断消失。发现就你了,个推!!

本觉得有些善良的你应该和Flurry及老版本的友盟同样,提供开关接口,但失望了!

联系个推所谓的技术支持,对方确定了个推在有定位权限状况先获取位置信息的同时,但针对开关接口问题回答潇洒!

但这确实影响到了用户体验!!

 

至此,困惑多日的问题终于找到缘由。


注:本文中

个  推   版  本:GetuiExt-2.0.3.jar,  GetuiSDK2.8.1.0.jar
友  盟   版  本:umeng-analytics-v5.4.1.jar
百度定位版本:locSDK-3.3.jar

 

后记:定位等此类权限敏感度较高,放开请谨慎,接入第三方SDK接入请谨慎选择。

相关文章
相关标签/搜索