RxPermissions获取动态权限
本文博客基于Rxpermissions,具体使用,请自己查看。
Rxjava获取动态权限是通过Rxpermissions获取动态权限的,在学习之前我封装了一个工具类为你提供使用。先看看效果
虽然实现很简单,但是要获取很多权限的时候要写的代码比较多,而且特别难看,所以我封装了一下,实现一行代码实现。
获取一个权限(不重复写轮子)
//获取 permissionsUtils 对象
RxPermissions permissionsUtils = RxUtils.getInstance(this);
//获取xx权限
boolean camera1 = permissionsUtils.getPermissions1("xx");
就这简单使用。不是一行吗?(作弊一下)
boolean permissions1 = RxUtils.getInstance(this).getPermissions1("xx");
工具类在Demo里或者创建一个工具类把下面复制:
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.1.16'
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
public class RxUtils {
private RxUtils() {
}
public static PermissionsUtils getInstance(Activity activity) {
return new PermissionsUtils(activity);
}
public static class PermissionsUtils {
private boolean returnvalue;
public void setToast(boolean toast) {
this.toast = toast;
}
private boolean toast;
private Activity activity;
private RxPermissions rxPermissions;
public PermissionsUtils(Activity activity) {
this.activity = activity;
rxPermissions = new RxPermissions(activity);
}
public boolean getPermissions1(String permissions) {
switch (permissions) {
case "相机":
request(Manifest.permission.CAMERA);
break;
case "日历":
request(Manifest.permission.WRITE_CALENDAR);
break;
case "通讯录":
request(Manifest.permission.READ_CONTACTS);
break;
case "位置":
request(Manifest.permission.LOCATION_HARDWARE);
break;
case "电话":
request(Manifest.permission.CALL_PHONE);
break;
case "短信":
request(Manifest.permission.READ_SMS);
break;
case "存储":
request(Manifest.permission.READ_EXTERNAL_STORAGE);
break;
case "传感器":
request(Manifest.permission.SEND_RESPOND_VIA_MESSAGE);
break;
case "麦克风":
request(Manifest.permission.DISABLE_KEYGUARD);
break;
default:
returnvalue = false;
Log.e("PermissionsUtils","没次找到权限,请确认要获取的权限");
if (returnvalue==false) {
throw new NullPointerException("没次找到权限,请确认要获取的权限");
}
}
return returnvalue;
}
/**
* rxPermissions获取权限的核心方法
*/
@SuppressLint("CheckResult")
private void request(String permission) {
rxPermissions.request(permission)
.subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
returnvalue = aBoolean;
if (!returnvalue) {
if (toast) {
Toast.makeText(activity, "获取" + "权限失败", Toast.LENGTH_SHORT).show();
}
Log.e("PermissionsUtils", "获取权限成功");
}
}
});
}
/**
* @return 返回是否吐司
*/
public boolean isToast() {
return toast;
}
/**
* 设置吐司
*/
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
正题开始
很简单接下看怎么写出来的,我拿打电话的代码举例,如果你需要测试能不能用,直接复制就可以了。(都写好了帮你快速测试)
依赖
导入Rxjava2的依赖,注意Rxjava和Rxjava2的不同,下面依赖是必要的
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.1.16'
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
清单列表
所需要的权限:比如打电话(需要什么权限,就写什么权限)
<uses-permission android:name="android.permission.CALL_PHONE" />
布局文件
功能简单就只有一个按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".RxAndrod">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电话"
/>
</LinearLayout>
代码
初始化RxPermissions对象
rxPermissions = new RxPermissions(this);
这个最好写个方法
rxPermissions.request(Manifest.permission.CALL_PHONE)
.subscribe(new Consumer<Boolean>() {
@SuppressLint("MissingPermission")
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean) {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "10086");
intent.setData(data);
startActivity(intent);
} else {
Toast.makeText(RxAndrod.this, "电话获取权限", Toast.LENGTH_SHORT).show();
}
}
});
ok
以此类推所有权限都是这样获取,或者一组获取
如果你的测试手机荣耀10,安卓系统8.1的,有问题,请联系我。