android6.0权限问题

在使用android6.0权限问题的时候,遇到一些问题,比如,在使ActivityCompat.requestPermissions()弹出权限框dialog的时候,我们点允许,是没什么问题的,可以获取到权限,当我们点拒绝的时候,该如何处理,当勾上不再询问并拒绝,又该怎么处理,最坑的是如果是小米的6.0手机,当我们点拒绝后是无法再去判断应用是否授权了,即用ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)==PackageManager.PERMISSION_GRANTED;
会一直返回true,这个时候又该怎么处理?这些问题纠结了我很久,看了很多家技术贴综合整理在一起才解决的,今天在这分享下,希望能帮助到遇到这些问题的朋友们。

先看代码:

private String mReadContactsPermissions= Manifest.permission.READ_CONTACTS;//请求的权限
private final int REQUEST_CODE = 1;//请求码

private void requestPermissions() {
    boolean permission=ActivityCompat.checkSelfPermission(this,mReadContactsPermissions)
            ==PackageManager.PERMISSION_GRANTED;
    if (Build.VERSION.SDK_INT < 23||permission) {
        //授权成功

    }else{
        ActivityCompat.requestPermissions(this, new String[]{mReadContactsPermissions}, REQUEST_CODE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    if (requestCode == REQUEST_CODE) {
        if (grantResults.length > 0){
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {//授权成功

            }else if (grantResults[0] == PackageManager.PERMISSION_DENIED){//点击拒绝授权

                if (ActivityCompat.shouldShowRequestPermissionRationale(this
                        , mReadContactsPermissions)) {//点击拒绝,再次弹出

                    ActivityCompat.requestPermissions(this, new String[]{mReadContactsPermissions}, 1);

                }else{ // 选择不再询问,并点击拒绝,弹出提示框
                    showAlertDialog("为了正常使用某些功能,请开启联系人权限", "取消", "手动授权", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Uri uri=Uri.parse("package:"+getPackageName());//包名
                            Intent intent=new Intent("android.settings.APPLICATION_DETAILS_SETTINGS", uri);
                            startActivity(intent);
                        }
                    });
                }
            }
        }
        Log.e("grantResults","授权结果"+(grantResults[0] == PackageManager.PERMISSION_GRANTED));
    }
}

首先,检查联系人权限是否授权,如果SDK小于23(6.0)或者已授权,则可进行授权后的操作,否则,则去请求联系人权限。这时候会弹出系统请求权限的dialog。不论用户怎么操作,都会进入 onRequestPermissionsResult()方法的回调里面。再来看onRequestPermissionsResult()方法里面。
我们先用REQUEST_CODE定位到当前的权限请求。先判断返回的结果集是否大于0,大于0我们则判断联系人权限的请求结果是什么。(因为我们只请求了联系人权限,所以我直接用下标0来获取联系人的返回状态)。对于请求dialog,用户总共只有三种操作:1.点击授权。2.点击拒绝。3.选择不再询问点击拒绝。我们在看对于每一种情况的处理:
1.点击授权,则进入到if(grantResults[0] == PackageManager.PERMISSION_GRANTED)的判断里,那么我们就可以进行获取联系人的操作。
2.点击拒绝,则进入到else if (grantResults[0] == PackageManager.PERMISSION_DENIED),然后我们再判断是选择不再询问拒绝还是直接拒绝。通过shouldShowRequestPermissionRationale(activity, mReadContactsPermissions)来判断。当我们点击拒绝的时候,这个方法会返回true,选择不再询问并拒绝,则返回false。

点击拒绝的话我们可以直接再次弹出请求权限dialog。如果觉得这么做不友好,可以先弹出个告诉用户必须得拥护该权限的理由的dialog.然后再来请求也行,具体看个人需求。
3.选择不再询问并拒绝,这一步的操作,shouldShowRequestPermissionRationale(activity, mReadContactsPermissions)则是返回了false.我们知道当用户做了这个操作,再去调用requestPermissions()方法是没有任何反应的,请求权限的dialog已经是弹不出来了。这时候怎么办,我们只能自己写个dialog来引导用户,去手动开启该权限。当用户点击手动授权,我们就跳到应用的详情页,让用户手动去开启权限。所有的操作流程就是这样。
对于大多数的6.0手机而已,这套操作都是没问题的。但是当用户用的是小米6.0的手机,问题就来了。miui系统底层可能改动太大,授权dialog只有拒绝和允许,没有不再询问选项,并且,当点击拒绝后,就是选中不再询问并拒绝的效果。grantResults[0]的返回值也是PackageManager.PERMISSION_GRANTED 即授权成功!也就是说无论怎么操作都是返回成功。但是点拒绝后并没有获取到权限。我看了小米官方给出的回答:
android6.0权限问题_第1张图片
也就是说点击拒绝后你便不能再去判断是否授权了。无法判断,那么我们前面做的在小米的6.0面前都是无效功。该怎么解决呢? 我现在的解决方案是:以读取联系人为例,当我们没有授权去读取联系人的时候,读取的结果是null.我们只能根据返回的结果来弹出我们自己的引导dialog.引导用户去开启权限。其他权限也可以以此为例。

最新解决各个手机厂商定制问题的实用封装请看 https://blog.csdn.net/qq_29368255/article/details/79756879

你可能感兴趣的:(android问题)