Android M - 有没有办法知道用户是否选择永远不再显示授权权限对话框?

3
如果一个应用程序调用ActivityCompat.requestPermissions(...), 那么操作系统将显示一个带有拒绝和允许按钮的对话框。还有一个“不再显示”复选框。
然而,我没有看到任何方法可以让应用程序知道用户是否勾选了此框。在onRequestPermissionsResult(...)中,如果用户单击拒绝并在单击拒绝之前勾选了复选框,则grantResults参数为PERMISSION_DENIED
那么,有没有办法让应用程序找出用户不想再次看到该对话框呢?
3个回答

6
您可以使用 shouldShowRequestPermissionRationale() - 在以下几种情况下它将返回 false

  • 您以前从未请求过该权限
  • 用户已勾选“不再提示”复选框
  • 权限已被政策禁用(例如在工作场所)

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


对于任何偶然发现这个答案并希望更深入了解如何将 shouldShowRequestPermissionRationale() 方法与共享首选项中的值相结合的人,请参阅我在这里的答案。 - Adil Hussain

1

正如Ian Lake所暗示的(这里),我们可以使用持久化存储(例如共享首选项)作为一种启发式方法来确定操作系统何时会忽略对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
如您所见,第一个情况和第四个情况没有区别。所以,这就是为什么您需要保存有关先前权限请求的信息(它是否是权限的第一个请求)。我将此信息保存在应用程序首选项中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接