本文目的:“借助透明Activity封装一个易于调用的权限请求模块”
1 介绍
Android权限的校验和申请比较简单,但在实际项目中使用时还要进行系统版本的适配,最不友好的是权限的申请结果需要在 onRequestPermissionsResult 中进行判断,如果项目中有多个地方需要申请权限,或者申请权限的代码在自定义的组件中,而申请结果判断则在activity或fragment中,那代码就会显得很乱,对于后期维护也是很不方便,因此我们就来封装一个简单的权限申请模块。
2 测试用例设计
首页我们还是先设计一个权限申请的测试用例步骤:
1、首先判断所需要的权限是否已经过用户授权;
2、如果没有经过用户授权,则申请权限;
3、如果用户授权,则调用相关功能;
4、如果用户拒绝授权,则提示信息。
解析流程:
输入:需要的权限
输出:授权/拒绝
测试用例的代码实现:
String[] permisstions = new String[]; //申请所需要权限
PermissionHelper.request(context,permisstions,new Listener(){
void granted(){
//授权后执行
}
void denied(){
//拒绝后执行
}
});
测试用例实现了输入、输出,其他步骤就需要在模块中实现,对调用方透明。
3 实现
首先我们先实现PermissionHelper类,功能是判断权限是否被授权,如果没有被授权则申请权限。
/**
* 权限帮助类
* Created by lidong on 2019/10/25.
*/
public class PermissionHelper {
/**
* 请求权限
*
* @param context context
* @param permissions 权限
* @param listener 监听
*/
public static void request(Context context, String[] permissions, PermissionListener listener) {
//判断权限,如果所有权限全被授权,直接返回
if (checkPermission(context, permissions)) {
if (listener != null) {
listener.granted();
}
return;
}
//申请权限
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
//6.0以下没有申请权限,直接返回拒绝
if (listener != null) {
listener.denied();
}
} else {
//6.0及以上申请权限
//为了统一回调需要借用一个activity
PermissionActivity.open(context, permissions, listener);
}
}
/**
* 校验权限
*
* @param context context
* @param permissions 权限
* @return 所有权限已被授权返回true,否则返回false
*/
protected static boolean checkPermission(Context context, String[] permissions) {
for (String per : permissions) {
int result = PermissionChecker.checkSelfPermission(context, per);
if (result != PermissionChecker.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
* 权限监听
*/
public interface PermissionListener {
/**
* 所有权限已被授权
*/
void granted();
/**
* 一个或多个权限被拒绝
*/
void denied(