Android 中RxPermissions 的使用

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中添加自己需要用到的权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.CAMERA"/>
第三步,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};

@Override
protected 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<Boolean>() {
                    @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<Boolean>() {
                @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<Permission>() {
                @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<Permission>() {
                @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<Boolean>() {
                @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<Permission>() {
                @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<Permission>() {
                @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

THE END
< <上一篇
下一篇>>