如何在调用 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 [重复]
网站的 OSX 推送通知 - 从未调用过 Safari requestPermission 回调
Activity.requestPermissions 与 ActivityCompat.requestPermissions