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】:我对@987654321@ 有很好的经验,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 平台上高效开发系统应用?