安卓權限申請處理框架Android-UsesPermission

安卓權限申請封裝處理框架。測試支持4.0+。項目源於正式處理Android權限問題時,沒找到簡單、能知足被拒絕權限自動會到系統設置處理的框架,按本身的編程習慣造一個熟悉的輪子仍是蠻好的。第一次使用Android Studio,仍是Eclipse敲代碼爽。來自一個(獨愛HTML+CSS來構建用戶界面的)Android很早入門的新手。java

項目用到了XXPermissions中的權限列表、國產手機權限設置頁面跳轉列表,借鑑了其中的權限結果onRequestPermissionsResult的接收方式。git

Github:github.com/xiangyuecn/…github

特性

  1. 一個函數調用處理權限申請的全部問題,被拒絕的權限重複詢問,被永久拒絕的權限(記住選擇、再也不詢問)打開App受權系統設置。
  2. 函數式調用,代碼簡潔明晰,閱讀源碼不用跳來跳去。
  3. 明確的受權結果回調,要麼有(True),要麼沒有(False)。
  4. 默認0界面,調用者無需知道、提供、導入任何界面包括文件,但可深度定製。
  5. 中性,默認非弓雖J式、有迴旋餘地的對待拒絕權限的場景。
  6. 理論上支持任何Android版本(但僅在 4.0 - 9.0 模擬器上進行了測試)。

演示

可直接編譯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)來判斷權限是否已受權
    }
};
複製代碼

默認行爲邏輯

  1. 先直接發起權限申請
    • 普通權限(沒永久拒絕的權限)若是被拒絕(非永久拒絕),後續會安排再彈框申請一次(防用戶誤選)。
    • 若是受權結果有被永久拒絕的,這部分權限會和第二步權限申請一塊兒彈框跳轉到App受權系統設置。
  2. 彈一次框處理被永久拒絕的權限(彈一次夠了),跳轉到App受權系統設置界面。

可參考重寫onTips方法修改此行爲,作到不彈提示或者屢次彈提示受權。bash

UsesPermission類文檔

import ecomm.lib_comm.permission.Permission;app

這個類對外只有一個構造函數,直接new直接調起受權請求。使用過程當中只需重寫這個類的相應函數來控制受權請求行爲。無多餘、也不提供對外控制的方法。框架

構造函數

UsesPermission(activity,permissions,defaultTips="")

調用構造函數當即會調起受權請求,對permissions列表中的權限進行申請。ide

請求過程當中會根據onTips返回的結果來控制提示信息、和受權請求流程,defaultTipsonTips默認實現使用到的提示信息默認值,默認爲""字符串;具體邏輯參考onTips函數

回調類可重寫函數

這些函數都是能夠選擇重寫,默認提供了空實現,不實現也不要緊。

void onTrue(lowerPermissions)

權限已所有受權時的回調,無論什麼狀況,onTrueonFalse確定有一個會回調。注意:方法內跟API版本有關的方法調用,應自行判斷API版本,由於低版本API中高版本權限請求所有會放行。

lowerPermissions:若是是在低版本API上處理不支持的高版本新權限時,會忽略此項權限的檢測的檢測,默許放行,此時本參數將帶上此權限。

void onFalse(rejectFinalPermissions,rejectPermissions,invalidPermissions)

未受權時回調,無論什麼狀況,True和False確定有一個會回調

rejectFinalPermissions:被永久拒絕的權限列表,爲rejectPermissions的子集,空數組表明沒有此項。

rejectPermissions:被拒絕的權限列表,空數組表明沒有此項。

invalidPermissions:未在manifest裏聲明的權限列表,不會出如今rejectFinalPermissions中,空數組表明沒有此項。

void onComplete(resolvePermissions,lowerPermissions,rejectFinalPermissions,rejectPermissions,invalidPermissions)

受權完成時回調,會在onTrueonFalse之一回調後調用。

resolvePermissions:已受權的權限列表。

lowerPermissions:參考onTrue,爲resolvePermissions的子集。

剩餘參數參考onFalse

控制類可重寫函數

這些函數都是用來控制受權行爲,都提供了默認實現。

String onTips(viewTipsCount,permissions,isFinal)

整個類裏面最核心,邏輯最複雜的一個方法(雖然默認實現只有3行代碼)。此方法控制着整個權限請求的流程,彈不彈提示,嘗不嘗試從新申請,都是它說了算。

受權請求發起前會回調此方法,用來生成設置提示信息,也是來決定是否提示和進行受權。若是返回null,表明不進行下下一步操做;返回字符串會進行提示而後進行請求受權。注意:這個方法,會有不一樣權限進行屢次調用;若是用戶選點擊了取消默認這些權限不會再調起請求(可重寫onCancelTips修改此行爲)。

默認行爲爲:

  1. 先直接發起權限申請 viewTipsCount=0
    • 普通權限(非永久拒絕)若是被拒絕(非永久拒絕),後續會安排再彈框申請一次(防誤選)。
    • 若是結果有被永久拒絕,這部分權限會和後面的永久權限申請一塊兒彈框處理。
  2. 彈一次框處理被永久拒絕的權限(彈一次夠了),跳轉到App受權系統設置界面 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'
複製代碼

String onCancelTips(viewCancelCount,permissions,isFinal)

不建議重寫,取消了也彈提示真不友好,彈出了提示時,用戶點擊了取消時的額外提示信息。返回null完全再也不調起提示,默認就是返回null。這個回調的用法和onTips如出一轍,只是這個僅僅做用在點擊了取消時。注意:重寫這個方法應該慎重,最多viewCancelCount幾回後就返回null,避免出現沒法取消永遠彈框的問題。

viewCancelCount 1-n 當前此次請求是第幾回取消。

String onTipsDialogView(tips,isCancel,viewTipsCount,permissions,isFinal,okCall,cancelCall)

受權提示彈框,重寫此方法自定義彈框行爲,默認使用系統AlertDialog彈框。只要求必須回調okCallcancelCall中的任何一個,怎麼顯示界面、顯示多少個界面 -> 隨意。

Permission類文檔

import ecomm.lib_comm.permission.Permission;

這個類封裝了8.0版本的危險權限列表,而且提供了對應的權限名稱映射。

權限列表

使用過程當中推薦使用這個類裏面定義的權限,好比Permission.CAMERA。若是用Manifest.permission.CAMERA也能夠,他們是等價的。

靜態方法

String QueryName(permission)

查詢權限對應的名稱,好比Permission.CAMERA對應的名稱爲相機

String QueryNames(permissions)

獲取權限名稱列表,如權限名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 一下。

相關文章
相關標籤/搜索