1.RxPermissions的好处
RxPermissions是帮助开发者简化requestPermissions()相关的处理。
(1) 开发者不用担心Android运行环境的版本,如果系统是Android 6.0之前的版本,RxPermissions返回的结果是,app请求的每个权限都被允许(granted)。
RxPermissions内部已经对Android版本进行了判断:
boolean isMarshmallow() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}
public boolean isGranted(String permission) {
// 如果是Android 6.0 (Api 23)之前,则权限被允许使用。
return !isMarshmallow() || mRxPermissionsFragment.isGranted(permission);
}
(2) 将权限申请的代码(requestPermissions())和请求结果的代码(onRequestPermissionsResult())放在一起管理,避免了代码的分散。
(3) RxPermissions具备Rx(RxJava)的特性,例如可以使用链式操作,可以执行filter操作,transform操作,等等。
2.RxPermissions的使用
1.先添加依赖
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
dependencies { implementation 'com.github.tbruyelle:rxpermissions:0.10.2' }
2.代码使用实例
final PermissionListener permissionListener = new PermissionListener() { @Override public void onPermissionGranted() { //获取权限 } @Override public void onPermissionDenied(ArrayList<String> deniedPermissions) { //拒绝权限 } }; new RxPermissions(this) .request(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { if (permissionListener == null) return; if (aBoolean) { permissionListener.onPermissionGranted(); } else { permissionListener.onPermissionDenied(null); } } });
3.app内有很多权限需要调用,为了方便使用封装工具类TedPermissionUtils,以便于app内调用。
封装类实例:
public class TedPermissionUtils {
/** * 检查定位权限 * * @param context * @param permissionListener */ public static void checkLocation(final Context context, final PermissionListener permissionListener) { new RxPermissions((Activity) context) .request(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { if(permissionListener == null) return; if (aBoolean) { permissionListener.onPermissionGranted(); } else { permissionListener.onPermissionDenied(null); } } }); }
}
app调用实例:
TedPermissionUtils.checkLocation(context, new PermissionListener() { @Override public void onPermissionGranted() { if (location == null) mLocationClient.start(); } @Override public void onPermissionDenied(ArrayList<String> deniedPermissions) { //这里拒绝权限可以做你想要的操作 //toast.shortToast("您拒绝了位置权限"); // appManager.finishActivity(); } });