欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-02 13:31:22
背景 近期因实际项目需要,在特定操作下触发定位请求,取到用户位置及附近位置。 问题: 经初步选型,最终决定接入百度定位,按照百度定位sdk android文档,接...

背景

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

问题:

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

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

解决过程:

1.flurry的小坑

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

且通过对项目中所有引入第三方sdk jar包中逐一搜索locationmanager,发现仅有flurry和百度定位中含有。于是,初步定位到flurry。去掉flurry后,发现在此类机型上一进入app就出现定位请求弹框现场确实消失。

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

于是,在对flurry进行init后,直接调用flurryagent.setreportlocation(false); 再次测试,上述必现问题解决。

 2.友盟的善良

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

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

发现了其中有一个方法setautolocation(boolean),哈,这不是跟flurry如出一辙嘛。但是,发现一个奇怪的现象,友盟中setautolocation方法已经废弃。

public class mobclickagent {
  private static final string a = "input map is null";
  private static final d b = new d();

  public mobclickagent() {
  
  }

  /** @deprecated */
  public static void setautolocation(boolean var0) {
  
  }
  
  ...
  
}

已经废弃,且变成了一个空方法,那会不会就是友盟的霸道,在偷偷获取地理位置信息的时候甚至不给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配置

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

实际测试中,发现如果权限是access_fine_location,此处service配置上加上android:exported="false"也一定程度上使得定位弹框出现概率降低,

此处果断加上。

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

4.个推的坑货

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

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

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

本以为有些善良的你应该和flurry及老版本的友盟一样,提供开关接口,但失望了!

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

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

至此,困惑多日的问题终于找到原因。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。