一款全新的权限库SimplePermission
市面上权限库很多了,为什么还要推荐这么一款新的呢?先来看一下市面上主流的权限库。
1、EasyPermission
这是Google出的给出的一个运行时权限申请库,代码质量是不错的,就是用起来吧,太繁琐,申请和回调处理逻辑写起来很累。
2、RxPermissions
基于RxJava的权限库。特点就是通过RxJava操作符来申请/回调权限,申请一组权限时,可以获取哪些同意,哪些拒绝。提供了多种请求方式,链式写法还算简洁,但是逻辑上不够简洁,也有一定学习成本。
3、PermissionsDispatcher
一款基于APT技术的权限库。使用比较优雅,就是注解有点多,实际用不了那么多;还有不支持Dialog,不支持private方法。
理想中的权限处理方式
我们都知道在Android6.0之前,权限放的很宽,只需要在Manifest中申请权限就可以用了;但是6.0之后为了用户安全着想,对于敏感的权限,需要先向用户申请,用户同意后才可以用。按照官方流程,应该是检查是否拥有权限-->申请权限--->授权结果的处理
。这还是最简单的步骤,实际上要处理的比这个还多,而且需要申请权限的页面可能还不少,每个页面都需要一大堆重复的逻辑、回调方法。就算你把部分操作放到Base,还是没有办法彻底解决问题。难道你不累吗?不烦吗?我是受不了的。
那一个理想的权限请求/处理是什么样的呢?
现在我们抛开代码实现,仅从需求出发,去想一个最舒服的使用姿势。我的理想状态是什么都不做,就和6.0之前的用法一样,申明了xx权限之后,直接写我的业务逻辑,不用去手动管理权限请求/回调这些繁杂且重复的工作。注意:这里说的什么也不做是不可能完全这样的,因为你起码要申明一下用了哪个权限/权限组吧?
权限请求流程问题
这个问题有必要先说明一下。一般在同一个应用中,所有用到运行时权限的地方,权限申请/处理逻辑是一致的,这样的话,就有可能实现只需要申明一下权限/组就能完成整个权限请求/处理流程,开发者只需要专注自己的业务即可。当然也有个别特殊的,在某个页面,权限请求逻辑和其他地方都不一样,需要单独处理一些回调。
SimplePermission
尽管这3个库很优秀,内部实现原理也值得学习,但是都有一些用起来不顺手的地方,而且基于我上面的需求,于是我推出了这款使用更简单,应用场景更广,开发者更易上手的运行时权限库SimplePermission
。
项目地址:(欢迎issue、star)
https://github.com/bit-cores/SimplePermission
优势
- 支持单权限/多权限请求
- 一行注解申请/处理权限
- 支持私有化的调用方法
- 支持权限拒绝/不再询问的自定义处理
- 支持Activity、Fragment、Dialog、PopupWindow或者其他View中使用
- 支持kotlin、androidx
- 非侵入式
框架内部权限执行流程
权限申请流程.png一行代码解决权限问题
@CheckPermission(
value = [Manifest.permission.CAMERA],
requestCode = REQUEST_CODE_CAMERA,
describe = permissionDescribe
)
fun openCamera() {
//打开相机
var intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.addCategory("android.intent.category.DEFAULT")
startActivityForResult(intent, 1)
}
有没有觉得很优雅?一行注解就可以实现权限检查、权限申请、权限拒绝、不再询问;开发者只要专注业务即可。
自定义方式
@PermissionDenied(requestCode = REQUEST_CODE_CAMERA)
private fun deny() {
Log.e(TAG, "deny:--- @PermissionDenied ")
Toast.makeText(context, "开发者自己处理【@PermissionDenied】逻辑", Toast.LENGTH_SHORT).show()
}
@PermissionDeniedAndNoLongerAsk(requestCode = REQUEST_CODE_CAMERA)
private fun noLongerAsk() {
Log.e(TAG, "noLongerAsk:--- @PermissionDeniedAndNoLongerAsk ")
Toast.makeText(context, "开发者自己处理【@PermissionDeniedAndNoLongerAsk】逻辑", Toast.LENGTH_SHORT)
.show()
}
如果框架逻辑或者UI不符合你需求,自定义也很简单。可以通过@PermissionDenied
去写拒绝权限的逻辑;通过@PermissionDeniedAndNoLongerAsk
去写拒绝权限且【不再询问】的逻辑。
注意:
- 1、requestCode是区分不同权限请求的唯一标识,如果一个页面内有多处请求权限,请确保requestCode不同。
- 2、你可以在Activity、Fragment、Dialog或者其他View中使用
总结
目前还处于Beta版本,在Android版本适配、国内Rom适配方面必然还存在缺陷,有问题大家可以提issule。如果本文和框架对你有所帮助,点个star就是对我最大的支持。
感谢
如何将自己的项目开源出去
https://www.jianshu.com/p/b41b556ec5dc
https://github.com/permissions-dispatcher/PermissionsDispatcher
https://juejin.im/post/5bdd25386fb9a049b13da206
https://blog.csdn.net/liao277218962/article/details/79352211