Android权限请求弹窗自定义,安卓权限申请处理框架Android-UsesPermission
安卓權(quán)限申請封裝處理框架。測試支持4.0+。項(xiàng)目源于正式處理Android權(quán)限問題時,沒找到簡單、能滿足被拒絕權(quán)限自動會到系統(tǒng)設(shè)置處理的框架,按自己的編程習(xí)慣造一個熟悉的輪子還是蠻好的。第一次使用Android Studio,還是Eclipse敲代碼爽。來自一個(獨(dú)愛HTML+CSS來構(gòu)建用戶界面的)Android很早入門的新手。
項(xiàng)目用到了XXPermissions中的權(quán)限列表、國產(chǎn)手機(jī)權(quán)限設(shè)置頁面跳轉(zhuǎn)列表,借鑒了其中的權(quán)限結(jié)果onRequestPermissionsResult的接收方式。
特性
一個函數(shù)調(diào)用處理權(quán)限申請的所有問題,被拒絕的權(quán)限重復(fù)詢問,被永久拒絕的權(quán)限(記住選擇、不再詢問)打開App授權(quán)系統(tǒng)設(shè)置。
函數(shù)式調(diào)用,代碼簡潔明晰,閱讀源碼不用跳來跳去。
明確的授權(quán)結(jié)果回調(diào),要么有(True),要么沒有(False)。
默認(rèn)0界面,調(diào)用者無需知道、提供、導(dǎo)入任何界面包括文件,但可深度定制。
中性,默認(rèn)非弓雖J式、有回旋余地的對待拒絕權(quán)限的場景。
理論上支持任何Android版本(但僅在 4.0 - 9.0 模擬器上進(jìn)行了測試)。
演示
可直接編譯test_app項(xiàng)目進(jìn)行測試,或者下載.assets/test_app-debug-xxx.apk測試安裝包。
快速使用
直接復(fù)制lib_comm/src/main/java/ecomm/lib_comm/permission里面的文件到你的程序里面即可使用。
示例代碼
//假設(shè)需要獲取攝像頭、錄音權(quán)限,直接在調(diào)用的地方實(shí)現(xiàn)抽象類,調(diào)用邏輯能簡單直觀不少
new UsesPermission(MainActivity.this, Permission.CAMERA, Permission.RECORD_AUDIO){
@Override
protected void onTrue(@NonNull ArrayList lowerPermissions) {
//獲取了全部權(quán)限執(zhí)后行此函數(shù),
}
@Override
protected void onFalse(@NonNull ArrayList rejectFinalPermissions, @NonNull ArrayList rejectPermissions, @NonNull ArrayList invalidPermissions) {
//未全部授權(quán)時執(zhí)行此函數(shù)
}
//要么實(shí)現(xiàn)上面兩個方法即可,onTrue或onFalse只會有一個會被調(diào)用一次
//要么僅僅實(shí)現(xiàn)下面這個方法,不管授權(quán)了幾個權(quán)限都會調(diào)用一次
@Override
protected void onComplete(@NonNull ArrayList resolvePermissions, @NonNull ArrayList lowerPermissions, @NonNull ArrayList rejectFinalPermissions, @NonNull ArrayList rejectPermissions, @NonNull ArrayList invalidPermissions) {
//完成回調(diào),可能全部已授權(quán)、全部未授權(quán)、或者部分已授權(quán)
//通過resolvePermissions.contains(Permission.XXX)來判斷權(quán)限是否已授權(quán)
}
};
默認(rèn)行為邏輯
先直接發(fā)起權(quán)限申請
普通權(quán)限(沒永久拒絕的權(quán)限)如果被拒絕(非永久拒絕),后續(xù)會安排再彈框申請一次(防用戶誤選)。
如果授權(quán)結(jié)果有被永久拒絕的,這部分權(quán)限會和第二步權(quán)限申請一起彈框跳轉(zhuǎn)到App授權(quán)系統(tǒng)設(shè)置。
彈一次框處理被永久拒絕的權(quán)限(彈一次夠了),跳轉(zhuǎn)到App授權(quán)系統(tǒng)設(shè)置界面。
可參考重寫onTips方法修改此行為,做到不彈提示或者多次彈提示授權(quán)。
UsesPermission類文檔
import ecomm.lib_comm.permission.Permission;
這個類對外只有一個構(gòu)造函數(shù),直接new直接調(diào)起授權(quán)請求。使用過程中只需重寫這個類的相應(yīng)函數(shù)來控制授權(quán)請求行為。無多余、也不提供對外控制的方法。
構(gòu)造函數(shù)
UsesPermission(activity,permissions,defaultTips="")
調(diào)用構(gòu)造函數(shù)立即會調(diào)起授權(quán)請求,對permissions列表中的權(quán)限進(jìn)行申請。
請求過程中會根據(jù)onTips返回的結(jié)果來控制提示信息、和授權(quán)請求流程,defaultTips是onTips默認(rèn)實(shí)現(xiàn)使用到的提示信息默認(rèn)值,默認(rèn)為""字符串;具體邏輯參考o(jì)nTips。
回調(diào)類可重寫函數(shù)
這些函數(shù)都是可以選擇重寫,默認(rèn)提供了空實(shí)現(xiàn),不實(shí)現(xiàn)也沒關(guān)系。
void onTrue(lowerPermissions)
權(quán)限已全部授權(quán)時的回調(diào),不管什么情況,onTrue和onFalse肯定有一個會回調(diào)。注意:方法內(nèi)跟API版本有關(guān)的方法調(diào)用,應(yīng)自行判斷API版本,因?yàn)榈桶姹続PI中高版本權(quán)限請求全部會放行。
lowerPermissions:如果是在低版本API上處理不支持的高版本新權(quán)限時,會忽略此項(xiàng)權(quán)限的檢測的檢測,默許放行,此時本參數(shù)將帶上此權(quán)限。
void onFalse(rejectFinalPermissions,rejectPermissions,invalidPermissions)
未授權(quán)時回調(diào),不管什么情況,True和False肯定有一個會回調(diào)
rejectFinalPermissions:被永久拒絕的權(quán)限列表,為rejectPermissions的子集,空數(shù)組代表沒有此項(xiàng)。
rejectPermissions:被拒絕的權(quán)限列表,空數(shù)組代表沒有此項(xiàng)。
invalidPermissions:未在manifest里聲明的權(quán)限列表,不會出現(xiàn)在rejectFinalPermissions中,空數(shù)組代表沒有此項(xiàng)。
void onComplete(resolvePermissions,lowerPermissions,rejectFinalPermissions,rejectPermissions,invalidPermissions)
授權(quán)完成時回調(diào),會在onTrue和onFalse之一回調(diào)后調(diào)用。
resolvePermissions:已授權(quán)的權(quán)限列表。
lowerPermissions:參考o(jì)nTrue,為resolvePermissions的子集。
剩余參數(shù)參考o(jì)nFalse。
控制類可重寫函數(shù)
這些函數(shù)都是用來控制授權(quán)行為,都提供了默認(rèn)實(shí)現(xiàn)。
String onTips(viewTipsCount,permissions,isFinal)
整個類里面最核心,邏輯最復(fù)雜的一個方法(雖然默認(rèn)實(shí)現(xiàn)只有3行代碼)。此方法控制著整個權(quán)限請求的流程,彈不彈提示,嘗不嘗試重新申請,都是它說了算。
授權(quán)請求發(fā)起前會回調(diào)此方法,用來生成設(shè)置提示信息,也是來決定是否提示和進(jìn)行授權(quán)。如果返回null,代表不進(jìn)行下下一步操作;返回字符串會進(jìn)行提示然后進(jìn)行請求授權(quán)。注意:這個方法,會有不同權(quán)限進(jìn)行多次調(diào)用;如果用戶選點(diǎn)擊了取消默認(rèn)這些權(quán)限不會再調(diào)起請求(可重寫onCancelTips修改此行為)。
默認(rèn)行為為:
先直接發(fā)起權(quán)限申請 viewTipsCount=0
普通權(quán)限(非永久拒絕)如果被拒絕(非永久拒絕),后續(xù)會安排再彈框申請一次(防誤選)。
如果結(jié)果有被永久拒絕,這部分權(quán)限會和后面的永久權(quán)限申請一起彈框處理。
彈一次框處理被永久拒絕的權(quán)限(彈一次夠了),跳轉(zhuǎn)到App授權(quán)系統(tǒng)設(shè)置界面 viewTipsCount=1+
@param viewTipsCount 0-n 是第幾次準(zhǔn)備彈提示框。
0:申請前的引導(dǎo)提示,返回null代表不彈提示,直接調(diào)起授權(quán)。
注意:第0次包含所有權(quán)限(不含帶自定義授權(quán)請求的權(quán)限),無法區(qū)分是不是永久拒絕的權(quán)限。
1+:被永久拒絕的權(quán)限申請,或普通權(quán)限上一輪被拒。
注意:為1的時候,如果權(quán)限帶自定義的授權(quán)請求方式,就算返回了null,也會進(jìn)行提示并調(diào)用授權(quán)請求。
@param permissions 被拒絕的權(quán)限列表
@param isFinal 這個權(quán)限列表是不是永久被拒絕的權(quán)限,true是,false為未永久拒絕
@return 返回提示信息;返回值為null不進(jìn)行申請;為空字符串時自動生成合理的提示。
字符串內(nèi)容支持特定占位符:
{Auto}:用自動生成提示內(nèi)容替換
{Names}:自動替換被拒絕的權(quán)限名稱
如:'xx"{Names}"xx' => 'xx"權(quán)限名1,權(quán)限名2,權(quán)限名3"xx'
String onCancelTips(viewCancelCount,permissions,isFinal)
不建議重寫,取消了也彈提示真不友好,彈出了提示時,用戶點(diǎn)擊了取消時的額外提示信息。返回null徹底不再調(diào)起提示,默認(rèn)就是返回null。這個回調(diào)的用法和onTips一模一樣,只是這個僅僅作用在點(diǎn)擊了取消時。注意:重寫這個方法應(yīng)該慎重,最多viewCancelCount幾次后就返回null,避免出現(xiàn)無法取消永遠(yuǎn)彈框的問題。
viewCancelCount 1-n 當(dāng)前這次請求是第幾次取消。
String onTipsDialogView(tips,isCancel,viewTipsCount,permissions,isFinal,okCall,cancelCall)
授權(quán)提示彈框,重寫此方法自定義彈框行為,默認(rèn)使用系統(tǒng)AlertDialog彈框。只要求必須回調(diào)okCall,cancelCall中的任何一個,怎么顯示界面、顯示多少個界面 -> 隨意。
Permission類文檔
import ecomm.lib_comm.permission.Permission;
這個類封裝了8.0版本的危險(xiǎn)權(quán)限列表,并且提供了對應(yīng)的權(quán)限名稱映射。
權(quán)限列表
使用過程中推薦使用這個類里面定義的權(quán)限,比如Permission.CAMERA。如果用Manifest.permission.CAMERA也可以,他們是等價(jià)的。
靜態(tài)方法
String QueryName(permission)
查詢權(quán)限對應(yīng)的名稱,比如Permission.CAMERA對應(yīng)的名稱為相機(jī)。
String QueryNames(permissions)
獲取權(quán)限名稱列表,如權(quán)限名1,權(quán)限名2,權(quán)限名3,此方法用于方便的生成授權(quán)提示信息。
最佳實(shí)踐
使用默認(rèn)實(shí)現(xiàn)
不重寫onTips即為默認(rèn)實(shí)現(xiàn)。
請求授權(quán)時直接彈出請求,用戶如果點(diǎn)了拒絕(非永久),后續(xù)還會彈一次提示,防止誤點(diǎn)。如果有被永久拒絕的權(quán)限,會彈提示,轉(zhuǎn)到系統(tǒng)設(shè)置。
授權(quán)前先提示
在調(diào)起授權(quán)前先彈提示,其他行為和默認(rèn)實(shí)現(xiàn)一樣。重寫onTips方法:
@Override
protected String onTips(int viewTipsCount, @NonNull ArrayList permissions, boolean isFinal) {
if(viewTipsCount<=1) {
return "";
}
return null;
}
不授權(quán)永遠(yuǎn)彈提示
如果不授權(quán)功能是沒法使用的場景,可以一直彈提示,直到用戶點(diǎn)擊了取消為止(可重寫onCancelTips讓無法取消,但不建議)。重寫onTips方法:
protected String onTips(int viewTipsCount, @NonNull ArrayList permissions, boolean isFinal) {
if(viewTipsCount>0) {//如果需要授權(quán)調(diào)起前先提醒,直接把這個if去掉就行了
return "";
}
return null;
}
靜默方式授權(quán)
如果權(quán)限被拒絕,不彈任何提示,也不跳轉(zhuǎn)權(quán)限系統(tǒng)設(shè)置界面。僅僅用來調(diào)起授權(quán)請求。但對于需要引導(dǎo)才能進(jìn)行權(quán)限設(shè)置的除外(如安裝、懸浮窗權(quán)限)。重寫onTips方法:
protected String onTips(int viewTipsCount, @NonNull ArrayList permissions, boolean isFinal) {
return null;
}
自定義提示界面
默認(rèn)實(shí)現(xiàn)在彈提示的時候使用的是系統(tǒng)AlertDialog彈框,可重寫onTipsDialogView方法來使用自己的提示界面。比如HiPermission的這種蠻美觀友好的界面:
這個庫不提供界面實(shí)現(xiàn),需要自行實(shí)現(xiàn)。
更多實(shí)現(xiàn)
參考test_app目錄中的MainActivity,里面有已實(shí)現(xiàn)的代碼。
相關(guān)源碼請前往Github查閱,如果這個庫有幫助到您,請 Star 一下。
總結(jié)
以上是生活随笔為你收集整理的Android权限请求弹窗自定义,安卓权限申请处理框架Android-UsesPermission的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 计算母亲节日期,致母亲节:
- 下一篇: Unity动画 代码加载动画,可复用