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

背景

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

问题:

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

解决过程:

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及老版本的友盟一样,提供开关接口,但失望了!

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

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, 定位权限
开启定位权限
,以便于您获取更多的相关知识。

时间: 2024-12-27 21:29:08

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

CM10.2版Android 4.3成功移植小米2S等机型

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   [ 科技讯]7月30日消息,新版本的Android 4.3上周正式发布了.虽然是小幅升级,但其中依然包含着不少新鲜且明显的改动.不少用户也希望能尽早用上这一最新系统,目前,已有多款机型移植了CM10.2版本的Android 4.3,并且包括谷歌 Nexus官方包在内的9款机型均支持了 一键刷机.     除了谷歌官方宣布支持的Nexus 4.Nexus 7.Ne

android异步请求服务器数据示例_Android

1.在android4.0以后的版本,主线程(UI线程)不在支持网络请求,原因大概是影响主线程,速度太慢,容易卡机,所以需要开启新的线程请求数据: 复制代码 代码如下: thread1 = new Thread(){@Overridepublic void run() {  try {    URL url = new URL(WebUrlManager.CARSEVER_GetCarsServlet);    HttpURLConnection conn = (HttpURLConnectio

Android Studio 插件开发详解四:填坑

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78265540 本文出自[赵彦军的博客] 插件打包 坑一 id不能重复 坑二插件描述信息要完整 坑三插件支持的产品要说明 总结 在前面我介绍了插件开发的基本流程 [Android Studio 插件开发详解一:入门练手] [Android Studio 插件开发详解二:工具类] [Android Studio 插件开发详解三:翻译插件实战] 在经历的前面的3篇文章,我相信大家都可以

Android—基于微信开放平台v3SDK开发(微信支付填坑)_Android

接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束...进入正题 开发准备: 1.在微信开放平台申请账号 2.成功后创建应用,就是填一些看似很官方很正经的资料了...(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微   信支付了????-------想多了,真的) 3.微信支付是需要额外

Android—基于微信开放平台v3SDK开发(微信支付填坑)

接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束...进入正题 开发准备: 1.在微信开放平台申请账号 2.成功后创建应用,就是填一些看似很官方很正经的资料了...(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微   信支付了????-------想多了,真的) 3.微信支付是需要额外

Java web 开发填坑记 1 -如何正确的下载 eclipse

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72561763 本文出自[赵彦军的博客] Java web 开发填坑记 1 -如何正确的下载 eclipse Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目 Java web 开发填坑记-如何正确的下载 eclipse 最近在做 Java web 相关的开发,遇到的很多问题,也填了很多坑,就来做一下总结. 首先遇到的第一个问题就是,如何正确的下载 Ec

Struts1.x系列教程(9):上传任意多个文件

从<Struts1.x系列教程(8):上传单个文件>中给出的例子可以看出,在Struts1.x中上传单个文件是非常简单的,但在实际应用中,上传文件的个数一般是不确定的,如在网络硬盘中,用户可以根据自己的需要上传任意多个文件(当然,网络硬盘一次上传文件的数目一般也是有上限的,如50个,但用户可以只上传了3个文件,因此,在这种情况下,上传文件的个数也是不确定的).如果读者用过"网易网盘"或其他类似的服务程序,它们的上传文件功能基本上都是根据用户选择的文件多少来添加要上传的文件(

英特尔CPU芯片T系列、E系列、T系列的区别

英特尔CPU芯片T系列.E系列.T系列有什么区别?英特尔将旗下个人PC用CPU产品划分了T.E.P三大系列,作为购买英特尔平台的用户,我们很有必要了解它们的区别,搞清楚它们代表的不同性能指标. 那么,你了解它们分别代表什么含义吗?购机时选择哪种最好?一起来看看CPU的购机指南. 三者区别: E是主流桌面双核系列,台式的65nm酷睿双核CPU(如E6300)和台式的65nm的奔腾双核CPU(如E2160): E1,E3是赛扬双核; E2,E5,E6是奔腾双核; E4,E7,E8是酷睿双核(其中还包

AMD公司A系列与FX系列CPU的区别是什么?

  AMD公司A系列与FX系列CPU的区别是什么?事实上,前面的CPU的概念是错误的,真不知道如何表达才对.AMD公司A系列与FX系列区别很明显,A系列实现了一块芯片上集成GPU和CPU的功能.目前主流的AMD公司APU是LLano APU .A系列包括AMD A4.A6.A8及A10.其中A4和A6是低端产品.FX系列才是CPU的最新产品(还应该包括毒龙.速龙.闪龙系列),那么他们之间有哪些区别呢?下面我们就来一起学习下AMD公司A系列与FX系列APU的相关知识.高手飘过! AMD公司A系列A