话说相同的开源库总是有一些的,不唯一,权限管理也是如此,我们可以选择 AndPermission,RxPermission 等,那么我们常见的需求出现一个了,未来如何在切换开源库时不影响我们的业务代码吗,要达到一处崔改,处处适用的效果呢
这里就要求我们对这些开源库进行二次封装了,这里我简单的封装了一下,看看 api
btn_permission.setOnClickListener(v -> {
PermissionComponent.with(this)
.permissin(Manifest.permission.CAMERA)
.onSuccess(() -> show("成功!"))
.onDenial(() -> show("失败!"))
.onDontShow(() -> {
// 打开权限管理页面
PermissionComponent.startSettingActivity(MainActivity.this, 200);
})
.run();
});
支持 activity,fragment,content,这个支持几种需要看我们里买使用的什么开源库了。提供了3个回调,给权限,拒绝权限,不再显示权限弹窗的回调,提供了打开权限设置页的功能。切换底层开源库的方法都懒没写。
代码很简单,就是很繁琐,我简单说一下
Snip20180420_11.png
- contentSource 维护不同的上下文类型
- executer 维护的不同的具体的开源库
- action 是针对3种回调的抽象接口
- permissioncontain 保存全部的所需的参数
- PermissionComponent 是暴露给外层使用的工具累
- PermissinManage 是具体的业务实现类
这个例子里面,我只是实现了 AndPermission 的集成,RxPermission 有兴趣的自己去搞搞,原理都是一样的
最后
写完代码之后我是沮丧的,感觉就是简单的写了半遍 AndPermission,其实可以写的很简单的
public static void requestPermission( Activity activity,Action success,Action denial,Action dontShow,String... permissions ){...}
public static void requestPermission( Fragment fragment,Action success,Action denial,Action dontShow,String... permissions ){...}
public static void requestPermission( Context context,Action success,Action denial,Action dontShow,String... permissions ){...}
就像这样就行了, 我当时也是为了想要 API 好看一点,没想到代码会爆炸这么多,这个真是仁者见仁,智者见智的事,我觉得代码封装就是为了方便大家,最简单的一般来说都是比较好的。