checkSelfPermission和shouldShowRequestPermissionRationale有什么区别?

时间:2018-07-12 10:08:16

标签: java android-permissions

我有点困惑,checkSelfPermission()shouldShowRequestPermissionRationale()之间有什么区别

如果我理解正确,他们都会检查应用程序是否需要向用户询问权限,所以为什么我必须检查两次?为什么不能这么简单?

if (ShouldAskForPermission(WRITE_FILE) == true)
  ShowMessage("The application need permission for writing a file on your device, do you allow it?", YES_NO_BUTTONS);

2 个答案:

答案 0 :(得分:0)

因为他们做不同的事情。 checkSelfPermission 检查您是否拥有许可,shouldShowRequestPermissionRationale 检查您是否应该说明您需要许可的理由。

流程应该是:

  • 检查您是否已经拥有权限 (checkSelfPermission)
    • 如果您确实获得了许可,则无需进行任何进一步检查即可继续操作
    • 如果您没有权限,请检查您是否应该显示理由(shouldShowRequestPermissionRationale
      • 如果你应该展示理由,展示它,然后请求许可
      • 如果您不需要展示理由,请不要展示,只需请求许可

之所以将它们彼此分开,我认为主要是为了向后兼容。 shouldShowRequestPermissionRationale 的引入比 checkSelfPermission 晚得多,因此他们不想更改 checkSelfPermission 的契约,因为这会导致大量损坏的代码。例如,如果他们将 checkSelfPermission 的返回值拆分为 PERMISSION_DENIED_AND_NEED_TO_SHOW_RATIONALEPERMISSION_DENIED_AND_DO_NOT_NEED_TO_SHOW_RATIONALE,它会破坏带有 if (returnValue == PackageManager.PERMISSION_DENIED) 类型分支的任何代码。

答案 1 :(得分:-1)

在M Preview 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...
}

检查权限是否在onRequestPermissionsResult中被拒绝或授予。如果以前拒绝了该权限,则这次在权限对话框中将有一个“不再询问”复选框。

致电shouldShowRequestPermissionRationale以查看用户是否选中了“从不询问”。仅当用户选择了“不再询问”或设备策略时,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...
                }
            }
        }

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