新的 registerForActivityResult 方法使得请求权限变得非常简单,如下:
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
when {
granted -> getUserLocation()
else -> {
//permission denied
}
}
}
但是,如何检测用户已通过“不再询问”复选框拒绝权限或在 Android 11+ 中永久拒绝权限?在这些情况下,我想将用户重定向到设备的“设置”屏幕?
遗憾的是,Android API 不允许我们检测用户何时在较旧的 Android 版本中通过“不再询问”复选框拒绝了权限,或者在较新的 Android 版本(即 Android 11+)中两次(因此永久)拒绝了权限设备)。
专注于Android 11+,之所以上述不可能是因为Android API不允许我们区分以下两种情况:
在这两种情况下, shouldShowRequestPermissionRationale(permission:) 方法返回
false
并且 checkSelfPermission(permission:) 方法返回 PackageManager.PERMISSION_DENIED.
只要发挥一点聪明才智,我们就可以解决 Android API 的限制,并允许我们自己区分上述两种情况。请参阅我的回答此处,了解如何执行此操作的示例。
我建议将第一个拒绝视为“永远拒绝”,因为第一个拒绝可以通过 shouldShowRequestPermissionRationale() 检查。之后,您应该显示自己的对话框并将用户带到权限页面。