一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android 權(quán)限-HaloPermission 詳細(xì)介紹

 codingSmart 2021-10-22

作者:SupLuo
鏈接:https://www.jianshu.com/p/047a0bf24d42
聲明:本文是 SupLuo 原創(chuàng)投稿,轉(zhuǎn)發(fā)等請(qǐng)聯(lián)系原作者授權(quán)。

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

Kotlin語言開發(fā)的Android權(quán)限庫,具有更高的擴(kuò)展性和兼容性。

寫在前面的

Android 運(yùn)行時(shí)權(quán)限,想必對(duì)Android開發(fā)者來說并不陌生,Github上也有不少相應(yīng)的庫也足夠應(yīng)付現(xiàn)在的使用了,但是HaloPermission不是在無聊的造輪子,它的職責(zé)是讓自己提供的支持更完美,更能夠擁抱變化。
其實(shí)Halo是一個(gè)系列,里面的每一個(gè)庫我都會(huì)用心,盡自己所能的去寫好,我也希望大家能給予更多的支持,共同建設(shè),讓Android開發(fā)閃射自己的Halo.
在開發(fā)HaloPermission之前,我閱讀了很多文章,也看過很多庫的源碼,所以感謝這些偉大的無私奉獻(xiàn)者和開源庫作者,其中包括RxPermission,HiPermission,EasyPermission,AndPermission等。

為什么是HaloPermission

  • 作者的出發(fā)點(diǎn)(一個(gè)對(duì)事情要求完美的處女座特點(diǎn))

  • 基于Kotlin(雙刃劍,仁者見仁,智者見智)

  • 更多的擴(kuò)展性(后面會(huì)寫文章專門介紹HoloPermission的設(shè)計(jì))

  • 更多的兼容性(盡量兼容);

  • 更靈活的功能配置

使用介紹

1. 常規(guī)使用

  • 請(qǐng)求一個(gè)權(quán)限,然后接收結(jié)果回調(diào)

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()
  • 請(qǐng)求多個(gè)權(quán)限

HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE)
           .{省略代碼}

       //or

       val permissions:Array<String> = arrayOf("","")
       HoloPermission.with(this,*permissions)
           .{省略代碼}
  • 只關(guān)心權(quán)限被允許(未被允許)的回調(diào)

HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
           .setGrandAction(object:GrandAction{
               override fun onPermissionGrand(permissions: List<String>) {
                   {your code for grand}
               }

           }).run()

2. RationaleRender使用

如果你想向用戶解釋請(qǐng)求權(quán)限的原因,你可以使用setRationaleRender方法

HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
                   .{省略回調(diào)設(shè)置代碼}
                   .setRationaleRender("為了確保功能的正常使用,請(qǐng)?jiān)试S接下來的權(quán)限請(qǐng)求申請(qǐng)。")
                   .run()

如果你想自定義RationaleRender的樣式,比如:

HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
               .{省略回調(diào)設(shè)置代碼}
               .setRationaleRender(object:RationaleRender{
                   override fun show(ctx: Context, permission: List<String>, process: RationaleRender.Process) {
                       //自定義使用了一個(gè)`Toast`展示信息。
                       Toast.makeText(ctx,"為了確保功能的正常使用,請(qǐng)?jiān)试S接下來的權(quán)限請(qǐng)求申請(qǐng)。",Toast.LENGTH_SHORT).show()

                       //**為了確保后續(xù)的流程繼續(xù)執(zhí)行,你需要在適當(dāng)?shù)臅r(shí)候調(diào)用process的`onNext`或`onCancel`方法**
                       process.onNext()

                       //onNext()表示繼續(xù)后面的執(zhí)行
                       //onCancel會(huì)取消流程的執(zhí)行,并且會(huì)最終回調(diào)onPermissionDenied方法
                   }
               })
               .run()

3. SettingRender使用

對(duì)于無法獲取權(quán)限時(shí),如果你想引導(dǎo)用戶打開權(quán)限設(shè)置界面,你可以使用setSettingRender方法

HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
             .{省略回調(diào)設(shè)置代碼}
             .setSettingRender("無法使用外部存儲(chǔ),請(qǐng)?jiān)O(shè)置權(quán)限以便使用。")
             .run()

如果你想自定義SettingRender的樣式,比如:

HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
               .{省略回調(diào)設(shè)置代碼}
               .setSettingRender(object:SettingRender{
                   override fun show(ctx: Context, permission: List<String>, process: SettingRender.Process) {
                       //自定義使用了一個(gè)`Toast`展示信息。
                       Toast.makeText(ctx,"無法使用外部存儲(chǔ),請(qǐng)?jiān)O(shè)置權(quán)限以便使用。",Toast.LENGTH_SHORT).show()

                       //**為了確保后續(xù)的流程繼續(xù)執(zhí)行,你需要在適當(dāng)?shù)臅r(shí)候調(diào)用process的`onNext`或`onCancel`方法**
                       process.onNext()

                       //onNext()表示繼續(xù)后面的執(zhí)行,HaloPermission將打開系統(tǒng)應(yīng)用權(quán)限設(shè)置界面
                       //onCancel會(huì)取消流程的執(zhí)行,不會(huì)打開系統(tǒng)應(yīng)用權(quán)限設(shè)置界面,最終會(huì)回調(diào)onPermissionDenied方法
                   }
               })
               .run()

