小米魅族系统遇到的6.0权限不弹窗问题

最近在工作中遇到了一个问题,在小米手机上,调用6.0申请权限的api,很久才弹出权限申请框或者不弹。我们的逻辑是在进入一个Fragment,在onViewCreated方法中,判断是否有读取联系人的权限,如果没有就申请权限,可是日志和调试显示权限申请的代码早就执行了,然而弹窗却没有出现。

为了方便验证,写了个简单的demo

代码类似下面:

 if(checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},101);
  }else{
      //打印日志。。
  }

后面权限结果回调:

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.i(TAG, "onRequestPermissionsResult: 请求完成" + permissions[0] +">>>>" +grantResults[0]);
        if (Manifest.permission.READ_CONTACTS.equals(permissions[0])
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
	  //打印日志。。。
        }
    }

在应用管理中,该小米手机读取联系人 权限 明明是 “询问” 状态,然而日志却显示 checkSelfPermission返回的结果是 PERMISSION_GRANTED,已经被允许了!!!。 纳尼?? 明明没有允许嘛,这就很让人费解。 后来找了个魅族手机,也是这样! 然而,在系统的模拟器上却运行弹窗。

后来想到,小米魅族早就有自己的权限管理了,那是在调用权限相关的服务时才会弹出权限提示框。  可能的原因是:尽管是基于Android 6.0,内部还是用的他们自己老的那一套。为了验证这个,就在原来打印日志的地方插入真正读联系人的代码:

   private static final Uri raw_uri = ContactsContract.RawContacts.CONTENT_URI;
    /**
     * 获取所有的联系人的状态
     */
    public static Map getSysAllState(Context context) {
        Map map = new HashMap();
        Cursor cursor = context.getContentResolver().query(raw_uri,
                new String[]{"contact_id", "version"}, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            do {
                String contact_id = cursor.getString(0);
                if (contact_id != null) {
                    map.put(contact_id, cursor.getString(1));
                }
            } while (cursor.moveToNext());
        }
        cursor.close();
        return map;
    }

再次运行,果然弹窗出来了。这就印证了猜测,尽管这手机是6.0系统,但是还是用的之前的机制。 只有在真正使用到权限并执行相关代码时,才弹出权限提示框。 在网上看了资料,貌似运行时权限同意后,还可以再用AppOpsManager可以检测一下。但AppOpsManager毕竟不像运行时权限是公开的标准,且google也不提倡外部应用使用这个,就没深究了。

本人遇到上面的问题,只是在小米note,系统是刷了体验版miui 8。魅族系统则是 Flyme 5.0.2。 其他的没试过,有时间再深究,上述描述只做参考。欢迎讨论。



你可能感兴趣的:(Android基础技术笔记)