Android 中RxPermissions 的使用
16lz
2021-01-23
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
更多相关文章
- 怎样使用android自带例子程序
- Android的权限分类
- Android 9.0 网络权限的问题以及android:usesCleartextTraffic
- 我的Android进阶之旅------>Android拍照小例子
- Android 6.0之后的动态权限
- Android 应用程序获得系统权限
- 由Android4.4收起写sdcard文件权限想到的.