HarmonyOS自定義權(quán)限組件--你真的弄懂了權(quán)限控制了嗎?
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
前言
關(guān)于HarmonyOS的動(dòng)態(tài)授權(quán)的常規(guī)操作流程和代碼我之前寫過一篇文章,請看《鴻蒙動(dòng)態(tài)權(quán)限申請完整規(guī)范流程和操作詳解(https://harmonyos.51cto.com/posts/5165)》。
權(quán)限控制是在進(jìn)行HarmonyOS應(yīng)用開發(fā)中非常重要的一個(gè)環(huán)節(jié),幾乎所有的商業(yè)應(yīng)用中都會(huì)涉及到。我們在曾經(jīng)使用的Android app應(yīng)用中經(jīng)常會(huì)遇到一些app會(huì)彈出各種敏感權(quán)限授權(quán)窗口提示用戶授權(quán),有些app(特別是流氓應(yīng)用)經(jīng)常會(huì)在第一次打開app的時(shí)候就提醒用戶授予所有需要的權(quán)限,甚至一些權(quán)限跟app功能根本不相關(guān)(比如讀取通訊錄等),如果不授權(quán)則直接不讓你使用該app,我遇到這類流氓應(yīng)用一般果斷卸載。而真正的開發(fā)過程中我們在權(quán)限申請的時(shí)候一般要遵循以下3個(gè)原則:
1、最小權(quán)限集,即應(yīng)用中確實(shí)需要的權(quán)限才進(jìn)行申請。
2、需要用到XX權(quán)限時(shí)才進(jìn)行申請,即并不是app開始的時(shí)候一次性申請所有權(quán)限,而是需要用到XX特定功能必須要授權(quán)才能使用的時(shí)候(比如調(diào)用照相機(jī)),這個(gè)時(shí)候才申請?jiān)撎囟?quán)限。
3、未獲取用戶授權(quán)的話依然能使用應(yīng)用大部分功能,只是必須授權(quán)的功能無法使用。
下面我針對敏感權(quán)限申請更好的復(fù)用,編寫了一個(gè)第三方開源組件,取名為XdwPermissionsLib。
具體項(xiàng)目源碼請見https://gitee.com/xdw1019/XdwPermissionsLib
XdwPermissionsLib
介紹
鴻蒙權(quán)限請求框架,提供一個(gè)符合正規(guī)權(quán)限調(diào)用流程的框架并基于鏈?zhǔn)秸{(diào)用(這里簡稱strong模式),同時(shí)提供一個(gè)并不推薦使用的簡單權(quán)限框架(簡稱lazy模式)。
strong模式:正式項(xiàng)目推薦使用該模式。正規(guī)權(quán)限處理流程,用戶需要檢驗(yàn)權(quán)限并且處理校驗(yàn)結(jié)果的回調(diào)。
lazy模式:該模式下開發(fā)者幾乎不用去編寫請求權(quán)限的代碼,特別是不處理回調(diào)。該模式不推薦在正式項(xiàng)目中使用,可以用于平時(shí)編寫某些demo又不想處理權(quán)限的場景下。當(dāng)然有些app不在乎用戶體驗(yàn),只要不授權(quán)就不讓使用的情況可以使用該模式。
動(dòng)態(tài)申請權(quán)限流程圖
運(yùn)行效果圖展示:
Strong模式下的效果圖:
圖片待補(bǔ)充
lazy模式下的效果圖:
圖片待補(bǔ)充
使用說明
Strong模式:
1.引用
方式一: 通過mylibrary模塊生成har包,添加har包到libs文件夾內(nèi)
方式二:maven引入(待后續(xù)上傳到maven中心倉庫再支持)
2.定義權(quán)限組,比如:
- //定義需要?jiǎng)討B(tài)申請的權(quán)限組,可以是一個(gè)或多個(gè)權(quán)限。這里的權(quán)限還必須要在config.json中進(jìn)行配置
- private String[] permissions = {
- // 存儲(chǔ)權(quán)限
- SystemPermission.WRITE_USER_STORAGE,
- // 相機(jī)權(quán)限
- SystemPermission.CAMERA
- };
3.在需要觸發(fā)權(quán)限申請的地方調(diào)用如下代碼:
- //開始動(dòng)態(tài)申請權(quán)限,鏈?zhǔn)秸{(diào)用。
- //實(shí)際開發(fā)中申請權(quán)限的動(dòng)作應(yīng)該放到需要用到該權(quán)限的操作中觸發(fā),比如點(diǎn)擊某個(gè)按鈕調(diào)起相機(jī) StrongPermissionsUtils.getInstance(this).checkPermissions(this,permissions).setPermissionStateListener(new StrongPermissionsUtils.PermissionStateListener() {
- @Override
- public void onPermissionGranted() {
- //授權(quán)成功之后的回調(diào)
- //此處根據(jù)自己的實(shí)際業(yè)務(wù)編寫業(yè)務(wù)邏輯,此處用toast進(jìn)行演示
- ToastUtil.toast(getContext(),"授權(quán)成功");
- }
- @Override
- public void onPermissionDenied(boolean isDisabledPrompt) {
- //授權(quán)拒絕之后的回調(diào)
- //此處根據(jù)自己的實(shí)際業(yè)務(wù)編寫業(yè)務(wù)邏輯,此處用toast進(jìn)行演示
- if(isDisabledPrompt){
- ToastUtil.toast(getContext(),"您之前拒絕了授權(quán)并且禁止系統(tǒng)再提示,需要手動(dòng)進(jìn)入系統(tǒng)設(shè)置頁面開啟");
- }else{
- ToastUtil.toast(getContext(),"您拒絕了授權(quán)");
- }
- }
- });
4.在當(dāng)前的ability重寫onRequestPermissionsFromUserResult方法,代碼如下:
- @Override
- public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {
- super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults);
- //鑒權(quán)之后的回調(diào),必須調(diào)用
- StrongPermissionsUtils.getInstance(this).onRequestPermissionsResult(requestCode, permissions, grantResults);
- }
Lazy模式:
1.引用
方式一: 通過mylibrary模塊生成har包,添加har包到libs文件夾內(nèi)
方式二:maven引入(待后續(xù)上傳到maven中心倉庫再支持)
2、將需要調(diào)用的Ability繼承LazyPermissionAblity,如下:
- public class MainAbility extends LazyPermissionAblity {
3、在當(dāng)前Ability中定義權(quán)限組,并且在onStart方法的第一行調(diào)用setPermissions方法,如下:
- public class MainAbility extends LazyPermissionAblity {
- //定義需要?jiǎng)討B(tài)申請的權(quán)限組,可以是一個(gè)或多個(gè)權(quán)限。這里的權(quán)限還必須要在config.json中進(jìn)行配置
- private String[] permissions = {
- // 存儲(chǔ)權(quán)限
- SystemPermission.WRITE_USER_STORAGE,
- // 相機(jī)權(quán)限
- SystemPermission.CAMERA
- };
- @Override
- public void onStart(Intent intent) {
- //lazy模式下,setPermissions的代碼調(diào)用必須放在onStart的第一行
- super.setPermissions(permissions);
- super.onStart(intent);
- super.setMainRoute(MainAbilitySlice.class.getName());
- }
- }
工程結(jié)構(gòu)說明
工程中總共有三個(gè)module,分別為mylibrary、entry和LazySample。
mylibrary: 自定義的第三方權(quán)限庫,供外部項(xiàng)目調(diào)用。
entry: 用來演示mylibrary庫中strong模式下的權(quán)限調(diào)用。
LazySample: 用來演示mylibrary庫中l(wèi)azy模式下的權(quán)限調(diào)用。
文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載
https://harmonyos.51cto.com/resource/1195
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)