Android 权限申请
使用RxPermissions进行权限申请和用户拒绝,并且选择不再提示的处理
implementation 'com.github.tbruyelle:rxpermissions:0.12'
public class PermissionUtils {
/**
* 权限申请
*
* @param activity
* @param callBack
*/
@SuppressLint("CheckResult")
public static void requestPermission(Activity activity, ICallBack callBack, String... permissions) {
final RxPermissions rxPermissions = new RxPermissions(activity);
rxPermissions.requestEach(permissions)
.subscribe(permission -> {
if (permission.granted) {
// 用户允许权限
callBack.callback();
} else if (permission.shouldShowRequestPermissionRationale) {
// 用户拒绝了权限申请
} else {
// 用户拒绝,并且选择不再提示
// 可以引导用户进入权限设置界面开启权限
permissionRefuseDialog(activity);
}
});
}
public static AlertDialog alertDialog;
public static void permissionRefuseDialog(Context context) {
//禁止后的弹框
if (alertDialog == null) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(context.getString(R.string.apply_permission))
.setMessage(context.getString(R.string.delegating_reason))
.setPositiveButton(context.getString(R.string.delegating), (dialog, id) -> {
if (alertDialog != null && alertDialog.isShowing()) {
alertDialog.dismiss();
}
CommentUtils.openPermission(context);
});
alertDialog = builder.create();
// alertDialog.setCanceledOnTouchOutside(false);
}
alertDialog.show();
}
public interface ICallBack {
void callback();
}
}
/**
* 打开权限界面
* @param context
*/
public static void openPermission(Context context){
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
context.startActivity(intent);
}
调用示例
/**
* 读取手机联系人
*/
private void gotoContacts() {
PermissionUtils.requestPermission(this, () -> {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_CONTACTS);
}, Manifest.permission.READ_CONTACTS);
}