Android 權(quán)限申請框架封裝

安卓權(quán)限介紹屬于基礎(chǔ)知識,這兒就不做介紹,需要了解的小伙伴,自行百度。

說明:本篇文章需要有反射和注解方面的基礎(chǔ)知識

話不多說直接進(jìn)入主題。權(quán)限動態(tài)申請框架的主要思路:反射+注解

主要分為三部分:
一、判斷當(dāng)前設(shè)備版本
二、動態(tài)申請權(quán)限
三、給待執(zhí)行的方法添加注解
四、反射執(zhí)行方法
說明:每一部分直接講操作步驟附加相關(guān)代碼

1.判斷當(dāng)前設(shè)備版本

這部分大家應(yīng)該都知道如何實現(xiàn),判斷當(dāng)前設(shè)備版本,主要是判斷當(dāng)前版本是否是棉花糖版本即是否是Android 6.0及以上,因為Android 6.0及以上的版本請求權(quán)限時,需要動態(tài)申請,否則會出現(xiàn)錯誤。

代碼如下:

 //1判斷當(dāng)前安卓版本是否是Android 6.0及以上的版本
        if (!PermissionUtils.isOverMarshmallow()) {
            //1.1 不是則直接執(zhí)行待執(zhí)行方法
            PermissionUtils.executeSucceedMethod(mObject, mRequestCode);
        } 

2、動態(tài)申請權(quán)限
如果設(shè)備是Android 6.0及以上的版本時,動態(tài)申請權(quán)限
代碼如下:

    List<String> deniedPermissions =  PermissionUtils.getDeniedPermissions(mObject, mRequestPermission);
            if (deniedPermissions.isEmpty()) {
                //1.2.1 拒絕權(quán)限集合為空,權(quán)限申請成功,執(zhí)行方法
                PermissionUtils.executeSucceedMethod(mObject, mRequestCode);
            } else {
                //1.2.2 權(quán)限未申請,則申請權(quán)限       ActivityCompat.requestPermissions(PermissionUtils.getActivity(mObject),
                deniedPermissions.toArray(new String[]{}), mRequestCode);
            }
        }

3、給待執(zhí)行的方法添加注解
通過給需要執(zhí)行的方法添加一個標(biāo)記,當(dāng)權(quán)限申請通過后,便可執(zhí)行到指定標(biāo)記的方法
樣例代碼如下:


 @PermissionSucceed(PermissionHelper.REQUEST_CODE_READ_CONTACTS)
    private void execute() {
        ToastUtils.getInstance().showToast("讀取聯(lián)系人權(quán)限成功");
    }

 @PermissionFailed(PermissionHelper.REQUEST_CODE_READ_CONTACTS)
    private void readContactsFailed(){
        ToastUtils.getInstance().showToast("讀取聯(lián)系人權(quán)限失敗");
    }

4、反射執(zhí)行方法
4.1、通過反射拿到指定Object對象的字節(jié)碼
4.2、獲取到字節(jié)碼所有方法
4.3、找到指定注解的方法
4.4、執(zhí)行方法
樣例代碼如下:

   private static void executeCancelResult(Object object,String[] permissions, int requestCode) {
        //1 拿到當(dāng)前類的字節(jié)碼
        Class<?> clazz = object.getClass();
        //2 拿到當(dāng)前字節(jié)碼中所有方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            //3 拿到帶有 PermissionSucceed 注解 和 指定requestCode 請求碼的方法
            PermissionFailed permissionFailed = method.getAnnotation(PermissionFailed.class);
            LogUtil.e("executeFailedMethod 方法",method+"");

            if (permissionFailed !=null && permissionFailed.value()==requestCode){
                //4 執(zhí)行方法
                performMethod(method,object);
                return;
            }
        }
    }

