6.0基本权限归纳

231 阅读2分钟

逻辑根据公司业务来

  • 相关的权限必须写在一组数组里头 成功与失败以组为单位,
  • 申请组里任何一个权限失败 都以导向失败逻辑
  • 文件清单写好权限


/**
 * 已授权、未授权的接口回调
 */
public interface PermissionListener {
    int what = -1;

    void onGranted(List<String> grantedPermission);//已授权

    void onShouldShow(List<String> shouldShowPermission);//已授权

    void onDenied(List<String> deniedPermission);//未授权
}


基于BaseActivity

protected PermissionListener mListener;//实例对象来自BaseActivity的实现类
protected final int PERMISSION_REQUESTCODE = 100;

    //基类处理子类要申请权限操作
    protected void requestRunPermisssion(String[] permissions, PermissionListener listener) {
        mListener = listener;
        if (Build.VERSION.SDK_INT >= 23) {//6.0以上
            //收纳授权不成功
            List<String> deniedpermissionLists = new ArrayList<>();
            //收纳授权成功的
            List<String> grantedPermissions = new ArrayList<>();
            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                    deniedpermissionLists.add(permission);
                } else {
                    LogUtils.i("ALIYUN", false, permissions + " 默认申请好了 ");
                    grantedPermissions.add(permission);
                }
            }
            //相关的权限必须写在一组数组里头 成功与失败以组为单位,
            //申请组里任何一个权限失败 都以导向失败逻辑
            if (!deniedpermissionLists.isEmpty()) {
                //以下逻辑处理结果在onRequestPermissionsResult();
                //将失败权限再次弹框确认
                ActivityCompat.requestPermissions(
                        this,
                        deniedpermissionLists.toArray(new String[deniedpermissionLists.size()]),
                        PERMISSION_REQUESTCODE);
            } else {
                //已经申请好的权限  这个if可以去掉 if(!grantedPermissions.isEmpty())
                if (!grantedPermissions.isEmpty()) {
                    //表示全授权了
                    mListener.onGranted(grantedPermissions);
                }
            }
        } else {
            //6.0以下默认申请好了
            mListener.onGranted(Arrays.asList(permissions));
        }
    }

    //系统回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                                            @NonNull int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUESTCODE:
                if (grantResults.length > 0) {
                    LogUtils.i("ALIYUN", false, "返回再次申请的权限:" + Arrays.asList(permissions));
                    List<String> deniedPermissions = new ArrayList<>();//收纳授权不成功
                    List<String> grantedPermissions = new ArrayList<>();//收纳授权成功
                    List<String> showShoudPermissions = new ArrayList<>();//收纳勾选禁止后不再询问弹框后的权限
                    for (int i = 0; i < grantResults.length; i++) {
                        if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                            deniedPermissions.add(permissions[i]);
                            //判断选择了denied状态权限时是否勾选了禁止不再询问
                            boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i]);
                            if (!showRequestPermission) {
                                //以下权限不会再次弹框询问
                                LogUtils.i("ALIYUN", false, permissions[i] + " 权限勾选不再询问");
                                showShoudPermissions.add(permissions[i]);
                            }
                        } else {
                            grantedPermissions.add(permissions[i]);
                        }
                    }
                    //分别回调各自的函数
                    if (!grantedPermissions.isEmpty()) {
                        //都授权的 才回调onGranted
                        if (grantedPermissions.size() == permissions.length) {
                            mListener.onGranted(grantedPermissions);
                        }
                    }
                    if (!deniedPermissions.isEmpty()) {
                        //没有授权的权限
                        mListener.onDenied(deniedPermissions);
                    }
                    if (!showShoudPermissions.isEmpty()) {
                        mListener.onShouldShow(showShoudPermissions);
                    }
                }
                break;
            default:
                break;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

实现类将需要申请的权限放入一个集合  调用基类的requestRunPermisssion(……)方法即可,建议相关一组的权限单独放入一个集合,逻辑上判断了  数组中只要其中一个权限被拒绝了,默认都会整组权限失败,但是下次申请 ,不会再弹申请成功的某个权限,这样保准执行某个权限动作 会得到所有权限认可