RxPermission封装使用
一、配置
- 在app的根目录的build.gradle添加:
api 'com.github.tbruyelle:rxpermissions:0.10.2'
- 在项目的根目录的build.gradle添加
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' } //添加该行
}
}
- 在
AndroidManifest
中配置需要申请的权限
二、开始封装
RxPermissionManager
import android.Manifest;
import android.annotation.SuppressLint;
import com.tbruyelle.rxpermissions2.RxPermissions;
/**
* Description: RxPermission管理类
*/
public class RxPermissionManager {
/**
* 请求SD卡读写权限
*
* @param rxPermissions
* @param consumer
*/
@SuppressLint("CheckResult")
public static void requestStoragePermissions(RxPermissions rxPermissions, RxPermissionConsumer consumer) {
rxPermissions.request(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(consumer);
}
}
RxPermissionConsumer
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer;
/**
* Description: 统一权限管理订阅封装
*/
public abstract class RxPermissionConsumer implements Consumer<Boolean> {
@Override
public void accept(@NonNull Boolean granted) throws Exception {
if (granted) {
success();
} else {
failure();
}
}
public abstract void success();
public abstract void failure();
}
MainActivity中如何使用
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.tbruyelle.rxpermissions2.RxPermissions;
import m.com.myapplication.permission.RxPermissionConsumer;
import m.com.myapplication.permission.RxPermissionManager;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RxPermissionManager.requestStoragePermissions(new RxPermissions(this), new RxPermissionConsumer() {
@Override
public void success() {
//todo 不论有几个权限,回调一次。权限授权成功。(全部授权成功)
}
@Override
public void failure() {
//todo 不论有几个权限,回调一次。权限授权失败。(多个权限申请时,其中一个权限未允许,即为失败。
//权限申请失败,应该弹出弹窗,引导跳转至设置界面(startActivityForResult)。
// 使用startActivityForResult跳转,设置权限页面返回后,判断权限,做下一步操作。
}
});
}
}
三、拓展
上诉的代码中仅完成了失败与错误的情况,并且只有一次回调。
下面的代码用户有很多好处:
- 拓展了多个权限同时申请时,相应的回调,有几个权限,就回调多少次。
- 可以知道哪个权限被允许,哪个权限被拒绝。
- 可以监听到用户点击拒绝权限时的“不再提醒”
- 友好的结合
rxjava
一起使用 - lanmbda表达式支持,代码更简洁
RxPermissions rxPermission = new RxPermissions(this);
rxPermission
.requestEach(Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
// Manifest.permission.ACCESS_NETWORK_STATE,
// Manifest.permission.ACCESS_WIFI_STATE,
// Manifest.permission.READ_PHONE_STATE,
// Manifest.permission.REQUEST_INSTALL_PACKAGES
)
.subscribe(new Consumer<Permission>() {
@Override
public void accept(Permission permission) throws Exception {
if (permission.granted) {
// 用户已经同意该权限
LogUtil.d(permission.name + " is granted.");
} else if (permission.shouldShowRequestPermissionRationale) {
// 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框
LogUtil.d( permission.name + " is denied. More info should be provided.");
} else {
// 用户拒绝了该权限,并且选中『不再询问』
LogUtil.d( permission.name + " is denied.");
//TODO
}
}
});
和 Rxbinding 结合,这是官方文档的例子
// Must be done during an initialization phase like onCreate
RxView.clicks(findViewById(R.id.enableCamera))
.compose(rxPermissions.ensure(Manifest.permission.CAMERA))
.subscribe(granted -> {
// R.id.enableCamera has been clicked
})
联系
遇到问题或想持续学习,请关注公众号“Android唐浮”
网友评论