Android权限-HaloPermission详细介绍

An Android permission library developed by Kotlin language with higher extensibility and compatibility.

Kotlin语言开发的Android权限库,具有更高的扩展性和兼容性。

写在前面的

Android运行时权限,想必对Android开发者来说并不陌生,Github上也有不少相应的库也足够应付现在的使用了,但是HaloPermission不是在无聊的造轮子,它的职责是让自己提供的支持更完美,更能够拥抱变化。
其实Halo是一个系列,里面的每一个库我都会用心,尽自己所能的去写好,我也希望大家能给予更多的支持,共同建设,让Android开发闪射自己的Halo.
在开发HaloPermission之前,我阅读了很多文章,也看过很多库的源码,所以感谢这些伟大的无私奉献者和开源库作者,其中包括RxPermission,HiPermission,EasyPermission,AndPermission等。

为什么是HaloPermission
  • 作者的出发点(一个对事情要求完美的处女座特点)
  • 基于Kotlin(双刃剑,仁者见仁,智者见智)
  • 更多的扩展性(后面会写文章专门介绍HoloPermission的设计)
  • 更多的兼容性(尽量兼容);
  • 更灵活的功能配置
使用介绍
1. 常规使用
  • 请求一个权限,然后接收结果回调
      HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .setListener(object: PermissionListener{
                override fun onPermissionDenied(permissions: List<String>) {
                    {your code for deny}
                }
                override fun onPermissionGrand(permissions: List<String>) {
                    {your code for grand}
                }
            }).run()
  • 请求多个权限
        HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE)
            .{省略代码}

        //or

        val permissions:Array<String> = arrayOf("","")
        HoloPermission.with(this,*permissions)
            .{省略代码}
  • 只关心权限被允许(未被允许)的回调
        HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .setGrandAction(object:GrandAction{
                override fun onPermissionGrand(permissions: List<String>) {
                    {your code for grand}
                }

            }).run()
2. RationaleRender使用

如果你想向用户解释请求权限的原因,你可以使用setRationaleRender方法

    HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    .{省略回调设置代码}
                    .setRationaleRender("为了确保功能的正常使用,请允许接下来的权限请求申请。")
                    .run()

如果你想自定义RationaleRender的样式,比如:

   HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .{省略回调设置代码}
                .setRationaleRender(object:RationaleRender{
                    override fun show(ctx: Context, permission: List<String>, process: RationaleRender.Process) {
                        //自定义使用了一个`Toast`展示信息。
                        Toast.makeText(ctx,"为了确保功能的正常使用,请允许接下来的权限请求申请。",Toast.LENGTH_SHORT).show()

                        //**为了确保后续的流程继续执行,你需要在适当的时候调用process的`onNext`或`onCancel`方法**
                        process.onNext()

                        //onNext()表示继续后面的执行
                        //onCancel会取消流程的执行,并且会最终回调onPermissionDenied方法
                    }
                })
                .run()
3. SettingRender使用

对于无法获取权限时,如果你想引导用户打开权限设置界面,你可以使用setSettingRender方法

    HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
              .{省略回调设置代码}
              .setSettingRender("无法使用外部存储,请设置权限以便使用。")
              .run()

如果你想自定义SettingRender的样式,比如:

   HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .{省略回调设置代码}
                .setSettingRender(object:SettingRender{
                    override fun show(ctx: Context, permission: List<String>, process: SettingRender.Process) {
                        //自定义使用了一个`Toast`展示信息。
                        Toast.makeText(ctx,"无法使用外部存储,请设置权限以便使用。",Toast.LENGTH_SHORT).show()

                        //**为了确保后续的流程继续执行,你需要在适当的时候调用process的`onNext`或`onCancel`方法**
                        process.onNext()

                        //onNext()表示继续后面的执行,HaloPermission将打开系统应用权限设置界面
                        //onCancel会取消流程的执行,不会打开系统应用权限设置界面,最终会回调onPermissionDenied方法
                    }
                })
                .run()

如果你觉得HaloPermission打开的权限设置界面不是您所满意的,你可以重写SettingRendergetCustomSettingIntent方法提供一个Intent,如果返回null则将使用HaloPermission的默认方式打开:

    HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .{省略回调设置代码}
                .setSettingRender(object:SettingRender{
                    override fun show(ctx: Context, permission: List<String>, process: SettingRender.Process) {
                       {省略的代码}
                    }

                    //自定义SettingIntent
                    override fun getCustomSettingIntent(ctx: Context): Intent? {
                                            return super.getCustomSettingIntent(ctx)
                    }
                })
                .run()
4. 自定义权限校验规则

两步即可实现

    //1. 创建自定义PermissionChecker
   class CustomChecker:PermissionChecker{
        override fun isPermissionGranted(ctx: Context, permission: String): Boolean {
            {使用你的规则}
        }
    }

    //2. 使用自定义规则
    HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
       .{省略常规代码}
       .run(CustomChecker())

除非你非常有把握,否则不建议使用自定义权限校验规则,因为HaloPermission会尽可能的去适配和兼容

5. 自定义请求方式

HaloPermission默认使用ShadowActivity的形式请求权限,当然只要你愿意,您可以使用Fragment的形式去实现,HaloPermission本身也提供了
Fragment的请求方式,但是最终去掉了这部分的实现,因为对于Fragment的使用机制,如果使用不当,可能会出现一些奇怪的问题,我想这是你我都不愿看到的。

同样的,两步即可实现自定义请求方式

    //1. 创建自定义PermissionCaller
   class CustomCaller: PermissionCaller{
          override fun requestPermission(ctx: Context, responder: PermissionResponder, vararg permision: String) {
              {可以仿造HaloPermission实现,最终要在适当的时候调用responder让流程正常进行}
          }
   }

    //2. 使用自定义规则
    HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
       .{省略常规代码}
       .run(CustomCaller())

实际运行效果截图

熟话说无图无真相,由于常规请求的效果图比较单调,这里只贴了设置了RationaleRender和SettingRender的效果截图:

  • 包含SettingRender的效果

  • 包含RationaleRender的效果

更多请见 Github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容