Android 6.0(SDK_INT≥23)中的动态权限申请

最近使用cameraX开发,同时涉及到动态权限申请问题记录如下:
遇到的问题:
1. 权限字符串在Activity中的写法
2. 首次打开app授权后camera无图像问题

1. 权限字符串在Activity中的写法
在Manifest中,静态权限的写法如下:

<uses-permission android:name = "android.permission.CAMERA" />
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

网上旧的资料中,在Activity中写法为:

private final String[] REQUIRED_PERMISSIONS = new String[]{"Manifest.permission.CAMERA"};//错误写法

会导致app打开时crash、闪退。

目前正确的写法为:

private final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.CAMERA"};//正确写法

2. 首次打开app授权后camera无图像问题

android中与动态权限相关的方法有:

ContextCompat.checkSelfPermission(act, permission);
ActivityCompat.requestPermissions(act, permissions, requestCode);
onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults);

其中,checkSelfPermission用于检查指定权限;requestPermissions用于申请权限;onRequestPermissionsResult是权限申请的回调。

权限申请伪代码如下:

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(PermissionUtil.checkMultiPermission(MainActivity.this,REQUIRED_PERMISSIONS,REQUEST_CODE_PERMISSIONS)){
        startCamera(MainActivity.this); // startCamera-01
    }
}

 private void startCamera(Context context){};

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_PERMISSIONS:
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                startCamera(MainActivity.this); // startCamera-02
            }else {
                Toast.makeText(this, "需要允许camera和SD卡权限才能使用", Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            break;
    }
}

以上代码有两处startCamera,才能确保程序运行正常。
首次运行app申请动态权限后,结果在onRequestPermissionsResult的回调里处理,运行startCamera 02,以后再次打开app在if(PermissionUtil.checkMultiPermission)后可以直接运行startCamera-01。
从而保证app在首次及再次打开效果相同。

posted @ 2020-12-21 17:55  一窗明月  阅读(141)  评论(0)    收藏  举报
// 侧边栏目录