今天来记录一个问题,因为项目需要用到zxing,那就必须要用到摄像头,那么就需要动态的去申请权限,先贴个6.0以上的申请权限的代码 这个在网上随便搜一搜都有很多代码块 就不做过多的解释了 今天主要讨论的是在6.0以下遇到的一个问题
/**
* 请求权限 6.0以上
*/
@Override
public void requestPermissionUpSix() {
// 判断当前是否已经获得了该权限
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
// 如果App的权限申请曾经被用户拒绝过,就需要在这里弹出提示并跳转app设置页面让用户打开权限
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
Manifest.permission.CAMERA)) {
//跳转到设置页面 去让用户打开
Uri packageURI = Uri.parse("package:" + context.getPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Utils.showToast(context, "Please turn on camera permissions");
} else {
// 进行权限请求
ActivityCompat
.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA},
CAMERA_REQ_CODE);
}
} else {
//已经获取了权限,跳转扫描二维码页面
view.scanQRCode();
}
}
这是最常见的6.0以上的动态权限申请 然后处理申请过的回调
@Override
public void onCamearPermissionResult(int requestCode, int[] grantResults) {
switch (requestCode) {
case CAMERA_REQ_CODE:
// 如果请求被拒绝,那么grantResults数组为空
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 申请成功,跳转扫描二维码页面
view.scanQRCode();
} else {
// 申请失败,提示用户。
Utils.showToast(context, "Please turn on camera permissions");
}
break;
default:
break;
}
}
到此我们6.0以上的权限问题就能解决了
如果在6.0及以下申请权限会怎么样呢?一般直接需要在清单文件中注册就可以了,不会提示什么对话框让用户选择是否同意,会直接返回正确的值,即是否拥有,或者,没有权限,这个就取决于你是否在清单文件中注册。并不会有6.0的提示框,但是!!!!!!!现在有个问题来了
但是现在遇到了一个6.0以下权限的问题 当我们去判断版本是在6.0以下的时 你打电话开相机之类的竟然也弹对话框 去询问你是否访问!!!!!!当用户拒绝的时候还无法通过代码再次提示!!!!!也无法捕捉到这个回调,这就需要我们手动去处理6.0以下的这个权限问题,这到底是为什么呢 经过google 去了解 到以下几个点
1.因为rom的自定制问题,大都数的系统都是经过改良的Android系统,他们为了迎合google 权限统一,去让不同系统的ui也实现统一,即使你在清单文件注册了,在使用权限的时候仍然会有提示框,提示你是否使用,也会让你去做选择,当用户同意权限的时候不会出现问题,但是当用户拒绝了权限就会造成无法再次捕捉的这个权限的问题!!!!!
2.这个提示即便你在清单文件中注册了权限仍然可以干涉你的操作拒绝你的请求,
3 这个并没有相关的api及回调,也就是无法监听。并不会走6.0权限的回调。目前经测试最合适的方式是采用try cath的方式来捕获异常提示用户。
CAMERA:调用系统摄像头的时候不会抛出异常(微信,QQ发送照片均无反馈),调用自定义的camera会抛出异常(微信二维码扫描)
至于其他的LOCATION: RECORD_AUDIO: 也会有类似的问题 这里我就不做一一测试了
这边贴下代码
/**
* 请求权限 6.0以下
*/
@Override
public void requestPermissionDownSix() {
if (isCameraCanUse()) {
//已经获取了权限,跳转扫描二维码页面
view.scanQRCode();
} else {
Utils.showToast(context, "Please turn on camera permissions");
}
}
/**
* 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;
}
总结
就是去异常就捕获,然后告诉用户, 告诉用户这个权限必须要打开,让用户手动去系统设置中去开启,至于用户最后开没开,那就不是开发的问题,但是还要注意下,如果用户不开启权限,你不让用户使用某个功能或者甚至让用户直接退出,那么这个app 是无法提交到googleplay上的,因为googlplay对权限的审核十分严格,国内的应用市场是可以正常上架的