Android 中RxPermissions 的使用方法详解,

以请求拍照、读取位置权限为例

第一步,在module的build.gradle中的
dependencies {//   RxPermissions 的使用方法详解    implementation 'com.github.tbruyelle:rxpermissions:0.10.2'    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'    implementation 'io.reactivex.rxjava2:rxjava:2.2.4'}

还有在最外面那个文件夹下面的build.gradle 加入

allprojects {    repositories {        ...        maven { url 'https://jitpack.io' }    }}
第二步,在AndroidManifest.xml中添加自己需要用到的权限:
第三步,activity中使用以及注意事项
1,创建 RxPermissions 实例
RxPermissions rxPermissions = new RxPermissions(this);

注意:this 参数可以是 FragmentActivity 或 Fragment。如果你在 fragment 中使用 RxPermissions,你应该传递 fragment 实例作为构造函数参数而不是 fragment.getActivity(),否则你可能抛出异常 java.lang.IllegalStateException: FragmentManager is already executing[执行]

2、请求权限,必须在初始化阶段比如 onCreate 中调用

如上所述,由于您的应用程序可能在权限请求期间重新启动,因此请求必须在初始化阶段完成。这可能是 Activity.onCreate 或View.onFinishInflate,但不能在 onResume 等 pausing 方法中,因为由于您请求的 activity 在权限请求期间被框架暂停了,因此您可能会创建一个无限的请求循环。

如果没有,并且如果您的应用程序在权限请求期间重新启动了(例如,由于配置更改),则用户的响应将永远不会发送给订阅者。

3、RxPermissions 里面的方法总结,
request 不支持返回权限名; 返回的权限结果:全部同意时值true,否则值为false 申请结果:false
requestEach 把每一个权限的名称和申请结果都列出来 权限名称:android.permission.READ_CONTACTS,申请结果:false权限名称:android.permission.WRITE_CONTACTS,申请结果:false权限名称:android.permission.READ_SMS,申请结果:false权限名称:android.permission.ACCESS_FINE_LOCATION,申请结果:true权限名称:android.permission.ACCESS_COARSE_LOCATION,申请结果:true
requestEachCombined 返回的权限名称:将多个权限名合并成一个; 返回的权限结果:全部同意时值true,否则值为false 权限名称:android.permission.READ_CONTACTS, android.permission.WRITE_CONTACTS, android.permission.READ_SMS, android.permission.ACCESS_FINE_LOCATION, android.permission.ACCESS_COARSE_LOCATION,申请结果:false
ensureEach 必须配合rxjava,回调结果跟requestEach一样
ensureEachCombined 必须配合rxjava,回调结果跟requestEachCombined一样
4、RxPermissions 里面的方法具体实现,
public class RxPermissionsActivity extends AppCompatActivity {    /**     * 权限组     */    private static final String[] permissionsGroup = new String[]{            Manifest.permission.ACCESS_FINE_LOCATION,            Manifest.permission.CAMERA};@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_rx_permissions);    findViewById(R.id.onclick_tv).setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            testRequestEach(v);        }    });}/*    private void 方法一() {//        创建 RxPermissions 实例        RxPermissions rxPermissions = new RxPermissions(RxPermissionsActivity.this);        rxPermissions.request(permissionsGroup)                .subscribe(new Observer() {                    @Override                    public void onSubscribe(Disposable d) {                    }                    @Override                    public void onNext(Boolean aBoolean) {                    if (aBoolean) {                        Toast.makeText(RxPermissionsActivity.this, "已获取权限,可以干想干的咯", Toast.LENGTH_LONG)                                .show();                    } else {//只有用户拒绝开启权限,且选了不再提示时,才会走这里,否则会一直请求开启                            Toast.makeText(RxPermissionsActivity.this, "主人,我被禁止啦,去设置权限设置那把我打开哟", Toast.LENGTH_LONG)                                    .show();                        }                    }                @Override                public void onError(Throwable e) {                }                @Override                public void onComplete() {                }            });}*//** * request例子: * 不支持返回权限名; * 返回的权限结果:全部同意时值true,否则值为false */public void testRequest(View view) {    RxPermissions rxPermissions = new RxPermissions(this);    rxPermissions.request(permissionsGroup)            .subscribe(new Consumer() {                @Override                public void accept(Boolean aBoolean) throws Exception {                }            });}/** * requestEach例子: * 把每一个权限的名称和申请结果都列出来 */public void testRequestEach(View view) {    RxPermissions rxPermissions = new RxPermissions(this);    rxPermissions.requestEach(permissionsGroup)            .subscribe(new Consumer() {                @Override                public void accept(Permission permission) throws Exception {                    if (permission.granted) {                        // 用户已经同意该权限                    } else if (permission.shouldShowRequestPermissionRationale) {                        // 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时。还会提示请求权限的对话框                    } else {                        // 用户拒绝了该权限,而且选中『不再询问』那么下次启动时,就不会提示出来了,                    }                }            });}/** * requestEachCombined例子: * 返回的权限名称:将多个权限名合并成一个 * 返回的权限结果:全部同意时值true,否则值为false */public void testRequestEachCombined(View view) {    RxPermissions rxPermissions = new RxPermissions(this);    rxPermissions.requestEachCombined(permissionsGroup)            .subscribe(new Consumer() {                @Override                public void accept(Permission permission) throws Exception {                }            });}/** * ensure例子: * 必须配合rxjava,回调结果与request一样 */public void testEnsure(View view) {    RxPermissions rxPermissions = new RxPermissions(this);    Observable.timer(10, TimeUnit.MILLISECONDS)            .compose(rxPermissions.ensure(permissionsGroup))            .observeOn(AndroidSchedulers.mainThread())            .subscribe(new Consumer() {                @Override                public void accept(Boolean aBoolean) throws Exception {                    Log.i("cxw", "申请结果:" + aBoolean);                }            });}/** * ensureEach例子: * 必须配合rxjava,回调结果跟requestEach一样 */public void testEnsureEach(View view) {    RxPermissions rxPermissions = new RxPermissions(this);    //    Observable.timer(10, TimeUnit.MILLISECONDS)            .compose(rxPermissions.ensureEach(permissionsGroup))            .observeOn(AndroidSchedulers.mainThread())            .subscribe(new Consumer() {                @Override                public void accept(Permission permission) throws Exception {                    Log.i("cxw", "权限名称:" + permission.name + ",申请结果:" + permission.granted);                }            });}/** * ensureEachCombined例子: * 必须配合rxjava,回调结果跟requestEachCombined一样 */public void testEnsureEachCombined(View view) {    RxPermissions rxPermissions = new RxPermissions(this);    Observable.timer(10, TimeUnit.MILLISECONDS)            .compose(rxPermissions.ensureEachCombined(permissionsGroup))            .observeOn(AndroidSchedulers.mainThread())            .subscribe(new Consumer() {                @Override                public void accept(Permission permission) throws Exception {                    Log.i("cxw", "权限名称:" + permission.name + ",申请结果:" + permission.granted);                }            });}}

个人demo

https://github.com/kingsley1212/RxPermissions

github地址:

https://github.com/tbruyelle/RxPermissions

感谢 作者:崔兴旺
链接:https://www.jianshu.com/p/9c98348c67be

更多相关文章

  1. 怎样使用android自带例子程序
  2. Android的权限分类
  3. Android 9.0 网络权限的问题以及android:usesCleartextTraffic
  4. 我的Android进阶之旅------>Android拍照小例子
  5. Android 6.0之后的动态权限
  6. Android 应用程序获得系统权限
  7. 由Android4.4收起写sdcard文件权限想到的.

随机推荐

  1. 谷歌应用在Android智能机渗透率高达七成
  2. android v7兼容包RecyclerView的使用(四)—
  3. Android优秀学习资源列表
  4. Android语音便签快速调用-内置录音程序
  5. Android(安卓)Universal Image Loader 源
  6. Android(安卓)greenDAO3x数据库框架使用
  7. 【Android】Android 监听apk安装替换卸载
  8. Android TextView实现滚动跑马灯效果Marq
  9. Android百度地图之显示地图
  10. Android开发视频教程大总结―23部视频教