Android申请系统权限

LiYajie: 2021-04-26 Android

Android 6.0系统一个最大的特性就是动态权限申请。在android 6.0以前,我们APP开发中对权限的处理是直接在AndroidManifest文件中配置即可;这种情况在android 6.0之后就改变了,对于一些涉及用户隐私的危险权限,我们不但需要在AndroidManifest文件中进行配置,还需要在使用到该权限的地方使用API来对权限进行动态申请.

# 原生写法- 以申请相机权限为例

Build.VERSION_CODES.M -> SDK23 -> Android 6.0

// MainActivity.java


// 检测照片权限是否开启
public void checkImagePermission(OnResultListener listener, Boolean isForcibly) {
    mImageListener = null;
    // 判断是否有Camera权限
    boolean haveCameraPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
            == PackageManager.PERMISSION_GRANTED;
    // 判断是否有存储写入权限
    boolean haveWritePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED;
    // 如果都没有, 则执行监听回调
    if (haveCameraPermission && haveWritePermission) {
        if (listener != null) {
            // 如果都执行成功了, 则执行成功回调
            listener.onSuccess();
        }
    } else {
        // 如果当前版本>=android 6, 才去申请 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (AppUtils.getActivity(context).shouldShowRequestPermissionRationale(Manifest.permission.CAMERA) ||
                    AppUtils.getActivity(context).shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                if (listener != null) {
                    // isForcibly 是否强制申请权限
                    if (isForcibly) {
                        // 请求权限, 则会弹出申请页面
                        requestImagePermissions();
                    } else {
                        // 否则, 则执行拒绝回调
                        listener.onAlreadyDenied();
                    }
                }
            } else {
                // 如果没有权限则执行请求权限
                mImageListener = listener;
                requestImagePermissions();
            }
        } else {
            if (listener != null) {
                // 如果拒绝了则执行失败回调
                listener.onFailure();
            }
        }
    }
}

// 申请图片访问权限和存储写入权限
@RequiresApi(api = Build.VERSION_CODES.M)
private void requestImagePermissions() {
    if (AppUtils.getActivity(context) != null) {
        AppUtils.getActivity(context).requestPermissions(new String[]{Manifest.permission.CAMERA,
                Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_IMAGE_PERMISSION_CODE);
    }
}

// 使用
public void useCamera() {
  // getPermissionsManager() 获取PermissionsManager实例
  getPermissionsManager().checkImagePermission(new PermissionsManager.OnResultListener() {
    @Override
    public void onSuccess() {
        // 授权成功后执行这里....
        Log.i("TAG", "授权成功了");
    }

    @Override
    public void onFailure() {
        Logger.d("onFailure");
        showPermissionsFailureDialog();
    }

    @Override
    public void onAlreadyDenied() {
        Logger.d("onAlreadyDenied");
        showPermissionsAlreadyDeniedDialog();
    }
  }, true);
}

# 第三方权限库(推荐)

只用注解的方式, 相当方便

LiYajie 发布于: 2021-04-26