Android7.0以上动态权限申请 使用RxPermissions框架,让申请权限更加轻松。
这里使用 的是 RxPermissions ,由RxJava2提供支持的Android运行时权限 ,让代码简洁,申请权限更加方便。
该库允许将RxJava与新的Android M权限模型一起使用。
使用时候导入依赖:
allprojects { repositories { ... maven { url 'https://jitpack.io' } }}dependencies { implementation 'com.github.tbruyelle:rxpermissions:0.10.2' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' implementation 'io.reactivex.rxjava2:rxjava:2.1.6'}
用法
创建一个RxPermissions
实例:
final RxPermissions rxPermissions = new RxPermissions(this); //这是一个Activity或Fragment实例
注: new RxPermissions(this)
该this
参数可以是FragmentActivity或片段。如果您RxPermissions
在片段内使用,则应将片段instance(new RxPermissions(this)
)作为构造函数参数传递,而不是new RxPermissions(fragment.getActivity())
或者您可以面对java.lang.IllegalStateException: FragmentManager is already executing transactions
。
示例:请求CAMERA权限(为简洁起见,请使用Retrolambda,但不是必需的)
// 必须在初始化阶段完成,如onCreate rxPermissions.request(Manifest.permission.CAMERA) .subscribe(granted -> { if (granted) { // // 授权 } else { // 权限被拒绝 } });
如果需要从特定事件触发权限请求,则需要在初始化阶段将事件设置为可观察对象。
您可以使用JakeWharton / RxBinding将视图转换为可观察的(未包含在库中)。
示例:
// 必须在初始化阶段完成,如onCreateRxView.clicks(findViewById(R.id.mPermissions)) .compose(rxPermissions.ensure(Manifest.permission.CAMERA)) .subscribe(granted -> { // R.id.mPermissions 已被点击 });
如果同时有多个权限,则结果为:
rxPermissions.requestEach(mPermissions).subscribe(new Consumer() { @Override public void accept(Permission permission) { Log.i("TAG", "accept: " + permission.toString()); if (permission.granted) { //权限获取成功 处理事件 ThreadTask.getInstance().executorOtherThread(new Runnable() { @Override public void run() { batchAddContact(MainActivity.this, models); } },10); } else if (permission.shouldShowRequestPermissionRationale) { //权限获取失败,但是没有永久拒绝, 可以自己设置一个对话框提示用户需授权使用 PermissionUtil.PermissionDialog(MainActivity.this, PermissionUtil.permissionText(mPermissions)); } else { //权限获取失败,而且被永久拒绝 } } });
您还可以使用requestEach
或观察详细结果ensureEach
:
rxPermissions .requestEach(Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE) .subscribe(permission -> { //将发出2权限对象 if (permission.granted) { // `permission.name` 被授予! } else if (permission.shouldShowRequestPermissionRationale) { //拒绝权限,不要再问任何其他 } else { //拒绝权限再问一次 //需要转到设置 } });
您还可以使用requestEachCombined
或获得组合的详细结果ensureEachCombined
:
rxPermissions .requestEachCombined(Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE) .subscribe(permission -> { //将发出1个权限对象 if (permission.granted) { //所有权限授予! } else if (permission.shouldShowRequestPermissionRationale) //至少有一个被拒绝的权限,而不再问任何问题 } else { //至少有一个被拒绝的权限再问一次 //需要去设置 } });
如上所述,由于您的应用程序可能在权限请求期间重新启动,因此请求必须在初始化阶段完成。这可能是Activity.onCreate
,或者 View.onFinishInflate
,但不是暂停方法onResume
,因为您可能会创建无限的请求循环,因为您的请求活动在权限请求期间被框架暂停。
如果没有,并且如果您的应用程序在权限请求期间重新启动(例如,由于配置更改),则用户的答案将永远不会发送给订阅者。
优点
-
避免担心框架版本。如果sdk是pre-M,则观察者将自动接收授予的结果。
-
阻止您在权限请求和结果处理之间拆分代码。目前没有此库,您必须在一个地方请求权限并处理结果
Activity.onRequestPermissionsResult()
。 -
所有RX提供的转换,过滤,链接......
更多相关文章
- Android(安卓)教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- android.permission.WRITE_SECURE_SETTINGS
- 设置程序[置顶] android(10)_android权限大全
- Android(安卓)常用权限和使用说明
- adb code
- Android系统启动流程 -- linux kernel
- SharedPreferences存储数据及文件数据存储
- Android应用架构 (Android(安卓)Dev Summit 2015)
- Android(安卓)系统第三方应用系统修改权限及在应用上层显示权限