这里使用 的是 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提供的转换,过滤,链接......

更多相关文章

  1. Android(安卓)教你一步步搭建MVP+Retrofit+RxJava网络请求框架
  2. android.permission.WRITE_SECURE_SETTINGS
  3. 设置程序[置顶] android(10)_android权限大全
  4. Android(安卓)常用权限和使用说明
  5. adb code
  6. Android系统启动流程 -- linux kernel
  7. SharedPreferences存储数据及文件数据存储
  8. Android应用架构 (Android(安卓)Dev Summit 2015)
  9. Android(安卓)系统第三方应用系统修改权限及在应用上层显示权限

随机推荐

  1. 【iOS】网页中调用JS与JS注入
  2. 使用iTunes把电脑中的视频传到iPhone的方
  3. .9图片的制作(draw9patch.bat工具的使用)
  4. 【第二版】高仿Android网易云音乐企业级
  5. FAQ_17 android string.xml 里面的 %
  6. 转..android 开发的心酸历史
  7. Android(安卓)IMSI和IMEI
  8. Android多渠道打包之Python打包
  9. [置顶] 为学Android,我看了这些书
  10. android视频录制与滤镜(二)——google官方