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