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在首次及再次打开效果相同。