如果你覺得HaloPermission打開的權(quán)限設(shè)置界面不是您所滿意的,你可以重寫SettingRendergetCustomSettingIntent方法提供一個(gè)Intent,如果返回null則將使用HaloPermission的默認(rèn)方式打開:

HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
               .{省略回調(diào)設(shè)置代碼}
               .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. 自定義權(quán)限校驗(yàn)規(guī)則

兩步即可實(shí)現(xiàn)

   //1. 創(chuàng)建自定義PermissionChecker
  class CustomChecker:PermissionChecker{
       override fun isPermissionGranted(ctx: Context, permission: String): Boolean {
           {使用你的規(guī)則}
       }
   }

   //2. 使用自定義規(guī)則
   HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
      .{省略常規(guī)代碼}
      .run(CustomChecker())

除非你非常有把握,否則不建議使用自定義權(quán)限校驗(yàn)規(guī)則,因?yàn)镠aloPermission會(huì)盡可能的去適配和兼容

5. 自定義請(qǐng)求方式

HaloPermission 默認(rèn)使用 ShadowActivity 的形式請(qǐng)求權(quán)限,當(dāng)然只要你愿意,您可以使用 Fragment 的形式去實(shí)現(xiàn),HaloPermission 本身也提供了
Fragment 的請(qǐng)求方式,但是最終去掉了這部分的實(shí)現(xiàn),因?yàn)閷?duì)于 Fragment 的使用機(jī)制,如果使用不當(dāng),可能會(huì)出現(xiàn)一些奇怪的問題,我想這是你我都不愿看到的。

同樣的,兩步即可實(shí)現(xiàn)自定義請(qǐng)求方式

   //1. 創(chuàng)建自定義PermissionCaller
  class CustomCaller: PermissionCaller{
         override fun requestPermission(ctx: Context, responder: PermissionResponder, vararg permision: String) {
             {可以仿造HaloPermission實(shí)現(xiàn),最終要在適當(dāng)?shù)臅r(shí)候調(diào)用responder讓流程正常進(jìn)行}
         }
  }

   //2. 使用自定義規(guī)則
   HoloPermission.with(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
      .{省略常規(guī)代碼}
      .run(CustomCaller())

實(shí)際運(yùn)行效果截圖

熟話說無圖無真相,由于常規(guī)請(qǐng)求的效果圖比較單調(diào),這里只貼了設(shè)置了RationaleRender和SettingRender的效果截圖:

  • 包含SettingRender的效果

  • 包含RationaleRender的效果

更多請(qǐng)見 Github

https://github.com/SupLuo/HaloPermission

kotlin 相關(guān)

使用 Kotlin 實(shí)現(xiàn)自定義 LayoutManager + ItemTouchHelper 實(shí)現(xiàn)炫酷卡片布局

"DeepNight-in-kotlin"一個(gè)純看妹紙的 Kotlin 開源項(xiàng)目

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    无套内射美女视频免费在线观看| 欧美日韩一级aa大片| 久久99夜色精品噜噜亚洲av| 欧美日韩在线第一页日韩| 开心激情网 激情五月天| 永久福利盒子日韩日韩| 欧美日韩一区二区三区色拉拉| 国产一级内片内射免费看| 大伊香蕉一区二区三区| 亚洲天堂男人在线观看| 丝袜视频日本成人午夜视频 | 亚洲一区二区久久观看| 后入美臀少妇一区二区| 亚洲一区二区三区三区| 日本一区不卡在线观看| 五月婷婷六月丁香亚洲| 日韩欧美一区二区不卡看片| 六月丁香六月综合缴情| 日本人妻免费一区二区三区| 欧美日韩免费黄片观看| 成人午夜激情免费在线| 国产精品福利精品福利| 亚洲男人的天堂久久a| 亚洲精选91福利在线观看| 五月天婷亚洲天婷综合网| 日韩中文字幕有码午夜美女| 人人爽夜夜爽夜夜爽精品视频| 久久国产精品热爱视频| 日韩成人中文字幕在线一区| 黄色激情视频中文字幕| 有坂深雪中文字幕亚洲中文 | 激情内射亚洲一区二区三区 | 亚洲天堂精品在线视频| 久久热这里只有精品视频| 亚洲欧美中文字幕精品| 中文字幕中文字幕在线十八区 | 亚洲中文在线观看小视频| 国产在线一区二区三区不卡 | 国产传媒中文字幕东京热| 伊人天堂午夜精品草草网| 久久成人国产欧美精品一区二区 |