多个权限:
private String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE};
private List permissionList = new ArrayList<>();
/**
* 获取相册权限
*/
private void getPermission() {
if (permissionList != null) {
permissionList.clear();
}
//版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//权限是否已经 授权 GRANTED---授权 DINIED---拒绝
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(permission);
}
}
if(!permissionList.isEmpty()){
ActivityCompat.requestPermissions(this, permissionList.toArray(new String[permissionList.size()]), 1000);
}else{
//表示全都授权了
getPic();
}
}
}
//权限回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1000) {
//权限请求失败
if(grantResults.length > 0){
//存放没授权的权限
List deniedPermissions = new ArrayList<>();
for(int i = 0; i < grantResults.length; i++){
int grantResult = grantResults[i];
String permission = permissions[i];
if(grantResult != PackageManager.PERMISSION_GRANTED){
deniedPermissions.add(permission);
}
}
if(deniedPermissions.isEmpty()){
//说明都授权了
getPic();
} else {
//默认false 第二次提醒会有是否不在询问按钮,选择则为true 不在提醒是否申请权限
if (!shouldShowRequestPermissionRationale(deniedPermissions.get(0))) {
permissionDialog();
}
}
}
}
}
/**
* 弹窗是否允许权限
*/
private void permissionDialog() {
MyAlertDialog permissionDialog = new MyAlertDialog(this);
permissionDialog.setContentText("需要相机和读写权限,是否去设置?");
permissionDialog.setCustomDialogListener(new MyDialogClickListener() {
@Override
public void clickRight(Dialog dialog, Object data) {
//允许
goToAppSetting();
}
@Override
public void clickLeft(Dialog dialog, Object data) {
//拒绝
}
});
}
注意:小米手机在跳转去申请权限的时候会出现,给了权限但是依然无法使用的问题,请进入系统权限设置才可生效
如果是MIUI12,则需要进入隐私保护,在里面找到需要设置的app,授权权限才可
原因是因为跳转的权限是小于系统权限的,跳转设置权限并不包含系统权限,也就是系统权限大于和包含跳转权限。
不知道是bug还是小米故意为之
/**
* 拒绝权限,跳转到app设置
*/
private void goToAppSetting() {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 123);
}
private void goPhotoAlbum() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 2);
}
public void startCamera(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 3);
}
单个权限申请:单个权限