从根本解决Android6.0权限检测问题 附demo

耐心读完,理解权限处理的关键点。最后附有源码~~
从根本解决Android6.0权限检测问题 附demo_第1张图片
一、背景:
android6.0系统开启了敏感权限用户授权功能。如果开发的APP中不添加权限获取申请,默认是不会弹框提示用户授权的,如此以来系统默认禁止使用拍照、存储等敏感权限,如果开发者设置targetSdkVersion >=23而APP中直接调用拍照或存储时就会导致崩溃。解决办法targetSdkVersion <23或者代码中添加权限检测。

二、编写目的:
目前网上查找6.0系统权限解决办法杂乱无章,单单通过直接调用requestPermissions和checkSelfPermission无法根本解决。最关键的是需要判断用户拒绝授权并勾选“不再提示”的情况。特此编写此文,避免大家把时间浪费在已有的轮子上。

三、问题分析:
6.0+系统默认禁止拍照、存储等敏感权限,需要开发者代码中做权限检测判断处理。权限状态判断处理有三种状态:
1、权限默认被禁止
2、权限被用户拒绝授权并勾选“不再提示”——勾选不再提示后调用checkSelfPermission方法后系统不会弹出授权提示框,所以这种情况下需要重点处理,也是核心点。手动弹框提示用户实现功能需要该权限。
3、权限授权成功。

四、解决办法:

 //***********测试敏感权限申请***************
    private void requestMyPermission() {
        String[] arr_permision = new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA};
        //根据列出的权限分次获取敏感权限
        EasyPermission.with(this).code(AppContants.REQUEST_CODE).permissions(arr_permision).request();
    }

    //必须复写此处的回调,否则无法获取用户授权结果
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        EasyPermission.handleResult(this, requestCode, permissions, grantResults);//处理权限申请回调结果
    }

//授权结果回调
    @Override
    public void onBasicPermissionSuccess() {
        Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onBasicPermissionFailed() {
        Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onBasicPermissionFailedNeedRational() {
        Toast.makeText(this, "授权失败并被勾选不再提示,此时引导用户去应用设置中手动授权", Toast.LENGTH_SHORT).show();

        //最好以对话框形式引导
        AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setTitle("请前往应用授权设置中添加授权").setPositiveButton("去授权", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
                intent.setData(uri);
                startActivityForResult(intent, 001);
            }
        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

            }
        }).show();

    }
    /*********END 权限申请***************/

直接上代码,自己看,亲测有效~~
下载地址:http://download.csdn.net/download/u011084603/10003095
Github地址:https://github.com/hellozp/permissionCheck

你可能感兴趣的:(android笔记)