Android进阶之路Android开发经验谈Android技术知识

一款全新的权限库SimplePermission

2020-04-20  本文已影响0人  唠嗑008

市面上权限库很多了,为什么还要推荐这么一款新的呢?先来看一下市面上主流的权限库。

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

优势

框架内部权限执行流程

权限申请流程.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去写拒绝权限且【不再询问】的逻辑。

注意:

总结

目前还处于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

上一篇下一篇

猜你喜欢

热点阅读