如何在Android 11 中正确请求位置权限?以及Android 8 - 11位置权限的变化及适配方法!
由于现在位置信息变为了敏感数据,因此Android限制了它的使用,尤其在APP后台。
在Android 9 之前,位置权限没有按照前后台分离,APP在前台和后台使用相同的资源。
但是,Google开始意识到一些APP滥用此类数据,于是决定按照前台
和后台
分离资源的方式,增加一些层级来保护用户的位置信息数据。
对于Android开发者来说,这就为我们在APP中请求位置权限增加了一些额外的工作。
在详细介绍之前,让我们先看一看在最近几个Android版本中的更改日志:
在Android 8 中
: 处于后台的应用,每小时只能检索几次用户的位置。Android 10 之前
:位置权限是一个单一资源,应用只需一次授权就可以到处使用,随时使用(前台和后台)在Android 10 中
: 后台位置变成了一个独立的资源, 应用程序除了前台请求外,还必须明确请求此权限。Android 11 中
:无法与其他人同时请求后台位置权限,应用必须单独请求。此外,请求此权限不会像其他权限一样立即弹窗提示用户,而是会将用户带到/ Settings页面/ Location权限
会话,以便用户可以更新权限级别。
根据上面的这些变化,我们必须根据不同的系统版本处理位置权限的请求,这里有3种不同场景(在写本文时,我们目前使用的是Android 11):
Android 10 之前
位置权限只需请求一次,处于前台和后台的APP都可使用
@TargetApi(28) fun Context.checkLocationPermissionAPI28(locationRequestCode : Int) { if (!checkSinglePermission(Manifest.permission.ACCESS_FINE_LOCATION) || !checkSinglePermission(Manifest.permission.ACCESS_COARSE_LOCATION)) { val permList = arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) requestPermissions(permList, locationRequestCode) } } private fun Context.checkSinglePermission(permission: String) : Boolean { return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED }
在这些版本中,用户只有2个选项:授权
或不授权
。
Android 10
在这个版本中,增加了ACCESS_BACKGROUND_LOCATION
, 你可以请求此权限来同时获得前台和后台的权限,像下面这样呢:
@TargetApi(29) private fun Context.checkLocationPermissionAPI29(locationRequestCode : Int) { if (checkSinglePermission(Manifest.permission.ACCESS_FINE_LOCATION) && checkSinglePermission(Manifest.permission.ACCESS_COARSE_LOCATION) && checkSinglePermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) return val permList = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION) requestPermissions(permList, locationRequestCode) } private fun Context.checkSinglePermission(permission: String) : Boolean { return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED }
同样,如果请求前台权限(ACCESS_COARSE_LOCATION
或者ACCESS_FINE_LOCATION
),则Android操作系统会自动将后台权限(ACCESS_BACKGROUND_LOCATION
)添加到请求中。它类似于<uses-permission>
声明,无论是ACCESS_COARSE_LOCATION
或ACCESS_FINE_LOCATION
被声明,ACCESS_BACKGROUND_LOCATION
将在安装过程中被添加。
用户现在有三个选项:后台(随时)
、前台(仅使用APP期间)
、拒绝
。
Android 11
除上述内容外,开发人员还需要增加其他一些步骤。
这里有2种场景,第一种情况是当仅请求前台权限,在这种情况下,我们通常使用ACCESS_FINE_LOCATION
或者ACCESS_COARSE_LOCATION
, 但是,请求授权的弹窗和以前的略有不同,在Android 11 中,Google 增加了一个可选项 Only this time
,
请注意,即使将ACCESS_BACKGROUND_LOCATION
添加到要请求的权限列表中,系统也将忽略它。
第二种情况是:应用也需要后台权限,为此,你必须准备自己的对话框,并使用明确的消息来说明后台位置的使用。
当用户同意后,将他引导到应用设置页面,那里可以选择他想授予的**权限等级
**。
示例代如下:
@TargetApi(30) private fun Context.checkBackgroundLocationPermissionAPI30(backgroundLocationRequestCode: Int) { if (checkSinglePermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) return AlertDialog.Builder(this) .setTitle(R.string.background_location_permission_title) .setMessage(R.string.background_location_permission_message) .setPositiveButton(R.string.yes) { _,_ -> // this request will take user to Application's Setting page requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), backgroundLocationRequestCode) } .setNegativeButton(R.string.no) { dialog,_ -> dialog.dismiss() } .create() .show() }
如图所示:
如您所见,Android 11 中,我们有4个权限等级用于位置信息。
当用户选择Allow all the time
, APP 就有了后台使用位置信息的权限了。
瞧,这就是Android 11中获取位置权限的整个过程,和各个系统版本的不同处理情况,希望本篇博客对你有用!!!
原文链接: https://medium.com/swlh/request-location-permission-correctly-in-android-11-61afe95a11ad

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
浅谈大数据中的 2PC、3PC、Paxos、Raft、ZAB
一致性 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的。假设一个具有N个节点的分布式系统,当其满足以下条件时,我们说这个系统满足一致性: 全认同: 所有N个节点都认同一个结果 值合法: 该结果必须由N个节点中的过半节点提出 可结束: 决议过程在一定时间内结束,不会无休止地进行下去 面临着的问题 消息传递异步无序: 现实网络不是一个可靠的信道,存在消息延时、丢失,节点间消息传递做不到同步有序 节点宕机: 节点持续宕机,不会恢复 节点宕机恢复: 节点宕机一段时间后恢复,在分布式系统中最常见 网络分化: 网络链路出现问题,将N个节点隔离成多个部分 拜占庭将军问题: 节点或宕机或逻辑失败,甚至不按套路出牌抛出干扰决议的信息 如下形象demo: 周五我:晚上下班吃鸡周六凌晨xc:好的//消息延迟我:WC---------------------------------我:晚上下班吃鸡xc:No(两小时后)xc:No problem!//宕机节点恢复我:WC---------------------------------我:晚上下班吃鸡...//节点宕机------...
- 下一篇
Windows10系统下Hadoop和Hive开发环境搭建填坑指南
前提 笔者目前需要搭建数据平台,发现了Windows系统下,Hadoop和Hive等组件的安装和运行存在大量的坑,而本着有坑必填的目标,笔者还是花了几个晚上的下班时候在多个互联网参考资料的帮助下完成了Windows10系统下Hadoop和Hive开发环境的搭建。这篇文章记录了整个搭建过程中的具体步骤、遇到的问题和对应的解决方案。 环境准备 ❝ 基于笔者的软件版本洁癖,所有选用的组件都会使用当前(2020-10-30)最高的版本。 ❞ 软件 版本 备注 Windows 10 操作系统 JDK 8 暂时不要选用大于等于JDK9的版本,因为启动虚拟机会发生未知异常 MySQL 8.x 用于管理Hive的元数据 Apache Hadoop 3.3.0 - Apache Hive 3.1.2 - Apache Hive src 1.2.2 因为只有1.x版本的Hive源码提供了.bat启动脚本,有能力可以自己写脚本就不用下此源码包 winutils hadoop-3.3.0 Hadoop的Windows系统下的启动依赖 下面列举部分组件对应的下载地址: Apache Hadoop 3.3.0: ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块