52.自己动手封装Android6.0运行时权限相关代码

转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/52786614
本文出自:猴菇先生的博客

在app中用到动态判断运行时权限的地方还是蛮多的,比如读写SD卡、获取电话信息、拍照、定位啥的,每次的重复代码也蛮多的。看了郭霖大神CSDN公开课直播Android6.0运行时权限,讲了如何封装,下面是改过之后的代码:

1、在BaseActivity中:

//6.0以上系统判断权限  --> start
    private static final int RUNTIME_PERMISSION_REQUEST_CODE = 1;
    private RuntimePermissionListener mRuntimePermissionListener;

    /**
     * 检查运行时权限
     *
     * @param permissions               所检查的权限数组
     * @param runtimePermissionListener 运行时权限监听器
     */
    public void checkRuntimePermission(String[] permissions, RuntimePermissionListener runtimePermissionListener) {
        mRuntimePermissionListener = runtimePermissionListener;
        List<String> deniedPermissionList = new ArrayList<>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {//判断权限是否允许
                deniedPermissionList.add(permission);
            }
        }
        if (deniedPermissionList.isEmpty()) {
            //权限全部允许
            mRuntimePermissionListener.onRuntimePermissionGranted();
        } else {
            String[] deniedPermissionArray = deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
            //请求未允许的权限
            ActivityCompat.requestPermissions(this, deniedPermissionArray, RUNTIME_PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case RUNTIME_PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0) {
                    List<String> deniedPermissionList = new ArrayList<>();
                    for (int i = 0; i < grantResults.length; i++) {
                        if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                            deniedPermissionList.add(permissions[i]);
                        }
                    }
                    if (deniedPermissionList.isEmpty()) { //权限全部允许
                        mRuntimePermissionListener.onRuntimePermissionGranted();
                    } else {//有拒绝的权限
                        mRuntimePermissionListener.onRuntimePermissionDenied();
                    }
                }
        }
    }

    /**
     * 运行时权限监听器
     */
    public interface RuntimePermissionListener {
        /**
         * 允许所请求的全部权限
         */
        void onRuntimePermissionGranted();

        /**
         * 拒绝所请求的部分或全部权限
         */
        void onRuntimePermissionDenied();
    }
//6.0以上系统判断权限  --> end

2、在需要检查权限的activity中使用:

    /**
     * 请求权限
     */
    private void checkRuntimePermission() {
        String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE
                , Manifest.permission.CALL_PHONE
                , Manifest.permission.ACCESS_COARSE_LOCATION};
        checkRuntimePermission(permissions, new RuntimePermissionListener() {
            @Override
            public void onRuntimePermissionGranted() {
                //do something
            }

            @Override
            public void onRuntimePermissionDenied() {
                ToastUtil.show(MAinActivity.this, "拒绝该权限将无法使用部分功能");
            }
        });
    }

3、如果在fragment中怎么用呢,那就在BaseFragment中:

/**
     * 检查运行时权限
     *
     * @param permissions               所检查的权限数组
     * @param runtimePermissionListener 运行时权限监听器
     */
    public void checkRuntimePermission(String[] permissions, RuntimePermissionListener runtimePermissionListener) {
        Activity activity = getActivity();
        if (activity instanceof BaseActivity) {
            ((BaseActivity) activity).checkRuntimePermission(permissions, runtimePermissionListener);
        }
    }

使用方法和在activity中一样~

附上郭神视频录播地址:http://edu.csdn.net/course/detail/3539

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值