关于小米6.0以上系统手机动态获取权限问题

时间:2022-08-21 18:58:16

之前一直没发现,直到这次小米应用商店上线的时候被打回,网上百度了一下才知道小米手机还有一个这么大的坑!!!
由于小米对android系统的修改,导致部分小米6.0以上系统手机,在动态获取权限的时候失败。
先说说我的问题,我是在动态获取 android.permission.READ_PHONE_STATE 权限时出的错。

if (Build.VERSION.SDK_INT >= 23) {

int checkCallPhonePermission = ContextCompat.checkSelfPermission(WelcomeActivity.this, Manifest.permission.READ_PHONE_STATE); if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE_READ_PHONE_STATE); return; } else { //获取动态后的实现 } } else {
//23之前自动获取权限
}
就在这个地方,小米这个坑,不管系统设置是 允许 还是 拒绝, 这个地方 checkCallPhonePermission 返回值都是0,就是说出了选择是否拒绝权限,在系统里设置
拒绝还是允许到了这里都是允许。
然后百度,找到了这个
//适配小米机型
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_FINE_LOCATION, Process.myUid(), getPackageName());
if (checkOp == AppOpsManager.MODE_IGNORED) {
ActivityCompat.requestPermissions(ActivityDetailActivity.this,
new String[]{LOCAL_PERMISSION}, 101);
return;
}
但是这里 AppOpsManager.MODE_IGNORED=1;意思是模式忽略,这个地方居然给我返回了checkOp=4,于是我自己找到了 AppOpsManager.MODE_ALLOWED 这个参数,这个参数
AppOpsManager.MODE_ALLOWED=0,是允许。所以这里应该写成这样
//适配小米机型
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_READ_PHONE_STATE, Process.myUid(), getPackageName());
if (checkOp != AppOpsManager.MODE_ALLOWED) {
//没有获取权限,重新访问获取或者别的操作
}else{
//获取到权限,继续操作
}
所以完整的代码
if (Build.VERSION.SDK_INT >= 23) {

                int checkCallPhonePermission = ContextCompat.checkSelfPermission(WelcomeActivity.this, Manifest.permission.READ_PHONE_STATE);
if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE_READ_PHONE_STATE);
return;
} else {
//适配小米机型
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_READ_PHONE_STATE, Process.myUid(), getPackageName());
if (checkOp != AppOpsManager.MODE_ALLOWED) {
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE_READ_PHONE_STATE);
return;
} else {
//获取权限后的操作

}
}

} else {
//获取权限后的操作
}

注意
int checkCallPhonePermission = ContextCompat.checkSelfPermission(WelcomeActivity.this, Manifest.permission.READ_PHONE_STATE);
int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_READ_PHONE_STATE, Process.myUid(), getPackageName());
这两句中的 Manifest.permission.READ_PHONE_STATE 和 AppOpsManager.OPSTR_READ_PHONE_STATE 这两个参数一定要对应起来,不知道的话就去AppOpsManager类中去找。