android - 如何识别用户是否在Android上的权限对话框之外单击
问题描述
由于在 Android 11 ( https://developer.android.com/about/versions/11/privacy/location ) 上引入了新的位置权限更改,因此需要更仔细地处理权限。我们现在只能请求两次后台位置权限
我想向用户显示一个取决于其位置权限状态的对话框。
问题是系统处理对话框外的点击与拒绝权限相同,但它显然不计入PermissionsUtil.shouldShowRequestStoragePermissionRationale
限制。因此很难区分用户处于哪种状态。
我最初的问题是:如何处理这种特定情况?
但我想更有用的是一般问题:
如何识别用户是在系统权限对话框之外按下还是直接拒绝了权限?.
解决方案
根据每个权限的结果,您可以将其添加到列表中,然后您可以知道用户是否完全拒绝/拒绝了权限。可以通过以下方式完成:
private val requestPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { result: MutableMap<String, Boolean> ->
val deniedList: List<String> = result.filter {
!it.value
}.map {
it.key
}
when {
deniedList.isNotEmpty() -> {
val map = deniedList.groupBy { permission ->
if (shouldShowRequestPermissionRationale(permission)) DENIED else EXPLAINED
}
map[DENIED]?.let {
// request denied , request again
}
map[EXPLAINED]?.let {
//request denied ,send to settings
}
}
else -> {
//All request are permitted
}
}
}
推荐阅读
- amazon-web-services - Outbond 规则哪个目的地是它本身?
- java - 如何在 Java 中简化印度地区的字符串?(问题扩展)
- splunk - Splunk : 在 splunk 中查找前 1000 名的百分比
- javascript - 角度的多个过滤器
- google-cloud-platform - Datastore 的实体与 GCP Firestore 的文档
- reactjs - material-ui theme.palette.primary.light 有什么作用?
- javascript - 为什么找不到我包含的包裹?
- symfony - 即使主图像存储在 S3 上,Sulu 图像格式变体也始终存储在本地
- sql - Redshift SQL - 估算缺失值:修改仅在状态更改为具有每日数据时存储数据的表
- azure - 在 Azure Pipelines 中缓存 node_modules 比安装它们需要更长的时间