作者: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 使用介紹 1. 常規(guī)使用 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使用 如果你想向用戶解釋請(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è)置界面不是您所滿意的,你可以重寫SettingRender
的getCustomSettingIntent
方法提供一個(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)目