Android权限处理(6.0以上、6.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 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,844评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,288评论 19 139
  • 发热放入Android6.0带来了新的权限管理方式,根据提供的官方文档,再加上自己的理解,做了以下汇总仅供大家伙参...
    PapiAP阅读 1,794评论 0 6
  • 新的一天开始了,经过昨天一天的游戏,孩子们已经开始打开了。 今天我会带孩子们玩游戏闯关,练大脑的灵活性和记忆力,拓...
    阿宁sunny阅读 543评论 0 4
  • 不知道出于什么原因,脑子总是强迫性的思考一些东西,不断重复,所以试着从记录的方式输出自己的观点,输出自己的想法。 ...
    知识改变栋栋阅读 266评论 0 0