如果应用程序调用ActivityCompat.requestPermissions(...),操作系统会显示一个带有“拒绝”和“允许”按钮的对话框。还有一个“不再显示此内容”复选框。
我无法让应用程序知道用户是否勾选了此框。在 onRequestPermissionsResult(...) 中,如果用户单击“拒绝”并且用户在单击“拒绝”之前勾选了复选框,则
grantResults
参数为 PERMISSION_DENIED。
应用程序有什么方法可以确定用户是否不想再次看到该对话框?
您可以使用 shouldShowRequestPermissionRationale() - 在某些情况下它会返回
false
:
通过将其与共享首选项相结合来存储您是否曾经请求过权限,您可以有效地确定当您调用 requestPermissions() 时他们是否真的会看到该对话框。
正如 Ian Lake 所暗示的(here),我们可以在持久存储中保存“用户已请求两次权限”值(例如共享首选项),以帮助我们确定何时忽略对 requestPermissions() 的调用由操作系统。
在我看来,我们应该将此布尔值保存在持久存储中的时间点是,在我们第二次调用 requestPermissions() 之前,用户点击自定义“请求权限原理”弹出窗口中的肯定按钮。
随后,如果 shouldShowRequestPermissionRationale() 返回
false
并且我们的“用户已请求权限两次”值为 true
,那么我们应该将用户引导至“设置”应用程序,而不是第三次调用 requestPermissions() 方法。
有关上述内容的具体示例,请参阅这个小应用程序,我将其放在一起以准确演示此解决方法。
综上所述,Android API 不允许我们向操作系统提出一个非常简单的问题:“用户是否永久拒绝了权限?”是一个巨大的耻辱。
可能发生的情况以及在
checkSelfPermission(..)
(flag) 和 shouldShowRequestPermissionRationale(..)
(shouldShow) 调用后您将收到的值:
flag=-1, shouldShow=false
flag=-1, shouldShow=true
flag=0, shouldShow=false
flag=-1, shouldShow=false
flag=-1, shouldShow=true
如您所见,第 1 个案例和第 4 个案例没有区别。因此,这就是为什么您需要保存有关先前权限请求的信息(是否是第一次权限请求)。我将此信息保存在应用程序首选项中。