Android 11 (R)---权限行为变更及适配(一)

2,561 阅读2分钟

1.权限对话框的可见性

此项影响所有的应用,无论targetSDKVersion为多少。
在使用下面方法请求权限时,在Android R版本中可能不会有对话框弹出。

1.1-什么场景下不会显示权限对话框

1.用户已经两次拒绝该权限时
--- 在权限对话框中点击拒绝
在开发者网站中对于其它行为下权限“拒绝”的定义
---如果用户按返回按钮关闭权限对话框,此操作不算“拒绝”操作。
---如果用户使用 requestPermissions() 从您的应用转到系统设置,然后按返回按钮,此操作就算是“拒绝”操作。

注:在设置清理缓存或重新安装后会清零

1.2-请求权限相关方法的说明
//在Android R(11)之前调用此方法总是会调起权限对话框
//在Android R(11)中调用此方法不一定会调起权限对话框,
//在无法调起时会直接回调onRequestPermissionsResult(),grantResult返回值为PERMISSION_DENIED
public static void requestPermissions (Activity activity, 
                String[] permissions, 
                int requestCode)
1.3-此行为可能带来的影响

1.不少应用在用户拒绝权限后,会退出应用。此项行为变更会可能会导致,应用直接"闪退"的情况.
因此在适配时需要留意此逻辑带来的影响。
2.需要处理权限对话框无法弹出的情况,增加权限申请说明后跳转到设置中

 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "获得权限", Toast.LENGTH_LONG).show();
                } else {
                    //关闭当前界面,在Android R中可能会导致界面"闪退"的情况出现。
                    //finish();
                    //在第一次拒绝时,此方法返回true, 二次拒绝之后续返回值都是falseif (PermissionUtils.shouldShowRequestPermissionRationale(this, permissions[0])) {
                        new AlertDialog.Builder(this)
                                .setMessage("应用需要此权限")
                                .setNegativeButton("确定", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        //跳转到设置当中
                                        PermissionUtils.goToSettings(MainActivity.this);
                                    }
                                })
                                .create().show();
                    } else {
                        //do sth.
                        //增加权限说明,并跳转到设置中
                    }
                    Toast.makeText(this, "权限被拒绝", Toast.LENGTH_LONG).show();
                }
                break;
            default:
                break;
        }
    }
    
    //PermissionUtils.java#goToSettings.跳转到设置应用详情的代码
        public static void goToSettings(Context context) {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.fromParts("package", context.getPackageName(), null));
        context.startActivity(intent);
    }