小编典典

Android M 权限:对 shouldShowRequestPermissionRationale() 函数的用法感到困惑

all

我正在阅读有关 Android M
中新权限模型的官方文档。它讨论了如果应用程序先前请求此权限并且用户拒绝该请求shouldShowRequestPermissionRationale(),则返回的函数。true如果用户过去拒绝了权限请求并选择了
Don’t ask again 选项,则此方法返回false.

但是我们如何区分以下两种情况呢?

案例1 :该应用没有权限,并且之前没有向用户请求权限。在这种情况下, shouldShowRequestPermissionRationale()
将返回 false,因为这是我们第一次询问用户。

情况 2 :用户拒绝了权限并选择了“不再询问”,在这种情况下, shouldShowRequestPermissionRationale()
也将返回 false。

我想在案例 2 中将用户发送到应用程序的设置页面。我如何区分这两种情况?锘。


阅读 90

收藏
2022-07-17

共1个答案

小编典典

在 M Preview 1 之后,如果第一次 显示对话框,则没有 Never ask again 复选框。

如果用户拒绝权限请求,则 在第二次请求权限时,权限对话框中将出现* “不再询问 ”复选框。 *

所以逻辑应该是这样的:

  1. 请求权限:

    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…
    }

  2. 检查权限是否在 中被拒绝或授予onRequestPermissionsResult

如果之前拒绝了该权限,这一次将在权限对话框中出现“ 不再询问 ”复选框。

打电话shouldShowRequestPermissionRationale看看用户是否勾选了 Never ask again
shouldShowRequestPermissionRationale仅当用户选择 不再询问 或设备策略禁止应用程序拥有该权限时,该方法才返回
false:

    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...
        }
    }
}

因此,您不必跟踪用户是否选中了 “不再询问”

2022-07-17