安卓權限申請封裝處理框架。測試支持4.0+。項目源於正式處理Android權限問題時,沒找到簡單、能知足被拒絕權限自動會到系統設置處理的框架,按本身的編程習慣造一個熟悉的輪子仍是蠻好的。第一次使用Android Studio,仍是Eclipse敲代碼爽。來自一個(獨愛HTML+CSS來構建用戶界面的)Android很早入門的新手。java
項目用到了
XXPermissions
中的權限列表、國產手機權限設置頁面跳轉列表,借鑑了其中的權限結果onRequestPermissionsResult
的接收方式。git
Github:github.com/xiangyuecn/…github
可直接編譯test_app
項目進行測試,或者下載.assets/test_app-debug-xxx.apk
測試安裝包。編程
直接複製lib_comm/src/main/java/ecomm/lib_comm/permission
裏面的文件到你的程序裏面便可使用。數組
//假設須要獲取攝像頭、錄音權限,直接在調用的地方實現抽象類,調用邏輯能簡單直觀很多
new UsesPermission(MainActivity.this, Permission.CAMERA, Permission.RECORD_AUDIO){
@Override
protected void onTrue(@NonNull ArrayList<String> lowerPermissions) {
//獲取了所有權限執後行此函數,
}
@Override
protected void onFalse(@NonNull ArrayList<String> rejectFinalPermissions, @NonNull ArrayList<String> rejectPermissions, @NonNull ArrayList<String> invalidPermissions) {
//未所有受權時執行此函數
}
//要麼實現上面兩個方法便可,onTrue或onFalse只會有一個會被調用一次
//要麼僅僅實現下面這個方法,無論受權了幾個權限都會調用一次
@Override
protected void onComplete(@NonNull ArrayList<String> resolvePermissions, @NonNull ArrayList<String> lowerPermissions, @NonNull ArrayList<String> rejectFinalPermissions, @NonNull ArrayList<String> rejectPermissions, @NonNull ArrayList<String> invalidPermissions) {
//完成回調,可能所有已受權、所有未受權、或者部分已受權
//經過resolvePermissions.contains(Permission.XXX)來判斷權限是否已受權
}
};
複製代碼
可參考重寫onTips
方法修改此行爲,作到不彈提示或者屢次彈提示受權。bash
import ecomm.lib_comm.permission.Permission;
app
這個類對外只有一個構造函數,直接new
直接調起受權請求。使用過程當中只需重寫這個類的相應函數來控制受權請求行爲。無多餘、也不提供對外控制的方法。框架
調用構造函數當即會調起受權請求,對permissions
列表中的權限進行申請。ide
請求過程當中會根據onTips
返回的結果來控制提示信息、和受權請求流程,defaultTips
是onTips
默認實現使用到的提示信息默認值,默認爲""字符串;具體邏輯參考onTips
。函數
這些函數都是能夠選擇重寫,默認提供了空實現,不實現也不要緊。
權限已所有受權時的回調,無論什麼狀況,onTrue
和onFalse
確定有一個會回調。注意:方法內跟API版本有關的方法調用,應自行判斷API版本,由於低版本API中高版本權限請求所有會放行。
lowerPermissions
:若是是在低版本API上處理不支持的高版本新權限時,會忽略此項權限的檢測的檢測,默許放行,此時本參數將帶上此權限。
未受權時回調,無論什麼狀況,True和False確定有一個會回調
rejectFinalPermissions
:被永久拒絕的權限列表,爲rejectPermissions
的子集,空數組表明沒有此項。
rejectPermissions
:被拒絕的權限列表,空數組表明沒有此項。
invalidPermissions
:未在manifest
裏聲明的權限列表,不會出如今rejectFinalPermissions
中,空數組表明沒有此項。
受權完成時回調,會在onTrue
和onFalse
之一回調後調用。
resolvePermissions
:已受權的權限列表。
lowerPermissions
:參考onTrue
,爲resolvePermissions
的子集。
剩餘參數參考onFalse
。
這些函數都是用來控制受權行爲,都提供了默認實現。
整個類裏面最核心,邏輯最複雜的一個方法(雖然默認實現只有3行代碼)。此方法控制着整個權限請求的流程,彈不彈提示,嘗不嘗試從新申請,都是它說了算。
受權請求發起前會回調此方法,用來生成設置提示信息,也是來決定是否提示和進行受權。若是返回null,表明不進行下下一步操做;返回字符串會進行提示而後進行請求受權。注意:這個方法,會有不一樣權限進行屢次調用;若是用戶選點擊了取消默認這些權限不會再調起請求(可重寫onCancelTips
修改此行爲)。
默認行爲爲:
viewTipsCount=0
viewTipsCount=1+
@param viewTipsCount 0-n 是第幾回準備彈提示框。
0:申請前的引導提示,返回null表明不彈提示,直接調起受權。
注意:第0次包含全部權限(不含帶自定義受權請求的權限),沒法區分是否是永久拒絕的權限。
1+:被永久拒絕的權限申請,或普通權限上一輪被拒。
注意:爲1的時候,若是權限帶自定義的受權請求方式,就算返回了null,也會進行提示並調用受權請求。
@param permissions 被拒絕的權限列表
@param isFinal 這個權限列表是否是永久被拒絕的權限,true是,false爲未永久拒絕
@return 返回提示信息;返回值爲null不進行申請;爲空字符串時自動生成合理的提示。
字符串內容支持特定佔位符:
{Auto}:用自動生成提示內容替換
{Names}:自動替換被拒絕的權限名稱
如:'xx"{Names}"xx' => 'xx"權限名1,權限名2,權限名3"xx'
複製代碼
不建議重寫,取消了也彈提示真不友好,彈出了提示時,用戶點擊了取消時的額外提示信息。返回null完全再也不調起提示,默認就是返回null。這個回調的用法和onTips
如出一轍,只是這個僅僅做用在點擊了取消時。注意:重寫這個方法應該慎重,最多viewCancelCount
幾回後就返回null
,避免出現沒法取消永遠彈框的問題。
viewCancelCount
1-n
當前此次請求是第幾回取消。
受權提示彈框,重寫此方法自定義彈框行爲,默認使用系統AlertDialog
彈框。只要求必須回調okCall
,cancelCall
中的任何一個,怎麼顯示界面、顯示多少個界面 -> 隨意。
import ecomm.lib_comm.permission.Permission;
這個類封裝了8.0版本的危險權限列表,而且提供了對應的權限名稱映射。
使用過程當中推薦使用這個類裏面定義的權限,好比Permission.CAMERA
。若是用Manifest.permission.CAMERA
也能夠,他們是等價的。
查詢權限對應的名稱,好比Permission.CAMERA
對應的名稱爲相機
。
獲取權限名稱列表,如權限名1,權限名2,權限名3
,此方法用於方便的生成受權提示信息。
不重寫onTips
即爲默認實現。
請求受權時直接彈出請求,用戶若是點了拒絕(非永久),後續還會彈一次提示,防止誤點。若是有被永久拒絕的權限,會彈提示,轉到系統設置。
在調起受權前先彈提示,其餘行爲和默認實現同樣。重寫onTips
方法:
@Override
protected String onTips(int viewTipsCount, @NonNull ArrayList<String> permissions, boolean isFinal) {
if(viewTipsCount<=1) {
return "";
}
return null;
}
複製代碼
若是不受權功能是無法使用的場景,能夠一直彈提示,直到用戶點擊了取消爲止(可重寫onCancelTips
讓沒法取消,但不建議)。重寫onTips
方法:
protected String onTips(int viewTipsCount, @NonNull ArrayList<String> permissions, boolean isFinal) {
if(viewTipsCount>0) {//若是須要受權調起前先提醒,直接把這個if去掉就好了
return "";
}
return null;
}
複製代碼
若是權限被拒絕,不彈任何提示,也不跳轉權限系統設置界面。僅僅用來調起受權請求。但對於須要引導才能進行權限設置的除外(如安裝、懸浮窗權限)。重寫onTips
方法:
protected String onTips(int viewTipsCount, @NonNull ArrayList<String> permissions, boolean isFinal) {
return null;
}
複製代碼
默認實如今彈提示的時候使用的是系統AlertDialog
彈框,可重寫onTipsDialogView
方法來使用本身的提示界面。好比HiPermission
的這種蠻美觀友好的界面:
這個庫不提供界面實現,須要自行實現。
參考test_app
目錄中的MainActivity
,裏面有已實現的代碼。
相關源碼請前往Github查閱,若是這個庫有幫助到您,請 Star 一下。