由于现在位置信息变为了敏感数据,因此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)) returnval 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_LOCATIONACCESS_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)) returnAlertDialog.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 pagerequestPermissions(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

如何在Android 11 中正确请求位置权限?以及Android 8 - 11位置权限的变化及适配方法!相关推荐

  1. 实例讲解如何在DB2 UDB中正确的监控死锁

    实例讲解如何在DB2 UDB中正确的监控死锁 aS,?Kr P   前言:这篇文章通过详细的实例阐述了如何在DB2 UDB 中监控死锁的发生.在DB2 UDB中有两种类型的监控器:快照监控器和事件监控 ...

  2. android studio adil位置,在Android Studio 中正确使用adil ”绝对经典“

    今天调用远程服务中遇到了一个问题,哎,调了2个小时,后来终于解决,总结来看还是对新的Android Studio 不够熟悉.那么....就可以睡觉啦!!! 在Android Studio中使用进程通信 ...

  3. Android应用中网络请求库Volley的使用

    接上文,这次来说一下如何使用Volley,会给出一些范例,和原理 Volley使用 StringRequest // 初始化一个请求队列,RequestQueue是volley库的类 RequestQ ...

  4. 如何在ubuntu 2210中安装NVIDIA 515显卡驱动、CUDA 11.7和cuDNN 8.4

    如何在ubuntu 2210中安装NVIDIA驱动.CUDA和cuDNN 本篇讲解参考NVIDIA官方CUDA ToolKIT DOCUMENTATION和CUDNN DUCUMENTATION 本机 ...

  5. Android studio中正确引入so文件的方法

    相信很多朋友在使用Android studio开发中,遇到过如何引入第三方so文件的问题,然而第三方官方仅仅给出了ADT环境下的集成方式. Android studio中默认使用的是gradle编译方 ...

  6. Android App 中正确地使用 Splash Screen(译)

    经过一段时间的调研,我找到了许多Android中的splash (launch) screen实现方法,但是开发者通常是使用一个延时执行的Runnable来解决问题.这种方式我认为并不友好,不应该让用 ...

  7. linux etc fstab sw,如何在/etc/fstab中正确挂载NTFS分区?

    问题描述 经过一个令人讨厌的事件(我的第二个,你认为我已经学习)由无监督的自动播客下载填充我的整个分区后,我终于将~/Music移动到它自己的分区.我正在使用的分区已经格式化为NTFS(这是天才部分: ...

  8. Android studio中R类变成红色且文件报错无法实现最终效果的问题解决方法。

    在Android Studio中java包中,资源编译错误会有时一直存在或莫名其妙地出现.如遇到这种情况,请尝试如下操作.                                       ...

  9. Android项目中遇到的坑之(Android圆角圆形图 二)

    接着上一篇的问题来研究研究: **问题来了:效果是有了,但有发现么?我设置的scaleType只有fitxy 是有效果的,其他的都没有效果了.设置为其他的scaleType都变成matrix那种效果了 ...

最新文章

  1. Python 最强编辑器详细使用指南!
  2. ScrollView中嵌套ListView控件,数据无法显示完全
  3. python六十三: __call__
  4. 用反向传导模拟电子运动并模拟HF,HCl,HBr
  5. Hive到SparkSql
  6. C++ Prime:范围for语句
  7. img解包工具_3、Linux基础命令篇、压缩打包工具
  8. Linux 内核源代码的目录结构
  9. maven 部署nexus_设置本地Nexus存储库并从Maven部署WAR文件
  10. 程序员有哪些可以写博客的网站?
  11. Spring Boot中Thymeleaf的初步使用
  12. JAVA面试题:你怎么设计一个消息队列?
  13. FCN:Fully Convlutional Networks for semantic segmentation要点
  14. 全国省市区数据库sql
  15. ubuntu 18.04 安装网易云音乐
  16. 基于R语言的DynNom包绘制动态列线图
  17. iOS软键盘弹出后视图向上移动
  18. 源哥每日一题第一弹 codeforces 913 C. Party Lemonade
  19. word中图片变为灰度图像 黑白图像 黑白图片
  20. 上线网站详细介绍(服务器购买-域名申请-SSL证书申请)

热门文章

  1. Cuda与cudnn对应关系
  2. java-接口和继承:设计一个武器系统
  3. KVM- Guest Enter Guest Exit
  4. zsh: corrupt history file /home/csi/.zsh_history
  5. 【多目标追踪算法】Deepsort追踪实战
  6. 【CSS】button(按钮)去默认样式
  7. 周三我们上英语计算机和音乐,五年级英语(四)根据汉语意思完成句子.pdf
  8. 2022第二届网刃杯网络安全大赛-Re
  9. 2022第二届网刃杯网络安全大赛
  10. ktv 系统设计经验