从android6.0,api 23 以后,android新增加了动态权限的使用。23之前,所有的权限都是在安装应用的时候,直接告诉用户该应用使用了哪些权限,而用户并没有选择的权利。
第一步:依赖包
compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
第二步:多权限的权限申请(requestEach)
RxPermissions rxPermissions=new RxPermissions(context); rxPermissions.requestEach(permissions) .throttleFirst(2000, TimeUnit.MILLISECONDS) .subscribe(new Consumer<Permission>() { @Override public void accept(Permission permission) throws Exception { if (permission.granted) { // 用户允许权限 if(callBack != null){ callBack.accept(); } } else if (permission.shouldShowRequestPermissionRationale) { // 用户拒绝了权限申请 permissionFail(permission.name,context); } else { // 用户拒绝,并且选择不再提示,可以引导用户进入权限设置界面开启权限 alertDialog(context); } } });虽然申请了多个权限,如相机,语音的权限,如果相机的权限同意了,及时语音的权限不同意;那么也会进入到 允许权限的方法中。所以这个方法更时候申请单一权限,我们可以非常清楚的控制这一个的权限。每个权限调用一次方法
第三步:同时多权限申请 (request)
RxPermissions rxPermissions=new RxPermissions(context); rxPermissions.request(permissions) .throttleFirst(2000, TimeUnit.MILLISECONDS) .subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean permission) throws Exception { if(permission){ if(callBack != null){ callBack.accept(); } }else { // 用户拒绝了权限申请 for (String item: permissions) { permissionFail(item,context); } alertDialog(context); } } });这个方法,当申请 照相和语音的时候,只有当两个权限都同时满足允许的条件才会返回true。
备注:
当在设置的权限中来回修改权限的时候,再次回到app的时候,我们需要进行app的重新启动,保证修改完后,app不会因为数据的丢失导致app出现问题。
/** * 用户拒绝,并且选择不再提示,可以引导用户进入权限设置界面开启权限 * @param context */ private static void alertDialog(@Nullable final Activity context){ if(context != null){ new AlertDialog.Builder(context) .setCancelable(false) .setTitle("权限要求") .setMessage("如果没有请求的权限,此应用程序可能无法正常工作。打开app设置界面修改app权限") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", context.getPackageName(), null); intent.setData(uri); context.startActivity(intent); context.finish(); } }) .setNegativeButton("取消", null) .create() .show(); } }