使用方式:
Step1.
allprojects {
repositories {
...
maven {
url 'https://jitpack.io'
}
}
}
Step2.
implementation 'com.github.qyxghcl:WPermission:v1.0'
Step3.
PermissionManager.getDefault().requestPermission(this
, new PermissionManager.OnRequestPermissionListener() {
@Override
public void onGranted() {
Toast.makeText(MainActivity.this, "权限通过", Toast.LENGTH_SHORT).show();
}
@Override
public void onDeny(boolean isSystemShow) {
if (isSystemShow){
Toast.makeText(MainActivity.this, "权限被拒绝,但是没有选择不再询问" +
",下次重新请求依旧会有系统弹窗", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this, "" +
"权限被拒绝,选择不再询问,下次重新请求不会有系统弹窗", Toast.LENGTH_SHORT).show();
}
}
}, Permissions.STORAGE);
运行时权限简介:
Android6.0开始添加了运行时权限,至此,权限可以分为两类:
//分类
运行时权限分类 {
1.Normal Permissions -> {
不涉及个人隐私,不需要用户额外授权(例如:访问网络,手机震动等)
}
2.Dangerous Permissions -> {
涉及个人隐私,需要用户额外授权(例如:读取sd卡,访问通讯录)
}
}
因为有了Dangerous Permissions的存在,所以我们需要与用户交互,以获取到这些危险但在一定业务需求下必要的权限
Dangerous Permissions的权限状态(可以分为三类):
//权限状态
Dangerous Permissions {
1.已授权 -> {
用户已经授权的权限,即可以直接执行业务逻辑
}
2.未知授权状态 -> {
需要展示交互界面,从而确定用户是否愿意给于这项权限
}
3.已拒绝 -> {
用户已经拒绝此项权限,因此,我们的业务无法执行
}
}
那么,当我们碰到需要危险权限的业务时,就需要知道当前权限是处于什么样的状态,从而决定我们下一步怎么做.
权限状态判定(此处为伪代码):
//listener是请求失败与否的回调,
权限状态判定 (Listener listener){
//1.如果小于6.0则表示并不需要运行时权限,判定为成功
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
listener.onGranted();
return;
}
//2.判定所有请求的权限状态是否均为通过,如果全通过,判定为成功
if (hasAllPermissions(activity, permissions)) {
listener.onGranted();
return;
}
//3.筛选出所有状态不属于通过的权限
String[] unPassPermissions = screenOutUnPassedPermissions(activity, permissions);
//此处为进一步预防检测,如果状态不属于通过的权限数量为0,
//那么也算作通过,不过经过第二步的判断,一般情况下不会走到这里
if (unPassPermissions.length == 0) {
listener.onGranted();
return;
}
//此处借助了RxPremission的思想,通过一个fragment去请求权限
//4.开始对那些不是通过状态的权限进行询问(未知,未通过)
//开始询问的那一刻即弹出系统的权限请求框
//注意: 接收回调的结果为用户选择的结果
//(也就是说,这是接收的选择框选择的结果,已经和步骤1,2,3判定的结果无关了)
new RequestPermissionActivity(activity).requestPermissions(REQ_PER_CODE, unPassPermissions, new RequestPermissionActivity.Callback() {
//接收到回调,这里最主要做的事情就是,将未知状态的权限交由用户处理,将其再次划分,则只剩下了通过,未通过两种状态
@Override
public void onRequestPermissionResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//1.筛选出用户此次选择后被拒绝的权限
List<String> denied = new ArrayList<>();
for (int i = 0; i < permissions.length; i++) {
String perm = permissions[i];
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
denied.add(perm);
}
}
//2.被拒绝的权限为0,表示通过
if (denied.size() == 0) {
listener.onGranted();
return;
}
//此处剩余的都是未通过的权限,
//shouldShowRequestPermissionRationale(activity, denied)
//(1)false 代表勾选了不再询问,则需要提示用户去自主开启,即用户此次想执行业务逻辑是不准许的,并且下次请求执行的时候,不会弹出系统的选择框
//(2)true 代表拒绝,但未勾选不再询问,即用户此次想执行业务逻辑是不准许的,但下次请求执行的时候,仍旧会弹出系统的选择框,让客户选择此次是否给于通过
Activity weakActivity = mWeakActivity.get();
if (weakActivity != null) {
if (!shouldShowRequestPermissionRationale(weakActivity, denied)) {
listener.onDeny(false);
}else {
listener.onDeny(true);
}
}
}
});
}
网友评论