Android 系统权限

首先要弄清楚几个方法
activity.shouldShowRequestPermissionRationale(String permission)
0、之前没有拒绝过此权限的申请(第一次安装后请求权限前调用):false
1、曾经被拒绝过权限后再调用:true
2、曾经被拒绝过权限且不再询问后再调用:false
activity.checkSelfPermission(Manifest.permission.CAMERA)
允许返回0,失败返回-1
//6.0部分手机上权限禁止和允许返回都是0
在6.0上要实际调用方法测试一下是否报错来检测实际是否允许了权限

权限逻辑
检测是否是版本大于等于6.0,如果小于,直接执行代码,如果大于等于,判断是否第一次请求该权限
如果是,直接调用
activity.requestPermissions(new String[]{Manifest.permission.权限名}, REQUEST_CODE)
如果不是第一次请求,判断是否拒绝了该权限并且不在提醒,如果不是第一次请求并且已经拒绝并且不在提醒,需要引导用户手动开启。其他情况,如果已经允许了该权限,直接执行代码。如果拒绝了,还需要提醒,直接activity.requestPermissions(new String[]{Manifest.permission.权限名}, REQUEST_CODE)

示例代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int hasPermission = activity.checkSelfPermission(Manifest.permission.CAMERA);//6.0手机上权限禁止和允许返回都是0,所以要实际用一下摄像头来判断摄像头是否可用

        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M && !activity.shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
            int cameraId = 0;
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
            for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
                Camera.getCameraInfo(i, cameraInfo);
                if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                    cameraId = i;
                }
            }
            try {
                Camera camera = android.hardware.Camera.open(cameraId);
                camera.release();
            } catch (Throwable e) {
                if (!activity.shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
                    showMessageProxy.showMessageDialog("上传身份证需要打开相机权限,点击权限-打开相机权限", new ShowMessageProxy.SureOnDiaLogClickListener() {
                        @Override
                        public void onPositive() {
                            UriUtil.openSetting(activity);
                        }
                    });
                    return;
                }
            }
            onOpenCamera();

        } else {
            boolean hasReq = SharePreferenceManager.getInstance().getBoolean(PermissionConstant.KEK_HAS_REQ_CAMERA, false);
            if (!activity.shouldShowRequestPermissionRationale(Manifest.permission.CAMERA) && hasPermission != PackageManager.PERMISSION_GRANTED && hasReq) {//如果不是第一次请求并且拒绝并且不在提醒
                showMessageProxy.showMessageDialog("上传身份证需要打开相机权限,点击权限-打开相机权限", new ShowMessageProxy.SureOnDiaLogClickListener() {
                    @Override
                    public void onPositive() {
                        UriUtil.openSetting(activity);
                    }
                });
                return;
            }

            if (hasPermission != PackageManager.PERMISSION_GRANTED) {
                activity.requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CODE);
                return;
            }
         onOpenCamera();
        }
    } else {
     onOpenCamera();
    }

权限回调

  @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//6.0摄像头权限不回调此方法
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == REQUEST_CODE) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
             onOpenCamera();
        } else {
            记录请求了一次,并且拒绝
            SharePreferenceManager.getInstance().putBoolean(PermissionConstant.KEK_HAS_REQ_CAMERA, true);
        }
}

6.0部分手机需要做特殊处理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值