高質量 HarmonyOS 權限管控流程
在 HarmonyOS 應用開發過程中,往往會涉及到敏感數據和硬件資源的調動和訪問,而這部分的調用就會涉及到管控這部分的知識和內容了。我們需要對它有所了解,才可以在應用開發中提高效率和避免踩坑。
權限管控了什么
權限管控,主要是管控 數據和 功能 。
- 數據包括個人數據(如照片、通訊錄、日歷、位置等)、設備數據(如設備標識、相機、麥克風等)。
- 功能包括設備功能(如訪問攝像頭/麥克風、打電話、聯網等)、應用功能(如彈出懸浮窗、創建快捷方式等)。
權限組和子權限
我們先看什么是子權限。比如對于媒體相冊的功能操作來說。讀取相冊內容是一種權限、寫入內容到相冊是一種權限。 那么它們屬于媒體相冊這個大權限中的子權限。那么我們的應用在申請媒體相冊的讀寫權限時,考慮到用戶的體驗。其實是會把兩個權限合并為一個彈出窗口,詢問用戶授予權限。如果用戶允許了,那么就等于獲得了媒體相冊的讀寫權限了。總結就是
- 讀取媒體相冊是子權限、寫入媒體相冊是子權限
- 它們合起來就是一個權限組。
權限組和子權限一覽
位置信息;
ohos.permission.LOCATION_IN_BACKGROUND;
ohos.permission.LOCATION;
ohos.permission.APPROXIMATELY_LOCATION;
相機;
ohos.permission.CAMERA;
麥克風;
ohos.permission.MICROPHONE;
通訊錄;
ohos.permission.READ_CONTACTS;
ohos.permission.WRITE_CONTACTS;
日歷;
ohos.permission.READ_CALENDAR;
ohos.permission.WRITE_CALENDAR;
ohos.permission.READ_WHOLE_CALENDAR;
ohos.permission.WRITE_WHOLE_CALENDAR;
健身運動;
ohos.permission.ACTIVITY_MOTION;
身體傳感器;
ohos.permission.READ_HEALTH_DATA;
圖片和視頻;
ohos.permission.WRITE_IMAGEVIDEO;
ohos.permission.READ_IMAGEVIDEO;
ohos.permission.MEDIA_LOCATION;
音樂和音頻;
ohos.permission.WRITE_AUDIO;
ohos.permission.READ_AUDIO;
文件;
ohos.permission.READ_DOCUMENT;
ohos.permission.WRITE_DOCUMENT;
ohos.permission.READ_MEDIA;
ohos.permission.WRITE_MEDIA;
廣告跟蹤;
ohos.permission.APP_TRACKING_CONSENT;
讀取已安裝應用列表;
ohos.permission.GET_INSTALLED_BUNDLE_LIST;
多設備協同;
ohos.permission.DISTRIBUTED_DATASYNC;
藍牙;
ohos.permission.ACCESS_BLUETOOTH;
電話;
ohos.permission.ANSWER_CALL;
ohos.permission.MANAGE_VOICEMAIL;
通話記錄;
ohos.permission.READ_CALL_LOG;
ohos.permission.WRITE_CALL_LOG;
信息;
ohos.permission.READ_CELL_MESSAGES;
ohos.permission.READ_MESSAGES;
ohos.permission.RECEIVE_MMS;
ohos.permission.RECEIVE_SMS;
ohos.permission.RECEIVE_WAP_MESSAGES;
ohos.permission.SEND_MESSAGES;
剪切板;
ohos.permission.READ_PASTEBOARD;
文件夾;
ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY;
ohos.permission.READ_WRITE_DESKTOP_DIRECTORY;
ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY;
APL 等級
APL(Ability Privilege Level,元能力權限等級)等級,分為兩類。一類是 應用 APL 等級 、另一類是 權限 APL 等級 。說人話就是 不管官階的士官和其對應的權限之間的關系。
應用 APL 等級
應用 APL 等級分為三級:
APL 級別 | 說明 |
---|---|
normal | 默認情況下,應用的 APL 等級都為 normal 等級。 |
system_basic | 該等級的應用服務提供系統基礎服務。 |
system_core | 該等級的應用服務提供操作系統核心能力。 應用 APL 等級不允許配置為 system_core。 |
權限 APL 等級
權限 APL 等級也分為三級:
APL 級別 | 說明 | 開放范圍 |
---|---|---|
normal | 允許應用訪問超出默認規則外的普通系統資源,如配置 Wi-Fi 信息、調用相機拍攝等。 這些系統資源的開放(包括數據和功能)對用戶隱私以及其他應用帶來的風險低。 | APL 等級為 normal 及以上的應用。 |
system_basic | 允許應用訪問操作系統基礎服務(系統提供或者預置的基礎功能)相關的資源,如系統設置、身份認證等。 這些系統資源的開放對用戶隱私以及其他應用帶來的風險較高。 | APL 等級為 system_basic 及以上的應用。 |
system_core | 涉及開放操作系統核心資源的訪問操作。這部分系統資源是系統最核心的底層服務,如果遭受破壞,操作系統將無法正常運行。 | - APL 等級為 system_core 的應用。 - 僅對系統應用開放。 |
訪問控制列表(ACL)
權限等級和應用 APL 等級是一一對應的。原則上,擁有低 APL 等級的應用默認無法申請更高等級的權限。訪問控制列表 ACL(Access Control List)提供了解決低等級應用訪問高等級權限問題的特殊渠道。我們可以將 ACL 理解為讓普通的老百姓也具有某種士官的能力,如調兵遣將 。
需要注意的是,并不是所有的權限都能通過申請 ACL 來實現跨等級的應用來獲得。具體哪些權限可以被跨等級申請使用。HarmonyOS中也有明確標識的。如: 鏈接
授權方式
不管是什么的方式申請權限,最后在用戶的體驗上一共分為兩種。 system_grant(系統授權) 和 user_grant(用戶授權)
system_grant(系統授權)
- 應用被允許訪問的數據不會涉及到用戶或設備的敏感信息
- 需要在安裝包中申請 system_grant 權限,那么系統會在用戶安裝應用時, 自動把相應權限授予給應用 。
user_grant(用戶授權)
- 會彈出窗口詢問用戶的意見 -應用被允許訪問的數據將會涉及到用戶或設備的敏感信息
- 需要注意的是,如果用戶增加拒絕過授權,那么只能通過引導用戶到系統設置頁面來手動打開權限
申請應用權限流程
一圖勝萬言
總流程圖
normal 等級的應用申請權限
system_basic 等級的應用申請權限
申請應用權限操作步驟
1.聲明權限-必須
- 在 main/module.json5 中 配置 requestPermissions 字段聲明權限
- 配置內容
2.聲明 ACL 權限-非必須
3.向用戶申請授權-非必須
如果你申請的權限類型是 system_grant(系統授權) ,那么可以跳過這個步驟。如果你申請的權限類型是 user_grant(用戶授權) ,那么需要主動申請權限,此時用戶會彈出對話框。如
import abilityAccessCtrl, {
Context,
PermissionRequestResult,
} from "@ohos.abilityAccessCtrl";
import { BusinessError } from "@ohos.base";
import common from "@ohos.app.ability.common";
let atManager: abilityAccessCtrl.AtManager =
abilityAccessCtrl.createAtManager();
let context: Context = getContext(this) as common.UIAbilityContext;
// 申請攝像頭權限
atManager
.requestPermissionsFromUser(context, ["ohos.permission.CAMERA"])
.then((data: PermissionRequestResult) = > {
console.info("data:" + JSON.stringify(data));
console.info("data permissions:" + data.permissions);
console.info("data authResults:" + data.authResults);
})
.catch((err: BusinessError) = > {
console.info("data:" + JSON.stringify(err));
});
此圖只做演示,不和上述代碼具體效果一一對應
4.訪問接口-必須
此時,就可以直接調用相關接口,實現業務功能
5. 當用戶拒絕時,二次申請權限
針對以上彈窗,如果用戶點擊了 禁止 ,我們可以再次彈窗詢問用戶,如 “不授予權則無法繼續使用功能”,“禁止”,“允許”。
此時,如果用戶點擊了允許
- 使用 requestPermissionOnSetting 在應用內直接彈窗 請求授權
- 使用 startAbility 跳轉到系統權限設置頁面,重新授權權限`
let want: Want = { bundleName: "com.huawei.hmos.settings", abilityName: "com.huawei.hmos.settings.MainAbility", uri: "application_info_entry", }; const ctx = getContext(this) as common.UIAbilityContext; ctx.startAbility(want);
附上述流程思維導圖
審核編輯 黃宇
-
HarmonyOS
+關注
關注
79文章
2005瀏覽量
31773
發布評論請先 登錄
相關推薦
評論