美文网首页
小米Android6.0获取联系人权限异常

小米Android6.0获取联系人权限异常

作者: CaiBird | 来源:发表于2017-07-14 14:57 被阅读3651次

该方法针对判断是否有读取联系人权限貌似没有意义 = =

在小米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);
参考:

android6.0动态权限管理,小米bug适配

Android悬浮窗权限适配

有说18 <= API < 23下某些 ROM 的权限的异常情况

Android AppOpsManager权限判断

Android 4.3 隐藏功能 App Ops 分析

Android判断手机ROM如何识别小米设备/MIUI系统

android 国产手机6.0适配(小米)

有描述小米6.0系统异常情况

PermissionsDispatcher

权限动态申请框库,据说兼容小米手机的权限申请,实际没有使用过

相关文章

网友评论

      本文标题:小米Android6.0获取联系人权限异常

      本文链接:https://www.haomeiwen.com/subject/nfnnhxtx.html