安卓權(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)限模塊封裝,趁此時的理解還在,在此做一下記錄,方便自己以后回顧。