以下是自己總結(jié)的具體細(xì)節(jié)流程:

 * 1、判斷系統(tǒng)版本是否大于 6.0及以上
 * 1.1.1、 不是,則執(zhí)行待執(zhí)行的方法
 * 1.1.2、 是,則判斷權(quán)限是否動態(tài)申請
 * 1.1.2.1、已申請,則執(zhí)行待執(zhí)行的方法
 * 1.1.2.2 未申請,則進(jìn)行權(quán)限申請操作
 * <p>
 * 2、動態(tài)申請權(quán)限結(jié)果回調(diào)情況 在 Activity Or Fragment 的 onRequestPermissionsResult 進(jìn)行權(quán)限申請結(jié)果處理
 * 2.1、 用戶授予通過權(quán)限,則執(zhí)行待執(zhí)行的方法 即帶有@PermissionSucceed 的方法
 * 2.2、 用戶拒絕通過權(quán)限
 * 2.2.1、系統(tǒng)權(quán)限彈出框中未勾選不再提示復(fù)選框
 * 2.2.1.1、PermissionHelper 調(diào)用方設(shè)置顯示自定義權(quán)限彈出框
            isShowPermissionDialog = true 不需要顯示自定義權(quán)限彈出框
 * 2.2.1.2、PermissionHelper 調(diào)用方設(shè)置未顯示自定義權(quán)限彈出框
            isShowForcePermissionDialog = false && isShowPermissionDialog = false
            調(diào)用權(quán)限申請失敗的方法即帶有 @PermissionFailed 的方法
 * 2.2.1.3、PermissionHelper 調(diào)用方設(shè)置強(qiáng)制顯示自定義權(quán)限彈出框
            isShowForcePermissionDialog = true && isShowPermissionDialog = true
 * 2.2.1.3.1、顯示自定義權(quán)限彈出框,點擊確認(rèn) 進(jìn)入系統(tǒng)設(shè)置頁面進(jìn)行權(quán)限申請
 * 2.2.1.3.1.1、在 Activity Or Fragment 的 onActivityResult 中再次進(jìn)行權(quán)限申請,回到步驟2
 * 2.2.1.3.2、顯示自定義權(quán)限彈出框,點擊取消 調(diào)用權(quán)限申請失敗的方法即帶有 @PermissionFailed 的方法
 * <p>
 * 2.2.2、系統(tǒng)權(quán)限彈出框中已勾選不再提示復(fù)選框
 * 2.2.2.1、PermissionHelper 調(diào)用方設(shè)置顯示自定義權(quán)限彈出框
              isShowPermissionDialog = true  顯示自定義權(quán)限彈出框
 * 2.2.2.1.1、同 2.2.1.3.1
 * 2.2.2.1.2、同2.2.1.3.2
 * 2.2.2.2、PermissionHelper 調(diào)用方設(shè)置未顯示自定義權(quán)限彈出框
             isShowForcePermissionDialog = false && isShowPermissionDialog = false
             顯示自定義權(quán)限彈出框
 * 2.2.2.2.1、同 2.2.1.3.1
 * 2.2.2.2.2、同2.2.1.3.2
 * 2.2.2.3、PermissionHelper 調(diào)用方設(shè)置強(qiáng)制顯示自定義權(quán)限彈出框
                isShowForcePermissionDialog = true && isShowPermissionDialog = true
                顯示自定義權(quán)限彈出框
 * 2.2.2.3.1、同 2.2.1.3.1
 * 2.2.2.3.2、同2.2.1.3.2
 * <p>
 * 3、反射執(zhí)行方法
 * 3.1、獲取 Object 字節(jié)碼對象
 * 3.2、獲取 字節(jié)碼中所有方法
 * 3.3、獲取帶有指定注解的方法
 * 3.4、判斷當(dāng)前帶有注解的方法是否于當(dāng)前指定的權(quán)限請求碼 RequestCode一致
 * 3.4.1、相同則執(zhí)行方法
 * 3.4.2、不相同則不執(zhí)行方法
 * <p>
 * 4、給待執(zhí)行的方法添加注解
 * 4.1、創(chuàng)建注解類
 * 4.2、給待執(zhí)行方法添加注解標(biāo)記并綁定權(quán)限請求碼

本篇文章自己學(xué)Android 權(quán)限申請時,做的權(quán)限模塊封裝,趁此時的理解還在,在此做一下記錄,方便自己以后回顧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容