首先要弄清楚几个方法
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部分手机需要做特殊处理