如何在调用 requestPermissions 之前知道用户检查“不再询问”

Posted

技术标签:

【中文标题】如何在调用 requestPermissions 之前知道用户检查“不再询问”【英文标题】:How to know user check "Never ask again" before calling requestPermissions 【发布时间】:2016-04-07 00:45:06 【问题描述】:

我想知道,如何知道用户在致电requestPermissions 之前勾选“不再询问”。

我已经通过android M - check runtime permission - how to determine if the user checked "Never ask again"?,但还没有找到合适的解决方案。

在此之前,请允许我解释一下我的动机。

我有以下反馈对话框。

当用户勾选回复我 明确,如果权限尚未授予,我将执行requestPermissions。可能有 3 种可能的结果。

第一个结果。第一次调用requestPermissions 时发生

第二个结果。在第二次或更长时间调用requestPermissions 时发生

第三个结果。当用户勾选“不再询问”时发生

不会显示任何对话框。 requestPermissions 永远不会弹出任何对话框。我需要代表用户取消勾选复选框,因为onRequestPermissionsResult 会告诉我权限被拒绝。

第三个结果将产生糟糕的用户体验。当用户勾选复选框时,它会立即取消勾选。

我想在显示反馈表单之前隐藏回复我。为此,我需要知道用户是否已经选中“不再询问”。

shouldShowRequestPermissionRationale 没有多大帮助。因为,shouldShowRequestPermissionRationale 在 2 种情况下会返回 false

    用户已勾选“不再询问”。 requestPermissions 以前从未被调用过。

我找不到区分两者的方法。

【问题讨论】:

似乎没有简单的方法,但在您的情况下,您可能会在显示对话框之前先寻求许可。然后您可以根据权限检查的结果来决定是否显示该选项。 我尽量避免在显示反馈对话框之前询问权限。因为这可能会造成不愉快的用户体验。用户会想知道为什么我需要提供联系人信息才能显示反馈对话框。 如果您在单独的对话框中还没有权限,则另一种方法是将“回复我”问题分开 - 在这种情况下,您可以在反馈对话框之后提出问题并且权限是的确。可能不那么奇怪,但可能存在连续对话太多的问题... 在此链接上找到的最佳解决方案:https://***.com/a/33514501/4156299 【参考方案1】:

当您请求许可时,将布尔值 shared preference 保存为 true。然后,您将能够检查它的值,以了解您是否已经请求许可,并知道 shouldShowRequestPermissionRationale() 是否返回 false,因为您之前从未询问过,或者因为他们说再也不会,或者因为权限被禁用设备政策。

【讨论】:

但请注意shouldShowRequestPermissionRationale()的结果可能会被重置,如果用户在应用程序之外切换权限 - code.google.com/p/android-developer-preview/issues/… 我可以在共享偏好中设置一个标志,以跟踪是否勾选了“不再询问”。但是,它是否有可能与实际系统价值不同步?这意味着,用户可以在应用程序外清除“不再询问”系统标志。然而,在共享偏好中保留“不再询问”标志的真实价值? 这太荒谬了,开发者必须注意系统本身强加的东西。 查看此答案,了解在请求权限时检查您所处的场景的好方法:***.com/a/52596674/753964

以上是关于如何在调用 requestPermissions 之前知道用户检查“不再询问”的主要内容,如果未能解决你的问题,请参考以下文章

调用需要 API 级别 23(当前最低为 14):android.app.Activity#requestPermissions,checkSelfPermission [重复]

requestPermissions在一个片段中

网站的 OSX 推送通知 - 从未调用过 Safari requestPermission 回调

Activity.requestPermissions 与 ActivityCompat.requestPermissions

浏览器发起桌面通知Notification.requestPermission

Android Java无法在片段中显示requestPermission