您的位置:首页 > 移动开发 > Android开发

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

2017-08-24 11:09 661 查看
之前一直没发现,直到这次小米应用商店上线的时候被打回,网上百度了一下才知道小米手机还有一个这么大的坑!!!

由于小米对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类中去找。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 小米
相关文章推荐