高質(zhì)量 HarmonyOS 權(quán)限管控流程
在 HarmonyOS 應(yīng)用開發(fā)過程中,往往會(huì)涉及到敏感數(shù)據(jù)和硬件資源的調(diào)動(dòng)和訪問,而這部分的調(diào)用就會(huì)涉及到管控這部分的知識(shí)和內(nèi)容了。我們需要對(duì)它有所了解,才可以在應(yīng)用開發(fā)中提高效率和避免踩坑。
權(quán)限管控了什么
權(quán)限管控,主要是管控 數(shù)據(jù)和 功能 。
- 數(shù)據(jù)包括個(gè)人數(shù)據(jù)(如照片、通訊錄、日歷、位置等)、設(shè)備數(shù)據(jù)(如設(shè)備標(biāo)識(shí)、相機(jī)、麥克風(fēng)等)。
- 功能包括設(shè)備功能(如訪問攝像頭/麥克風(fēng)、打電話、聯(lián)網(wǎng)等)、應(yīng)用功能(如彈出懸浮窗、創(chuàng)建快捷方式等)。
權(quán)限組和子權(quán)限
我們先看什么是子權(quán)限。比如對(duì)于媒體相冊(cè)的功能操作來說。讀取相冊(cè)內(nèi)容是一種權(quán)限、寫入內(nèi)容到相冊(cè)是一種權(quán)限。 那么它們屬于媒體相冊(cè)這個(gè)大權(quán)限中的子權(quán)限。那么我們的應(yīng)用在申請(qǐng)媒體相冊(cè)的讀寫權(quán)限時(shí),考慮到用戶的體驗(yàn)。其實(shí)是會(huì)把兩個(gè)權(quán)限合并為一個(gè)彈出窗口,詢問用戶授予權(quán)限。如果用戶允許了,那么就等于獲得了媒體相冊(cè)的讀寫權(quán)限了。總結(jié)就是
- 讀取媒體相冊(cè)是子權(quán)限、寫入媒體相冊(cè)是子權(quán)限
- 它們合起來就是一個(gè)權(quán)限組。
權(quán)限組和子權(quán)限一覽
位置信息;
ohos.permission.LOCATION_IN_BACKGROUND;
ohos.permission.LOCATION;
ohos.permission.APPROXIMATELY_LOCATION;
相機(jī);
ohos.permission.CAMERA;
麥克風(fēng);
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;
健身運(yùn)動(dòng);
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;
讀取已安裝應(yīng)用列表;
ohos.permission.GET_INSTALLED_BUNDLE_LIST;
多設(shè)備協(xié)同;
ohos.permission.DISTRIBUTED_DATASYNC;
藍(lán)牙;
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 等級(jí)
APL(Ability Privilege Level,元能力權(quán)限等級(jí))等級(jí),分為兩類。一類是 應(yīng)用 APL 等級(jí) 、另一類是 權(quán)限 APL 等級(jí) 。說人話就是 不管官階的士官和其對(duì)應(yīng)的權(quán)限之間的關(guān)系。
應(yīng)用 APL 等級(jí)
應(yīng)用 APL 等級(jí)分為三級(jí):
APL 級(jí)別 | 說明 |
---|---|
normal | 默認(rèn)情況下,應(yīng)用的 APL 等級(jí)都為 normal 等級(jí)。 |
system_basic | 該等級(jí)的應(yīng)用服務(wù)提供系統(tǒng)基礎(chǔ)服務(wù)。 |
system_core | 該等級(jí)的應(yīng)用服務(wù)提供操作系統(tǒng)核心能力。 應(yīng)用 APL 等級(jí)不允許配置為 system_core。 |
權(quán)限 APL 等級(jí)
權(quán)限 APL 等級(jí)也分為三級(jí):
APL 級(jí)別 | 說明 | 開放范圍 |
---|---|---|
normal | 允許應(yīng)用訪問超出默認(rèn)規(guī)則外的普通系統(tǒng)資源,如配置 Wi-Fi 信息、調(diào)用相機(jī)拍攝等。 這些系統(tǒng)資源的開放(包括數(shù)據(jù)和功能)對(duì)用戶隱私以及其他應(yīng)用帶來的風(fēng)險(xiǎn)低。 | APL 等級(jí)為 normal 及以上的應(yīng)用。 |
system_basic | 允許應(yīng)用訪問操作系統(tǒng)基礎(chǔ)服務(wù)(系統(tǒng)提供或者預(yù)置的基礎(chǔ)功能)相關(guān)的資源,如系統(tǒng)設(shè)置、身份認(rèn)證等。 這些系統(tǒng)資源的開放對(duì)用戶隱私以及其他應(yīng)用帶來的風(fēng)險(xiǎn)較高。 | APL 等級(jí)為 system_basic 及以上的應(yīng)用。 |
system_core | 涉及開放操作系統(tǒng)核心資源的訪問操作。這部分系統(tǒng)資源是系統(tǒng)最核心的底層服務(wù),如果遭受破壞,操作系統(tǒng)將無法正常運(yùn)行。 | - APL 等級(jí)為 system_core 的應(yīng)用。 - 僅對(duì)系統(tǒng)應(yīng)用開放。 |
訪問控制列表(ACL)
權(quán)限等級(jí)和應(yīng)用 APL 等級(jí)是一一對(duì)應(yīng)的。原則上,擁有低 APL 等級(jí)的應(yīng)用默認(rèn)無法申請(qǐng)更高等級(jí)的權(quán)限。訪問控制列表 ACL(Access Control List)提供了解決低等級(jí)應(yīng)用訪問高等級(jí)權(quán)限問題的特殊渠道。我們可以將 ACL 理解為讓普通的老百姓也具有某種士官的能力,如調(diào)兵遣將 。
需要注意的是,并不是所有的權(quán)限都能通過申請(qǐng) ACL 來實(shí)現(xiàn)跨等級(jí)的應(yīng)用來獲得。具體哪些權(quán)限可以被跨等級(jí)申請(qǐng)使用。HarmonyOS中也有明確標(biāo)識(shí)的。如: 鏈接
授權(quán)方式
不管是什么的方式申請(qǐng)權(quán)限,最后在用戶的體驗(yàn)上一共分為兩種。 system_grant(系統(tǒng)授權(quán)) 和 user_grant(用戶授權(quán))
system_grant(系統(tǒng)授權(quán))
- 應(yīng)用被允許訪問的數(shù)據(jù)不會(huì)涉及到用戶或設(shè)備的敏感信息
- 需要在安裝包中申請(qǐng) system_grant 權(quán)限,那么系統(tǒng)會(huì)在用戶安裝應(yīng)用時(shí), 自動(dòng)把相應(yīng)權(quán)限授予給應(yīng)用 。
user_grant(用戶授權(quán))
- 會(huì)彈出窗口詢問用戶的意見 -應(yīng)用被允許訪問的數(shù)據(jù)將會(huì)涉及到用戶或設(shè)備的敏感信息
- 需要注意的是,如果用戶增加拒絕過授權(quán),那么只能通過引導(dǎo)用戶到系統(tǒng)設(shè)置頁面來手動(dòng)打開權(quán)限
申請(qǐng)應(yīng)用權(quán)限流程
一圖勝萬言
總流程圖
normal 等級(jí)的應(yīng)用申請(qǐng)權(quán)限
system_basic 等級(jí)的應(yīng)用申請(qǐng)權(quán)限
申請(qǐng)應(yīng)用權(quán)限操作步驟
1.聲明權(quán)限-必須
- 在 main/module.json5 中 配置 requestPermissions 字段聲明權(quán)限
- 配置內(nèi)容
2.聲明 ACL 權(quán)限-非必須
3.向用戶申請(qǐng)授權(quán)-非必須
如果你申請(qǐng)的權(quán)限類型是 system_grant(系統(tǒng)授權(quán)) ,那么可以跳過這個(gè)步驟。如果你申請(qǐng)的權(quán)限類型是 user_grant(用戶授權(quán)) ,那么需要主動(dòng)申請(qǐng)權(quán)限,此時(shí)用戶會(huì)彈出對(duì)話框。如
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;
// 申請(qǐng)攝像頭權(quán)限
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));
});
此圖只做演示,不和上述代碼具體效果一一對(duì)應(yīng)
4.訪問接口-必須
此時(shí),就可以直接調(diào)用相關(guān)接口,實(shí)現(xiàn)業(yè)務(wù)功能
5. 當(dāng)用戶拒絕時(shí),二次申請(qǐng)權(quán)限
針對(duì)以上彈窗,如果用戶點(diǎn)擊了 禁止 ,我們可以再次彈窗詢問用戶,如 “不授予權(quán)則無法繼續(xù)使用功能”,“禁止”,“允許”。
此時(shí),如果用戶點(diǎn)擊了允許
- 使用 requestPermissionOnSetting 在應(yīng)用內(nèi)直接彈窗 請(qǐng)求授權(quán)
- 使用 startAbility 跳轉(zhuǎn)到系統(tǒng)權(quán)限設(shè)置頁面,重新授權(quán)權(quán)限`
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);
附上述流程思維導(dǎo)圖
審核編輯 黃宇
-
HarmonyOS
+關(guān)注
關(guān)注
80文章
2085瀏覽量
32322
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論