权限申请shouldShowRequestPermissionRationale的正确用法

什么时候方法会返回ture

shouldShowRequestPermissionRationale方法的作用是什么,从命名上很好理解,就是判断是否需要向用户显示权限说明弹窗。

为了更好理解,先看一段谷歌的示例代码

if (ContextCompat.checkSelfPermission(
        CONTEXT, Manifest.permission.REQUESTED_PERMISSION) ==
        PackageManager.PERMISSION_GRANTED) {
    // You can use the API that requires the permission.
    performAction(...);
} else if (shouldShowRequestPermissionRationale(...)) {
    // In an educational UI, explain to the user why your app requires this
    // permission for a specific feature to behave as expected. In this UI,
    // include a "cancel" or "no thanks" button that allows the user to
    // continue using your app without granting the permission.
    showInContextUI(...);
} else {
    // You can directly ask for the permission.
    // The registered ActivityResultCallback gets the result of this request.
    requestPermissionLauncher.launch(
            Manifest.permission.REQUESTED_PERMISSION);
}

运行这段代码,可以分为三种情况

第一阶段

从来未申请过权限,执行了第三个代码块,弹出了系统权限弹框。这时候shouldShowRequestPermissionRationale返回false。

第二阶段

第一阶段弹出权限弹框后,我们选择拒绝授权权限。然后再次运行这段代码,这时候执行了第二个代码块,弹出了我们自定义的权限说明弹窗。这时候shouldShowRequestPermissionRationale返回ture。

第三阶段

前两阶段我们都拒绝了授权权限,再次运行这段代码,这时候执行了第三个代码块。shouldShowRequestPermissionRationale返回false,但是这次并未弹出系统权限弹框。说明系统已经禁止了申请这个权限。

总结

shouldShowRequestPermissionRationale只有在拒绝了第一次后才会返回ture,第二次拒绝返回false

怎么判断权限被禁止了

官方并未提供对应api。结合上面的逻辑的我们可以总结出

if (grantResult == PackageManager.PERMISSION_DENIED 
       && !shouldShowRequestPermissionRationale(Manifest.permission_group.STORAGE)){
                //权限被禁止了
 }

注意,只能在onRequestPermissionsResult里判断。因为第一次未申请过权限shouldShowRequestPermissionRationale返回false,是符合这个判断的。

实际申请权限流程

日常产品定义的需求和谷歌定义的模板有区别:

1.权限说明弹窗在第一次申请前,而不是第二次申请

2.被禁止权限后,会引导用户到设置页手动打开

所以正确的流程:

private void requestPemission() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            start();
        } else {
            if (ContextCompat.checkSelfPermission(Utils.getApp(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                start();
            } else if (isFirstRequst) {
                //说明弹窗
                showTipDialog();
            } else {
                //申请权限
                requestPermissions(new String[]{Manifest.permission_group.STORAGE}, 123);
            }
        }
    }


@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 123){
            int grantResult = grantResults[0];
            if (grantResult == PackageManager.PERMISSION_GRANTED){
                start();
            } else if (grantResult == PackageManager.PERMISSION_DENIED 
                    && !shouldShowRequestPermissionRationale(Manifest.permission_group.STORAGE)){
                //权限被禁止了,引导用户到设置页
            }
        }
    }

可以看出实际开发中,shouldShowRequestPermissionRationale的作用只是用于判断权限是否被禁止了

猜你喜欢

转载自blog.csdn.net/qq_31031769/article/details/125647511