Android权限处理(6.0以上、6.0以下)

作者: 162f127842fc | 来源:发表于2017-09-30 11:50 被阅读0次

Android动态申请权限

从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;例如,用户可以选择为相机应用提供相机访问权限,而不提供设备位置的访问权限。用户可以随时进入应用的“Settings”屏幕调用权限。

我们大多数情况都是处理,Android 6.0以上的动态申请权限, 忽略了6.0以下的权限处理。最新在项目中就出现了6.0以下权限处理,导致APP运行异常。

(一、) 针对6.0以上(包含6.0)处理

    工具类:Frgment的处理

public static void checkPermissionByFragment(Context context, Fragment fragment, String permission, int requestCode, HavePermissionCallback callback) {
    //检查权限
    if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
        //进入到这里代表没有权限.
        if (fragment.shouldShowRequestPermissionRationale(permission)) {
            //已经禁止提示了
            Toast.makeText(context, "您已禁止该权限,需要重新开启。", Toast.LENGTH_SHORT).show();
        } else {
            fragment.requestPermissions(new String[]{permission}, requestCode);
        }
    } else {
        callback.onHavePermissionCallback(permission, requestCode);
    }
}

    工具类:Activity的处理

public static void checkPermissionByActivity(Activity activity, String permission, int requestCode, HavePermissionCallback callback) {
    //检查权限
    if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
        //进入到这里代表没有权限.
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
            //已经禁止提示了
            Toast.makeText(activity, "您已禁止该权限,需要重新开启。", Toast.LENGTH_SHORT).show();
        } else {
       //请求申请的权限
            ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);
        }
    } else {
        callback.onHavePermissionCallback(permission, requestCode);
    }
}

下面是调用方式:

 //Manifest.permission.CAMERA  摄像头权限
 //100  请求的code值,回调使用

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    PermissionUtil.checkPermissionByFragment(getActivity(), this, Manifest.permission.CAMERA,100, new HavePermissionCallback() {
        @Override
        public void onHavePermissionCallback(String permission, int requestCode) {
         //TODO 检查摄像头权限已经通过,此处处理权限通过逻辑

        }
    });
} 

系统回调

//系统回调的方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case  100://前面申请的权限code
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //用户同意授权
                //TODO处理权限通过的业务
            } else {
                //用户拒绝授权
            }
            break;
    }
}

(二、) 针对6.0以下

很多时候我们习惯性遗忘掉了6.0以下的权限处理,使用5.0Android系统,去设置里面把应用的权限全部禁用掉了,出现APP异常运行处理。
主要是针对摄像头的权限处理。

//Android6.0以下的摄像头权限处理:
public static boolean isCameraCanUse() {
    boolean canUse = true;
    Camera mCamera = null;
    try {
        mCamera = Camera.open();
        // setParameters 是针对魅族MX5 做的。MX5 通过Camera.open() 拿到的Camera
        Camera.Parameters mParameters = mCamera.getParameters();
        mCamera.setParameters(mParameters);
    } catch (Exception e) {
        canUse = false;
    }
    if (mCamera != null) {
        mCamera.release();
    }
    return canUse;
}

完整权限逻辑处理:


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    PermissionUtil.checkPermissionByFragment(getActivity(), this, Manifest.permission.CAMERA, REQUEST_PERMSSION_REQUEST_CODE_CAMERA, new HavePermissionCallback() {
        @Override
        public void onHavePermissionCallback(String permission, int requestCode) {
            //TODO 处理逻辑

        }
    });
} else {
    if (PermissionUtil.isCameraCanUse()) {//针对6.0以下
     //TODO 处理逻辑
    } else {
        ToastUtils.show(this.getContext(), "未开启摄像头权限,部分功能无法使用", Toast.LENGTH_SHORT);
    }

}

相关文章

网友评论

    本文标题:Android权限处理(6.0以上、6.0以下)

    本文链接:https://www.haomeiwen.com/subject/rfmgextx.html