初始化权限申请失败的监听
PermissionUtil.init(new PermissionUtil.PermissionGlobalConfigCallback() {
//直接申请权限
@Override public void shouldShowRational(String permission, int ration) {
...
}
//跳转到设置申请权限
@Override public void onPermissionReject(String permission, int reject) {
...
}
});
定义全局Dialog提示权限申请失败信息。
showRationaleDialog()是没有勾选不再提示被拒绝的Dialog。
showRejectDialog()是被勾选不再提示的Dialog,需要手动跳转到设置页开启权限。
//直接申请权限的Dialog
private void showRationaleDialog(int ration) {
new AlertDialog.Builder(this).setTitle("权限申请").setMessage(getString(ration)).setNegativeButton("取消", null).show();
}
//需要跳转到设置的Dialog
private void showRejectDialog(int reject) {
new AlertDialog.Builder(this).setTitle("权限申请")
.setMessage(getString(reject))
.setPositiveButton("跳转到设置页", new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
//手动跳转到设置同意权限
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", BuildConfig.APPLICATION_ID, null));
startActivity(intent);
dialog.dismiss();
}
})
.setNegativeButton("取消", null)
.show();
}
在PermissionUtil中定义申请权限的失败时提示的常量值
public static final int READ_EXTERNAL_STORAGE_RATIONALE = 100;//允许应用程序从外部存储读取被拒绝
public static final int READ_EXTERNAL_STORAGE_REJECT = 1000;//允许应用程序从外部存储读取勾选不再提示被拒绝提
public static final int WRITE_EXTERNAL_STORAGE_RATIONALE = 101;//允许应用程序写入外部存储被拒绝
public static final int WRITE_EXTERNAL_STORAGE_REJECT = 1010;//允许应用程序写入外部存储勾选不再提示被拒绝提
在需要申请权限的方法上添加注解@Permission,这个方法只有所有权限同意后才会执行。
@Permission(
permissions = { Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE },
rationales = { PermissionUtil.READ_EXTERNAL_STORAGE_RATIONALE,PermissionUtil.WRITE_EXTERNAL_STORAGE_RATIONALE },
rejects = {PermissionUtil.READ_EXTERNAL_STORAGE_REJECT, PermissionUtil.WRITE_EXTERNAL_STORAGE_REJECT })
private void getStorage(){
//只有获取全部权限才会执行
Toast.makeText(this,"获取存储权限成功",Toast.LENGTH_LONG).show();
}
在PermissionUtil.init(PermissionGlobalConfigCallback)重写的两个方法会在权限被拒绝后返回@Permission中rationales和rejects传入的常量值,获取到常量值后可以通过常量值进行匹配提示权限申请失败的信息。
private void permissionInit() {
//初始化权限申请监听
PermissionUtil.init(new PermissionUtil.PermissionGlobalConfigCallback() {
//直接申请权限被拒绝
@Override public void shouldShowRational(String permission, int ration) {
//通过@Permission传入的ration判断要提示的信息,如果没有匹配到ration就使用默认的提示信息。
switch (ration) {
//获取写入权限失败
case PermissionUtil.WRITE_EXTERNAL_STORAGE_RATIONALE:
//显示Dialog提示权限被拒绝 图2
showRationaleDialog(R.string.write_external_storage_permission_rationale);
break;
case PermissionUtil.READ_EXTERNAL_STORAGE_RATIONALE:
showRationaleDialog(R.string.read_external_storage_permission_rationale);
break;
case PermissionUtil.CAMERA_RATIONALE:
showRationaleDialog(R.string.camera_permission_rationale);
break;
case PermissionUtil.READ_PHONE_STATE_RATIONALE:
showRationaleDialog(R.string.read_phone_state_permission_rationale);
break;
case PermissionUtil.CALL_PHONE_RATIONALE:
showRationaleDialog(R.string.call_phone_permission_rationale);
break;
default://如果没有设置RATIONALE就使用默认提示
showRationaleDialog(R.string.permission_rationale);
break;
}
}
//跳转到设置申请权限
@Override public void onPermissionReject(String permission, int reject) {
//通过@Permission传入的ration判断要提示的信息,如果没有匹配到reject就使用默认的提示信息。
switch (reject) {
//获取写入权限失败
case PermissionUtil.WRITE_EXTERNAL_STORAGE_REJECT:
//显示Dialog提示权限被拒绝 图3
showRejectDialog(R.string.write_external_storage_permission_reject);
break;
case PermissionUtil.READ_EXTERNAL_STORAGE_REJECT:
showRejectDialog(R.string.read_external_storage_permission_reject);
break;
case PermissionUtil.CAMERA_REJECT:
showRejectDialog(R.string.camera_permission_reject);
break;
case PermissionUtil.READ_PHONE_STATE_REJECT:
showRejectDialog(R.string.read_phone_state_permission_reject);
break;
case PermissionUtil.CALL_PHONE_REJECT:
showRejectDialog(R.string.call_phone_permission_reject);
break;
default://如果没有设置REJECT就使用默认提示
showRejectDialog(R.string.permission_reject);
break;
}
}
});
}