关于小米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);
int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_READ_PHONE_STATE, Process.myUid(), getPackageName());
这两句中的 Manifest.permission.READ_PHONE_STATE 和 AppOpsManager.OPSTR_READ_PHONE_STATE 这两个参数一定要对应起来,不知道的话就去AppOpsManager类中去找。
由于小米对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 6.0以上系统动态获取权限
- 关于Android6.0以上动态获取运行时权限、及无法正常运行百度地图API的问题
- Android手机获取相机权限终极大招(兼容国产手机小米华为魅族以及6.0以下系统)
- andorid6.0以上系统,百度定位,首次动态获取权限后不自动定位解决方案
- 关于安卓系统4.0/5.0/6.0获取单卡手机,双卡手机的imei1,imei2,meid(用反射来实现,史上最详细,最全面获取)--binbinyang
- 关于Android7.0版本及其以上系统获取本地数据(图片和文件)报系统出现异常,正在退出问题
- Android开发动态获取权限(6.0以上API>23)
- 在android 6.0以上无法获取READ_PHONE_STATE权限的SecurityException的问题
- 关于Android6.0以上系统的权限问题
- 在android 6.0动态权限问题无法获取READ_PHONE_STATE权限的SecurityException的问题
- Android6.0极其以上系统获取Dangerous系统权限问题及其解决方案
- 魅族、小米、华为等国产手机动态请求权限崩溃问题
- JBPM4关于Assignee动态获取------OA系统工作流环节问题
- 菜鸟笔记3.关于百度地图Android6.0以上权限动态获取,
- android手机系统 6.0后的权限申请问题
- Android 6.0系统动态请求系统相机和读取手机存储权限
- 关于android6.0权限适配6.0系统以下的问题总结(二维码扫描)
- 在android 6.0以上无法获取READ_PHONE_STATE权限的SecurityException的问题
- 在android 6.0以上无法获取READ_PHONE_STATE权限的SecurityException的问题
- 小米魅族系统遇到的6.0权限不弹窗问题