關(guān)于 HarmonyOS 的動態(tài)授權(quán)的常規(guī)操作流程和代碼我之前寫過一篇文章:《鴻蒙動態(tài)權(quán)限申請完整規(guī)范流程和操作詳解》。
文章地址如下:
https://harmonyos.51cto.com/posts/5165
權(quán)限控制是在進(jìn)行 HarmonyOS 應(yīng)用開發(fā)中非常重要的一個環(huán)節(jié),幾乎所有的商業(yè)應(yīng)用中都會涉及到。
我們在曾經(jīng)使用的 Android app 應(yīng)用中經(jīng)常會遇到一些 app 會彈出各種敏感權(quán)限授權(quán)窗口提示用戶授權(quán)。
有些 app(特別是流氓應(yīng)用)經(jīng)常會在第一次打開 app 的時候就提醒用戶授予所有需要的權(quán)限。
甚至一些權(quán)限跟 app 功能根本不相關(guān)(比如讀取通訊錄等),如果不授權(quán)則直接不讓你使用該 app,我遇到這類流氓應(yīng)用一般果斷卸載。
而真正的開發(fā)過程中我們在權(quán)限申請的時候一般要遵循以下 3 個原則:
最小權(quán)限集,即應(yīng)用中確實需要的權(quán)限才進(jìn)行申請。
需要用到 XX 權(quán)限時才進(jìn)行申請,即并不是 app 開始的時候一次性申請所有權(quán)限,而是需要用到 XX 特定功能必須要授權(quán)才能使用的時候(比如調(diào)用照相機),這個時候才申請該特定權(quán)限。
未獲取用戶授權(quán)的話依然能使用應(yīng)用大部分功能,只是必須授權(quán)的功能無法使用。
下面我針對敏感權(quán)限申請更好的復(fù)用,編寫了一個第三方開源組件,取名為 XdwPermissionsLib。
具體項目源碼請見:
https://gitee.com/xdw1019/XdwPermissionsLib
XdwPermissionsLib 介紹
鴻蒙權(quán)限請求框架,提供一個符合正規(guī)權(quán)限調(diào)用流程的框架并基于鏈?zhǔn)秸{(diào)用(這里簡稱 strong 模式),同時提供一個并不推薦使用的簡單權(quán)限框架(簡稱 lazy 模式)。
strong 模式:正式項目推薦使用該模式。正規(guī)權(quán)限處理流程,用戶需要檢驗權(quán)限并且處理校驗結(jié)果的回調(diào)。
lazy 模式:該模式下開發(fā)者幾乎不用去編寫請求權(quán)限的代碼,特別是不處理回調(diào)。
該模式不推薦在正式項目中使用,可以用于平時編寫某些 demo 又不想處理權(quán)限的場景下。
當(dāng)然有些 app 不在乎用戶體驗,只要不授權(quán)就不讓使用的情況可以使用該模式。
動態(tài)申請權(quán)限流程圖如下:
使用說明
①Strong 模式
引用:
方式一:通過 mylibrary 模塊生成 har 包,添加 har 包到 libs 文件夾內(nèi)
方式二:maven 引入(待后續(xù)上傳到 maven 中心倉庫再支持)
定義權(quán)限組,比如:
//定義需要動態(tài)申請的權(quán)限組,可以是一個或多個權(quán)限。這里的權(quán)限還必須要在config.json中進(jìn)行配置
private String[] permissions = {
// 存儲權(quán)限
SystemPermission.WRITE_USER_STORAGE,
// 相機權(quán)限
SystemPermission.CAMERA
};
在需要觸發(fā)權(quán)限申請的地方調(diào)用如下代碼:
//開始動態(tài)申請權(quán)限,鏈?zhǔn)秸{(diào)用。//實際開發(fā)中申請權(quán)限的動作應(yīng)該放到需要用到該權(quán)限的操作中觸發(fā),比如點擊某個按鈕調(diào)起相機 StrongPermissionsUtils.getInstance(this).checkPermissions(this,permissions).setPermissionStateListener(new StrongPermissionsUtils.PermissionStateListener() {
@Override
public void onPermissionGranted() {
//授權(quán)成功之后的回調(diào)
//此處根據(jù)自己的實際業(yè)務(wù)編寫業(yè)務(wù)邏輯,此處用toast進(jìn)行演示
ToastUtil.toast(getContext(),“授權(quán)成功”);
}
@Override
public void onPermissionDenied(boolean isDisabledPrompt) {
//授權(quán)拒絕之后的回調(diào)
//此處根據(jù)自己的實際業(yè)務(wù)編寫業(yè)務(wù)邏輯,此處用toast進(jìn)行演示
if(isDisabledPrompt){
ToastUtil.toast(getContext(),“您之前拒絕了授權(quán)并且禁止系統(tǒng)再提示,需要手動進(jìn)入系統(tǒng)設(shè)置頁面開啟”);
}else{
ToastUtil.toast(getContext(),“您拒絕了授權(quán)”);
}
}
});
在當(dāng)前的 ability 重寫 onRequestPermissionsFromUserResult 方法,代碼如下:
@Overridepublic 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 模式
引用:
方式一:通過 mylibrary 模塊生成 har 包,添加 har 包到 libs 文件夾內(nèi)
方式二:maven 引入(待后續(xù)上傳到 maven 中心倉庫再支持)
將需要調(diào)用的 Ability 繼承 LazyPermissionAblity,如下:
public class MainAbility extends LazyPermissionAblity {
在當(dāng)前 Ability 中定義權(quán)限組,并且在 onStart 方法的第一行調(diào)用 setPermissions 方法。
代碼如下:
public class MainAbility extends LazyPermissionAblity {
//定義需要動態(tài)申請的權(quán)限組,可以是一個或多個權(quán)限。這里的權(quán)限還必須要在config.json中進(jìn)行配置
private String[] permissions = {
// 存儲權(quán)限
SystemPermission.WRITE_USER_STORAGE,
// 相機權(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)說明
工程中總共有三個 module,分別為:
mylibrary:自定義的第三方權(quán)限庫,供外部項目調(diào)用。
entry:用來演示 mylibrary 庫中 strong 模式下的權(quán)限調(diào)用。
LazySample:用來演示 mylibrary 庫中 lazy 模式下的權(quán)限調(diào)用。
責(zé)任編輯:haq
-
APP
+關(guān)注
關(guān)注
33文章
1568瀏覽量
72377 -
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2634瀏覽量
66220 -
HarmonyOS
+關(guān)注
關(guān)注
79文章
1967瀏覽量
30022
原文標(biāo)題:鴻蒙APP開發(fā):權(quán)限控制詳解!
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論