该方法针对判断是否有读取联系人权限貌似没有意义 = =
在小米4 Android 6.0.1 系统的手机上,动态申请 读取联系人 权限,会出现和原生不一致的情况。
//检查是否有读取联系人权限
int checkPermissionResult = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
if (checkPermissionResult != PackageManager.PERMISSION_GRANTED) {
//动态申请读取联系人权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 666);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 666) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//申请读取联系人权限成功
LogUtil.e(TAG, "申请读取联系人权限成功");
} else {
//申请读取联系人权限失败
LogUtil.e(TAG, "申请读取联系人权限失败");
}
}
}
1、读取联系人权限为询问状态时:
使用ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 666)
,不会弹出联系人权限动态申请的弹窗,而是在onRequestPermissionsResult
中会直接返回PackageManager.PERMISSION_GRANTED
(申请读取联系人权限成功)。而在onRequestPermissionsResult
进行读取联系人操作,会弹出联系人权限动态申请的弹窗。
2、读取联系人权限为拒绝状态时:
使用ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 666)
申请读取联系人权限,也会在onRequestPermissionsResult
中会直接返回PackageManager.PERMISSION_GRANTED
(申请读取联系人权限成功),而不是返回申请联系人权限被拒绝。
3、读取联系人权限为拒绝状态时:
在联系人权限动态申请的弹窗拒绝读取联系人权限之后,再次调用ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
返回的是PackageManager.PERMISSION_GRANTED
(有权限)。
所以,需要用AppOpsManager
辅助判断是否有读取联系人权限
//AppOpsManager.OPSTR_READ_CONTACTS在23添加。所以,以下判断没有多大意义了 = =
if (Build.VERSION.SDK_INT >= 23) {
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_READ_CONTACTS, android.os.Process.myUid(), getPackageName());
LogUtil.e(TAG, "checkOp:" + checkOp);
switch (checkOp) {
case AppOpsManager.MODE_ALLOWED:
LogUtil.e(TAG, "AppOpsManager.MODE_ALLOWED :有权限");
break;
case AppOpsManager.MODE_IGNORED:
LogUtil.e(TAG, "AppOpsManager.MODE_IGNORED:被禁止了");
break;
case AppOpsManager.MODE_DEFAULT:
LogUtil.e(TAG, "AppOpsManager.MODE_DEFAULT");
break;
case AppOpsManager.MODE_ERRORED:
LogUtil.e(TAG, "AppOpsManager.MODE_ERRORED:出错了");
break;
case 4:
LogUtil.e(TAG, "AppOpsManager.OTHER:权限需要询问");
break;
}
}
另,可以试试PermissionChecker.checkSelfPermission(context, permission)
方法(一行代码解决Android M新的运行时权限问题)
以下方法,可以打开应用设置页面,进行权限授权:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
// 根据包名打开对应的设置界面
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
参考:
有说18 <= API < 23下某些 ROM 的权限的异常情况
Android判断手机ROM 、 如何识别小米设备/MIUI系统
有描述小米6.0系统异常情况
权限动态申请框库,据说兼容小米手机的权限申请,实际没有使用过
网友评论