耐心读完,理解权限处理的关键点。最后附有源码~~
一、背景:
android6.0系统开启了敏感权限用户授权功能。如果开发的APP中不添加权限获取申请,默认是不会弹框提示用户授权的,如此以来系统默认禁止使用拍照、存储等敏感权限,如果开发者设置targetSdkVersion >=23而APP中直接调用拍照或存储时就会导致崩溃。解决办法targetSdkVersion <23或者代码中添加权限检测。
二、编写目的:
目前网上查找6.0系统权限解决办法杂乱无章,单单通过直接调用requestPermissions和checkSelfPermission无法根本解决。最关键的是需要判断用户拒绝授权并勾选“不再提示”的情况。特此编写此文,避免大家把时间浪费在已有的轮子上。
三、问题分析:
6.0+系统默认禁止拍照、存储等敏感权限,需要开发者代码中做权限检测判断处理。权限状态判断处理有三种状态:
1、权限默认被禁止
2、权限被用户拒绝授权并勾选“不再提示”——勾选不再提示后调用checkSelfPermission方法后系统不会弹出授权提示框,所以这种情况下需要重点处理,也是核心点。手动弹框提示用户实现功能需要该权限。
3、权限授权成功。
四、解决办法:
//***********测试敏感权限申请***************
private void requestMyPermission() {
String[] arr_permision = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA};
//根据列出的权限分次获取敏感权限
EasyPermission.with(this).code(AppContants.REQUEST_CODE).permissions(arr_permision).request();
}
//必须复写此处的回调,否则无法获取用户授权结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermission.handleResult(this, requestCode, permissions, grantResults);//处理权限申请回调结果
}
//授权结果回调
@Override
public void onBasicPermissionSuccess() {
Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onBasicPermissionFailed() {
Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onBasicPermissionFailedNeedRational() {
Toast.makeText(this, "授权失败并被勾选不再提示,此时引导用户去应用设置中手动授权", Toast.LENGTH_SHORT).show();
//最好以对话框形式引导
AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setTitle("请前往应用授权设置中添加授权").setPositiveButton("去授权", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 001);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).show();
}
/*********END 权限申请***************/
直接上代码,自己看,亲测有效~~