Android M -是否有任何方法知道用户是否选择永远不会再看到授予权限对话框



如果一个应用程序调用ActivityCompat.requestPermissions(…),那么操作系统将显示一个带有Deny和Permit按钮的对话框。还有一个"永远不要再展示这个"。蜱虫盒。

但是,我无法看到应用程序知道用户是否勾选了这个框。在onRequestPermissionsResult(…)中,如果用户单击Deny,并且如果用户在单击Deny之前勾选勾选框,则grantResults参数是PERMISSION_DENIED。

那么有没有一种应用程序可以发现用户是否不想再看到那个对话框呢?

您可以使用shouldShowRequestPermissionRationale() -它将在少数情况下返回false:

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

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

正如Ian Lake所暗示的(在这里),我们可以使用持久存储(例如共享首选项)作为启发式方法来确定何时对requestPermissions()的调用将被操作系统忽略。

在我看来,我们应该在持久存储中保存这个布尔值的点是当用户点击"请求权限合理性"中的"积极"按钮时。,从而触发第二次调用requestPermissions()。

随后,如果shouldShowRequestPermissionRationale()返回false,并且我们在持久存储中的布尔值返回true,那么我们应该引导用户到设置应用程序,而不是第三次调用requestPermissions()方法。

关于上面的一个具体例子,请看这个小应用程序,我把它放在一起演示了这个解决方案。

以上所述,Android api不允许我们询问操作系统的一个非常简单的问题,这是一个巨大的耻辱:"用户是否永久拒绝了权限?"

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
如您所见,第一个大小写与第四个大小写没有区别。因此,这就是为什么您需要保存有关以前的权限请求的信息(这是权限的第一个请求或不是)。

最新更新