我正在阅读有关 Android M 中新权限模型的官方文档。它讨论了如果应用程序先前请求此权限并且用户拒绝该请求shouldShowRequestPermissionRationale(),则返回的函数。true如果用户过去拒绝了权限请求并选择了 Don’t ask again 选项,则此方法返回false.
shouldShowRequestPermissionRationale()
true
false
但是我们如何区分以下两种情况呢?
案例1 :该应用没有权限,并且之前没有向用户请求权限。在这种情况下, shouldShowRequestPermissionRationale() 将返回 false,因为这是我们第一次询问用户。
情况 2 :用户拒绝了权限并选择了“不再询问”,在这种情况下, shouldShowRequestPermissionRationale() 也将返回 false。
我想在案例 2 中将用户发送到应用程序的设置页面。我如何区分这两种情况?锘。
在 M Preview 1 之后,如果第一次 显示对话框,则没有 Never ask again 复选框。
如果用户拒绝权限请求,则 在第二次请求权限时,权限对话框中将出现* “不再询问 ”复选框。 *
所以逻辑应该是这样的:
请求权限:
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
} else { //Do the stuff that requires permission… }
检查权限是否在 中被拒绝或授予onRequestPermissionsResult。
onRequestPermissionsResult
如果之前拒绝了该权限,这一次将在权限对话框中出现“ 不再询问 ”复选框。
打电话shouldShowRequestPermissionRationale看看用户是否勾选了 Never ask again 。shouldShowRequestPermissionRationale仅当用户选择 不再询问 或设备策略禁止应用程序拥有该权限时,该方法才返回 false:
shouldShowRequestPermissionRationale
if (grantResults.length > 0){ if(grantResults[0] == PackageManager.PERMISSION_GRANTED) { //Do the stuff that requires permission... }else if (grantResults[0] == PackageManager.PERMISSION_DENIED){ // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { //Show permission explanation dialog... }else{ //Never ask again selected, or device policy prohibits the app from having that permission. //So, disable that feature, or fall back to another situation... } } }
因此,您不必跟踪用户是否选中了 “不再询问” 。