android - 检测是否可以请求或永久拒绝许可
问题描述
情况
我的一个片段访问了相机。所以当然我需要先检查我的活动中的权限,然后再重定向到它。如果用户拒绝该权限,则 Activity 完成并将他重定向到他所在的上一个 Activity。
此外,我想在 Activity 启动并检测到权限被永久拒绝时显示一个不同的片段。(android权限对话框上的小复选框“不再询问”)
问题
我找不到合适的检测方法,权限是否仅被拒绝一次,或者如果上次选中“不再询问”复选框并永久拒绝权限。
请记住,我不想在 onRequestPermissionsResult 回调中知道这一点。如果权限当前被授予、拒绝或永久拒绝,我需要在我的活动的 onCreate 中知道。
我尝试过
ActivityCompat#shouldShowRequestPermissionRationale
的似乎是检测过去是否拒绝了许可。如果它只被拒绝一次而不是永久拒绝,它也会返回 true。
PermissionChecker#checkPermission()
似乎没有注意到永久和仅一次拒绝许可状态之间的任何区别。
问题
是否有任何方法可以检测权限是否被拒绝但仍然可以请求,或者是否被永久拒绝?
解决方案
是否有任何方法可以检测权限是否被拒绝但仍然可以请求,或者是否被永久拒绝?
不幸的是,当用户选择“不再询问”时,没有可用的官方 API 来检测权限是否被永久拒绝
有一种解决方法使用shouldShowRequestPermissionRationale
. 使用默认值创建一个 SharedPreferencefalse
并在其中存储返回的值shouldShowRequestPermissionRationale
。在更新值之前,请检查设置的值是否为true
. 如果是,true
则不要更新它。
每当您要检查权限时,请从 中获取值SharedPreference
和返回的当前值shouldShowRequestPermissionRationale
。如果 shouldShowRequestPermissionRationale
returnfalse
但 value from SharedPreference
is true
,则可以推断出Never ask again
是用户选择的。
您可以参考我的博客,我在其中描述了这种方法。
推荐阅读
- react-native - React Native Android - 生命周期方法
- python - Google 日历 API 全天活动时区
- linux - 使用绑定挂载的主机目录和容器之间的 Docker 文件权限不匹配
- amazon-cloudwatch - 为什么 fluentd-cloudwatch Kube deamonSet 无法将日志从指定目录发送到 cloudwatch?
- c - 为什么不满足if条件?
- c++ - "(void) cast" 与 "__attributes__" 用于消除未使用的参数警告之间的功能区别是什么?
- react-native - 实现 react-native 渲染日历周视图
- python - Python:将以下字符串转换为字典的优雅解决方案
- flutter - 如何从本地文件的目录中导入 dart 文件?
- c++ - c++中的多重递归