android——RxPermissions获取运行时权限
2022-01-13 本文已影响0人
hao_developer
Android6.0+添加了运行时权限分为两类:
一类是Normal Permissions,这类权限不涉及个人隐私,不需要用户进行授权,比如手机震动,访问网络;
一类是Dangerous Permissions,这类权限涉及个人隐私,需要用户进行授权,比如读取SD卡,访问通讯录等。
Android6.0 普通做法就是一个个去判断,这个当然太麻烦。 这里给出一个不错的第三方库, 使用超级简单,我们直接调用方法,几乎可以忽略一切需要自己处理的东西。
RxPermissions 网址 https://github.com/tbruyelle/RxPermissions
使用:
在app的buildgradle文件中添加依赖:
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
//RxJava2
compile "io.reactivex.rxjava2:rxjava:2.0.0"
单个权限使用 拨打电话为例
button1_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RxPermissions rxPermissions = new RxPermissions(TimeActivity.this);
// 添加所需权限
rxPermissions.request(Manifest.permission.CALL_PHONE)
.subscribe(new Observer<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Boolean value) {
if (value) {
Toast.makeText(TimeActivity.this, "同意权限 去打电话逻辑", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(TimeActivity.this, "拒绝权限", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
});
注意:若 添加权限事找不到* 该权限 会爆红* 要引入的 为
import android.Manifest;
多个权限使用一起返回 拍照和录音权限为例
button3_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 多个权限用"," 隔开
RxPermissions rxPermissions2 = new RxPermissions(TimeActivity.this);
rxPermissions2.request(
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO)
.subscribe(new Observer<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
Log.i(TAG, "onSubscribe");
}
@Override
public void onNext(Boolean value) {
// value 为ture 说明权限都开启,只要所请求权限有一个为关闭 ,则为false
if (value) {
Toast.makeText(TimeActivity.this, " 去打开相机逻辑 ", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(TimeActivity.this, "拒绝权限", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError_" + e.toString());
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete");
}
});
}
});
多个权限使用逐个返回 拍照和录音权限为例
和一起返回的区别 new Consumer<>()
用一个数组去保存 识别哪些返回 注意 accept()调用次数和需要申请的权限个数有关 。需要处理 返回结果 这里 return 无效
// 成员变量 用来保存申请权限返回识别,方便做处理 长度和请求个数有关
final boolean[] isPermissionType = {false, false};
button2_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RxPermissions rxPermissions = new RxPermissions(TimeActivity.this);
//分别申请多个权限
//分别申请多个权限时,使用requestEach
rxPermissions.requestEach(
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO) // 和一起返回区别
.subscribe(new Consumer<Permission>() {
@Override
public void accept(Permission permission) throws Exception {
Log.i("permissions", "回调次数 ?????");
if (permission.name.equals(Manifest.permission.CAMERA)) {
//当RECORD_AUDIO 权限获取成功时,permission.granted=true
Log.i("permissions", Manifest.permission.CAMERA + ":" + permission.granted);
isPermissionType[0] = permission.granted;
if (!isPermissionType[0]) {
Toast.makeText(TimeActivity.this, "拒绝权限 +CAMERA ", Toast.LENGTH_SHORT).show();
return;
}
}
if (permission.name.equals(Manifest.permission.RECORD_AUDIO)) {
//当CAMERA权限获取成功时,permission.granted=true
Log.i("permissions", Manifest.permission.RECORD_AUDIO + ":" + permission.granted);
isPermissionType[1] = permission.granted;
// 如果上一个权限没开 ,就不再提示第二个, 若不处理 所有请求的没开权限 都会提示
if (!isPermissionType[0]) {
} else {
if (!isPermissionType[1]) {
Toast.makeText(TimeActivity.this, "拒绝权限 + RECORD_AUDIO ", Toast.LENGTH_SHORT).show();
return;
}
}
}
if (isPermissionType[0] && isPermissionType[1]) {
Toast.makeText(TimeActivity.this, " 去打开相机逻辑", Toast.LENGTH_SHORT).show();
}
}
});
// 多个权限用逗号隔开
}
});
使用就是这么简单 使用逐个返回时候 ,和guthub 给出的有点区别 这个 rxjava 有关。 需要注意区分
new Action1<Boolean>() //rxjava1 为
new Consumer<Permission>() //rxjava2