众所周知,Android判断权限是否需要申请,主要由ActivityCompat.shouldShowRequestPermissionRationale 和 ActivityCompat.checkSelfPermission 两个方法判断。
1、shouldShowRequestPermissionRationale
Google的原意是:
1,没有申请过权限,申请就是了,所以返回false;
2,申请了用户拒绝了,那你就要提示用户了,所以返回true;
3,已经允许了,不需要申请也不需要提示,所以返回false;
4,用户选择了拒绝并且不再提示,那你也不要申请了,也不要提示用户了,所以返回false;
【引自一位网友的翻译,挺好的解释】
从来没有申请过:
ActivityCompat.shouldShowRequestPermissionRationale=false;
第一次请求权限被禁止,但未选择【不再提醒】
ActivityCompat.shouldShowRequestPermissionRationale = true;
允许权限后
ActivityCompat.shouldShowRequestPermissionRationale=false;
禁止权限,并选中【禁止后不再询问】
ActivityCompat.shouldShowRequestPermissionRationale=false;
2、ActivityCompat.checkSelfPermission
0 --允许权限
-1 -- 拒绝权限
切合实际了解权限的不同操作后以上两个方法返回的值,写了一个demo打印了在不同品牌系统返回的值,结果如下:
华为手机
鸿蒙系统 (只有拒绝,没有不再询问的拒绝)
未申请权限时的状态
2022-03-25 16:32:32.965 15540-15540/com.android.demo E/FunctionEntrance: onResume: shouldShowRequestPermissionRationale :false
2022-03-25 16:32:32.966 15540-15540/com.android.demo E/FunctionEntrance: onResume: checkSelfPermission :-1
拒绝权限后的状态
2022-03-25 16:32:32.965 15540-15540/com.android.demo E/FunctionEntrance: onResume: shouldShowRequestPermissionRationale :false
2022-03-25 16:32:32.966 15540-15540/com.android.demo E/FunctionEntrance: onResume: checkSelfPermission :-1
小米手机
未申请权限时的状态
2022-03-25 16:32:32.965 15540-15540/com.android.demo E/FunctionEntrance: onResume: shouldShowRequestPermissionRationale :false
2022-03-25 16:32:32.966 15540-15540/com.android.demo E/FunctionEntrance: onResume: checkSelfPermission :-1
拒绝一次权限后的状态
2022-03-25 16:37:45.728 21887-21887/com.android.demo E/FunctionEntrance: onResume: shouldShowRequestPermissionRationale :true
2022-03-25 16:37:45.728 21887-21887/com.android.demo E/FunctionEntrance: onResume: checkSelfPermission :-1
拒绝,且勾选不再询问后的状态
2022-03-25 16:39:50.591 22452-22452/com.android.demo E/FunctionEntrance: onResume: shouldShowRequestPermissionRationale :false
2022-03-25 16:39:50.591 22452-22452/com.android.demo E/FunctionEntrance: onResume: checkSelfPermission :-1
oppo 手机
未申请权限时的状态
2022-03-25 16:32:32.965 15540-15540/com.android.demo E/FunctionEntrance: onResume: shouldShowRequestPermissionRationale :false
2022-03-25 16:32:32.966 15540-15540/com.android.demo E/FunctionEntrance: onResume: checkSelfPermission :-1
拒绝一次权限后的状态
2022-03-25 17:02:29.596 21240-21240/com.android.demo E/FunctionEntrance: onResume: shouldShowRequestPermissionRationale :true
2022-03-25 17:02:29.597 21240-21240/com.android.demo E/FunctionEntrance: onResume: checkSelfPermission :-1
拒绝,且勾选不再询问后的状态
2022-03-25 16:39:50.591 22452-22452/com.android.demo E/FunctionEntrance: onResume: shouldShowRequestPermissionRationale :false
2022-03-25 16:39:50.591 22452-22452/com.android.demo E/FunctionEntrance: onResume: checkSelfPermission :-1
通过demo打印发现,用这两个方法并不能帮助我们 辨别权限 是从未申请,还是拒绝了权限且不再提醒两种状态,故引入了sp去记录是否是第一次申请权限,具体是是在 onRequestPermissionsResult 回调中,记录权限第一次被拒绝的状态,直到它被允许
有了这个标记 我们对权限的判断就方便许多,用相机权限申请作为demo
String[] permissions = new String[]{permission.CAMERA};
//通过sp 获取拿到对应权限的标记,true 是第一次申请拒绝,fasle是默认 或者允许
boolean isFirstRequest = isFirstRequest(this,permissions);
if(shouldShowRequestPermissionRationale == false && isFirstRequest){
//1、从来没有申请过,第一次申请
requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
return ;
}
if( shouldShowRequestPermissionRationale == true){
//2、拒绝后,再申请提示,【注意:鸿蒙系统没有这步】
requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
return ;
}
if (shouldShowRequestPermissionRationale = false && !isFirstRequest){
//3、拒绝了且不在提醒后,再次申请,弹窗提示,确定去系统设置中设置 权限
showPermissionDialog("需要您的相机权限",
"当前操作需要使用相机权限,不开启权限将无法使用此功能",
"去设置",new OnButtomListener() {
@Override
public void onCancel() {
}
@Override
public void onEnter() {
//跳转设置
goAppSetting();
}
});
return ;
}