Android M - 有什么方法可以知道用户是否选择不再看到授予权限对话框?

问题描述 投票:0回答:3

如果应用程序调用ActivityCompat.requestPermissions(...),操作系统会显示一个带有“拒绝”和“允许”按钮的对话框。还有一个“不再显示此内容”复选框。

我无法让应用程序知道用户是否勾选了此框。在 onRequestPermissionsResult(...) 中,如果用户单击“拒绝”并且用户在单击“拒绝”之前勾选了复选框,则

grantResults
参数为 PERMISSION_DENIED

应用程序有什么方法可以确定用户是否不想再次看到该对话框?

android android-permissions
3个回答
7
投票

您可以使用 shouldShowRequestPermissionRationale() - 在某些情况下它会返回

false

  • 您之前从未请求过许可
  • 用户已选中“不再”复选框
  • 该权限已被策略禁用(例如,在工作情况下)

通过将其与共享首选项相结合来存储您是否曾经请求过权限,您可以有效地确定当您调用 requestPermissions() 时他们是否真的会看到该对话框。


1
投票

正如 Ian Lake 所暗示的(here),我们可以在持久存储中保存“用户已请求两次权限”值(例如共享首选项),以帮助我们确定何时忽略对 requestPermissions() 的调用由操作系统。

在我看来,我们应该将此布尔值保存在持久存储中的时间点是,在我们第二次调用 requestPermissions() 之前,用户点击自定义“请求权限原理”弹出窗口中的肯定按钮。

随后,如果 shouldShowRequestPermissionRationale() 返回

false
并且我们的“用户已请求权限两次”值为
true
,那么我们应该将用户引导至“设置”应用程序,而不是第三次调用 requestPermissions() 方法。

有关上述内容的具体示例,请参阅这个小应用程序,我将其放在一起以准确演示此解决方法。

综上所述,Android API 不允许我们向操作系统提出一个非常简单的问题:“用户是否永久拒绝了权限?”是一个巨大的耻辱。


0
投票

可能发生的情况以及在

checkSelfPermission(..)
(flag) 和
shouldShowRequestPermissionRationale(..)
(shouldShow) 调用后您将收到的值:

  1. 首次安装应用程序后/永远不要询问此权限:
    flag=-1, shouldShow=false
  2. 用户之前点击了拒绝
    flag=-1, shouldShow=true
  3. 用户之前点击了允许
    flag=0, shouldShow=false
  4. 用户之前点击了不再询问
    flag=-1, shouldShow=false
  5. 如果用户在设置中将权限切换为拒绝
    flag=-1, shouldShow=true

如您所见,第 1 个案例和第 4 个案例没有区别。因此,这就是为什么您需要保存有关先前权限请求的信息(是否是第一次权限请求)。我将此信息保存在应用程序首选项中。

© www.soinside.com 2019 - 2024. All rights reserved.