!!!代码在文末!!!
内容如题,为什么要封装一个权限请求库,就是因为便于维护。
注意,本文不是开发一个权限请求库,是基于已有的三方权限请求库,进行二次封装,以便于
后续项目的维护!!!
发问
(一)权限二次封装,需要什么,怎样做到随意切换?
(二)除了封装已有的功能,还需要额外增加什么功能更便于日常需求开发?
带着这两个问题,进入下一步。
思路
博主采用的是构造者模式,抽象工厂模式进行封装,这样对于后续的维护更加方便。
对于库的入参,使用的是构造者模式,这样便于后续参数的维护。
核心代码如下:
/**
* builder 模式
*/
//context
public static PermissionUtils with(Activity activity) {
return new PermissionUtils(activity);
}
public static PermissionUtils with(Fragment fragment) {
return new PermissionUtils(fragment.requireContext());
}
public static PermissionUtils with(android.app.Fragment fragment) {
return new PermissionUtils(fragment.getActivity());
}
//拦截器
public PermissionUtils intercept(PermissionIntercept intercept) {
this.mIntercept = intercept;
return this;
}
//权限请求框架类型
public PermissionUtils type(PermissionType type) {
this.mPermissionType = type;
return this;
}
//permission
public PermissionUtils request(String[] permission) {
this.mRequestGroup = permission;
return this;
}
//key
public PermissionUtils key(int key) {
this.mReqKey = key;
return this;
}
//listener
public PermissionUtils setListener(PermissionCallback callback) {
this.mCallback = callback;
return this;
}
//拒绝后自动进入设置页面
public PermissionUtils autoIntoSetting(boolean enter) {
this.mAutoEnterSetting = enter;
return this;
}
//build
public PermissionUtils start() {
build();
return this;
}
后续若有新参数传入,只需要直接加参数即可。
对于权限的实现,这里使用的是xxpermission库,主要定义了抽象接口进行实现:
/**
* 判断是否拥有权限
*/
public boolean isGrant(Context context, String permission);
public boolean isGrant(Context context, String[] permission);
public boolean isGrant(Context context, List<String> permission);
/**
* 请求权限
*/
public void requestPermission(Activity activity, String[] permission,
int type, boolean enterSetting, PermissionCallback callback);
public void requestPermission(Activity activity, List<String> permission,
int type, boolean enterSetting, PermissionCallback callback);
public void requestPermission(Fragment fragment, String[] permission,
int type, boolean enterSetting, PermissionCallback callback);
public void requestPermission(Fragment fragment, List<String> permission,
int type, boolean enterSetting, PermissionCallback callback);
public void requestPermission(android.app.Fragment fragment, String[] permission,
int type, boolean enterSetting, PermissionCallback callback);
public void requestPermission(android.app.Fragment fragment, List<String> permission,
int type, boolean enterSetting, PermissionCallback callback);
后续若再有其他库,则实现类实现这些接口即可。
最后,核心的构造方法如下:
public static PermissionImplApi create(PermissionType permissionType) {
PermissionImplApi implApi;
switch (permissionType) {
case TYPE_PERMISSION_XX:
implApi = new XXPermission();
break;
default:
implApi = new XXPermission();
break;
}
return implApi;
}
至此,已经全部实现了普通请求权限功能。
但,很多应用请求权限时,都会有个应用内弹窗先让用户了解这些权限时用来干什么的,点击确认后,才会有后续的权限申请。这里特意封装了一个拦截器。开发者只需要实现拦截器类即可。实例代码如下:
public class PermissionIntercept1 implements PermissionIntercept {
@Override
public boolean ensureDialog(Context context, InterceptDialogCallback interceptDialog) throws Exception {
PermissionDialog.Builder builder = new PermissionDialog.Builder(context);
builder.setIcon(R.mipmap.ic_launcher) //设置图标
.setTitle("我是对话框") //设置标题
.setMessage("请求权限") //设置消息
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
interceptDialog.confirm();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
interceptDialog.cancel();
}
})
.create() //创建
.show(); //显示
return true;
}
}
最后,只需调用一下以下方法,即可申请权限,注意,某些参数不一定要填写,请按需设置:
PermissionUtils.with((Activity) getContext())
.key(1111)
.intercept(new PermissionIntercept1())
.request(new String[]{Permission.READ_PHONE_STATE})
.setListener(new PermissionCallback() {
@Override
public void result(int type, int status, boolean grantAll) {
LogUtil.d("result: type" + type + " status: " + status + " grantAll: " + grantAll);
}
@Override
public void result(int type, int status, List<String> permissions, boolean grantAll) {
LogUtil.d("result2: type" + type + " status: " + status + " permissions: " + GsonUtils.getJsonStr(permissions) + " grantAll: " + grantAll);
}
@Override
public void error(int code) {
LogUtil.d("result2: error" + code);
}
}).start();
代码地址--库libpermission
that's all----------------------------------------------------