Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框示例
作者:Windstep 发布时间:2022-03-29 15:15:49
背景
近期因实际项目需要,在特定操作下触发定位请求,取到用户位置及附近位置。
问题:
经初步选型,最终决定接入百度定位,按照百度定位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提供了View来进行绘图处理,在大部分情况下,View都能满足绘图需求。大家都知道View是通过刷新来重绘视图,An
- 前言在Java开发者中,字符串的拼接占用资源高往往是热议的话题.让我们深入讨论一下为什么会占用高资源。在Java中,字符串对象是不可变的,意
- 带返回值的方法练习需求: 设计一个方法可以获取两个数的较大值,数据来自于参数思路:1. 定义一个方法,用于获取两个数中的较大数public
- 前言作为一个开发者,日常会接触到很多优秀的软件,其实,或多或少会有这样的想法,我能不能开发一个自己软件,甚至办公软件都希望是Markdown
- 本文实例为大家分享了Unity实现Flappy Bird游戏的具体代码,供大家参考,具体内容如下参考:腾讯课程(零基础制作像素鸟) 环境:U
- Java 实现FTP服务实例详解1、FTP简介 FTP
- 什么是依赖注入首先,某个类的成员变量称为依赖,如若此变量想要实例化引用其类的方法,可以通过构造函数传参或者通过某个方法获取对象,此等通过外部
- 前言: 之前安装了Ubuntu 18.04,结果在安装Codeblocks / VScode还是安装gcc,c/c++的时候出现了一堆错误(
- md5 属于hash算法一类,是不可逆的消息摘要算法。与对称加密和非对称加密算法不一样,不需要加密密钥。注意:md5不是加密算法,只是将数据
- 一、题目描述给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种
- idea工具使用 Java Exception Breakpoint 添加异常断点,在IDE里,新建一个断点,类型是Java Excepti
- 本文实例为大家分享了Android开发实现抽屉菜单的具体代码,供大家参考,具体内容如下实现效果点击菜单图表即可进入抽屉代码实现1、打开app
- 本文实例为大家分享了Chronometer实现倒计时功能,Android提供了实现按照秒计时的API,供大家参考,具体内容如下一、自定义Ch
- 一、程序运行环境编译环境:IntelliJ IDEA所需测试文件:PDF、.pfx数字证书及密钥、PDF Jar包(Free Spire.P
- 1. Spring框架的注解式开发# Spring框架的注解式(Annotation)开发1. 注解式开发定义:通过Spring框架提供的一
- 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还
- Android 自定义组件成JAR包的实现方法,这里对自己实现的Android View 组件进行JAR 包的处理。
- 最近做的一个小项目中有这样的需求:整个项目有一份config.json保存着项目的一些配置,是存储在本地文件的一个资源,并且应用中存在读写(
- 这篇文章写的非常好,深入浅出,关键还是一位大三学生自己剖析的心得。这是我喜欢此文的原因。下面请看正文:作为一个大三的预备程序员,我学习and
- 本文为大家介绍了FTP上传下载队列窗口的实现方法,供大家参考,具体内容如下1、首先看一下队列窗口的界面2、看一下上传队列窗口的界面3、看一下