Android Marshmallow - 如何知道“不再询问”之前检查过

Posted

技术标签:

【中文标题】Android Marshmallow - 如何知道“不再询问”之前检查过【英文标题】:Android Marshmallow - how to know "Never ask again" is checked before 【发布时间】:2016-05-13 02:23:19 【问题描述】:

我想申请获取塔位置的权限 android.permission.ACCESS_COARSE_LOCATION。

但在请求该权限之前,我想通过选中“不再询问”复选框来了解它是否被用户阻止。

是否有正确的方法知道“不再要求”获得许可?

========================需求======================= ===

我想阻止用户在未授予位置访问权限的情况下进入屏幕。

所以我将权限请求用作名为 在 onResume() 中调用的 requestLocation()。

在 requestLocation() 中

-> 检查权限

-> 如果 : 已授予权限,请注册更新位置。

-> ELSE : 未授予,使用两个按钮显示授予权限对话框

-> 一键执行代码“ActivityCompat.requestPermissions(........);”并显示内置弹出窗口以获得许可。

-> 另一个按钮有助于退出应用程序。

当 onRequestPermissionsResult() 中标记了deny 或 grant 时,requestLocation() 将再次执行。

但如果勾选“不再显示”并点击拒绝,则无限循环将继续如下

onRequestPermissionsResult()=>

PERMISSION_DENIED =>

requestLocation()=>

未授予权限 =>

ActivityCompat.requestPermissions(........); =>

onRequestPermissionsResult() => PERMISSION_DENIED =>requestLocation()=>

未授予权限 =>

ActivityCompat.requestPermissions(........);

=>.......

所以如果我能理解是否点击了“不再显示”,我可以通过在 requestLocation() 中检查它来退出循环。

【问题讨论】:

***.com/questions/30719047/…,看看这个 注意:如果用户过去拒绝了权限请求,并在权限请求系统对话框中选择了不再询问选项,则此方法返回 false。如果设备策略禁止应用拥有该权限,该方法也会返回 false。 【参考方案1】:

我对@9​​87654321@ 有很好的经验,Dexter 简化了在运行时请求权限。

【讨论】:

【参考方案2】:

如果:

您之前已请求该权限,并且 你没有权限(checkSelfPermission()表示被拒绝),并且 shouldShowRequestPermissionRationale() 返回false

然后用户勾选了“不再询问”。

【讨论】:

【参考方案3】:

您不需要知道用户是否选中了该框。系统会像用户每次都拒绝你一样处理它。

只需请求许可。如果用户选中了“不再询问”框,或者他们只是每次都拒绝你,那么从你的应用程序的角度来看,这不会有什么不同。

http://developer.android.com/training/permissions/requesting.html

【讨论】:

【参考方案4】:

但在请求该权限之前,我想通过选中“不再询问”复选框来了解它是否被用户阻止。

我不认为你可以,但坦率地说,我看不出你需要关心的理由。如果您的流程正确,那么用户如何拒绝您的请求就无关紧要了。

【讨论】:

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

如何在打盹模式下移动设备(Android Preview M / Marshmallow)?

如何从 Android 版本 Marshmallow 开始请求从 Android 拨打电话的权限?

Android Marshmallow - 如何知道“不再询问”之前检查过

如何在 Android Marshmallow 平台上高效开发系统应用?

如何在 Android Marshmallow 上的 Google 地图上显示当前位置?

如何使用默认裁剪意图裁剪 android marshmallow 中的图像?