鴻蒙Next許可權申請全攻略:系統授權與使用者授權之道

SameX發表於2024-11-05

本文旨在深入探討華為鴻蒙HarmonyOS Next系統(截止目前 API12)在開發多語言電商平臺方面的技術細節,基於實際開發實踐進行總結。主要作為技術分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。本文為原創內容,任何形式的轉載必須註明出處及原作者。

在鴻蒙 Next 系統的應用開發中,許可權申請是確保應用合法、安全且功能完備的關鍵環節。正確理解並運用系統授權與使用者授權機制,不僅能保障使用者資料隱私,還能提升應用的穩定性與使用者體驗。今天,我們就來深入探討如何根據許可權型別和應用需求,選擇恰當的申請方式。

一、鴻蒙 Next 許可權申請概覽

鴻蒙 Next 系統為了保護使用者資料和系統資源,對應用的許可權進行了細緻的分類管理。其中,系統授權和使用者授權是兩種主要的授權方式,它們各自適用於不同型別的許可權,開發者需要根據應用的具體功能需求來選擇合適的授權方式。這就好比在建造一座大廈時,需要根據不同區域的功能需求選擇合適的建築材料和施工工藝,以確保大廈的穩固與安全。

(一)系統授權:自動授予的便捷性

系統授權,正如其名,是由系統在應用安裝過程中自動完成的許可權授予操作。這種授權方式適用於那些對系統或其他應用影響較小、不涉及使用者敏感資訊的許可權。例如,應用獲取網路資訊、查詢自身基本資訊等操作所需的許可權,通常都採用系統授權方式。

(二)使用者授權:以使用者為中心的許可權授予

與系統授權不同,使用者授權則更加註重使用者的知情權和選擇權。當應用需要訪問使用者的敏感資訊或執行可能影響使用者隱私的操作時,如使用攝像頭、麥克風、讀取通訊錄等,就必須透過使用者授權方式獲得使用者的明確許可。這確保了使用者始終對自己的資料擁有控制權,就像在自己的私人領地設定了一道道關卡,只有經過使用者親自授權的應用才能進入並使用相關資源。

二、系統授權流程解析

(一)許可權判斷與申請準備

在進行系統授權之前,開發者首先要明確應用所需的許可權,並判斷這些許可權是否屬於系統授權型別。這需要開發者對鴻蒙 Next 的許可權體系有深入的瞭解,熟悉各種許可權的分類和適用場景。可以將其類比為航海前的航線規劃,只有明確目的地和路線,才能確保航行的順利進行。

(二)系統自動授予許可權的過程

一旦確定應用所需的許可權為系統授權型別,開發者只需在應用的配置檔案中正確宣告這些許可權。當使用者安裝應用時,系統會自動識別並授予相應的許可權,整個過程無需使用者進行額外的操作。這就像在一家自動化餐廳,顧客只需選擇自己想要的菜品(宣告許可權),餐廳的自動化系統(鴻蒙 Next 系統)就會自動將菜品送到顧客面前(授予許可權)。

(三)系統授權許可權列表展示

以下是一些常見的系統授權許可權及其說明:

許可權名稱 許可權描述
ohos.permission.USE_BLUETOOTH 允許應用檢視藍芽的配置。
ohos.permission.GET_BUNDLE_INFO 允許查詢應用的基本資訊。
ohos.permission.PREPARE_APP_TERMINATE 允許應用關閉前執行自定義的預關閉動作。
ohos.permission.PRINT 允許應用獲取列印框架的能力。
ohos.permission.DISCOVER_BLUETOOTH 允許應用配置本地藍芽,查詢遠端裝置且與之配對連線。

三、使用者授權流程詳解

(一)在配置檔案中宣告許可權

  1. 配置檔案的選擇與定位
    使用者授權的第一步是在應用的配置檔案中宣告所需的許可權。在鴻蒙 Next 專案中,通常使用“module.json5”配置檔案來進行許可權宣告。這個配置檔案就像是應用的“說明書”,告訴系統應用需要哪些許可權才能正常執行。
  2. 許可權宣告的格式與規範
    在“module.json5”檔案中,透過“requestPermissions”欄位來宣告許可權。每個許可權宣告都包含“name”(許可權名稱)、“reason”(申請許可權的原因)和“usedScene”(許可權使用的場景)等屬性。例如:
{
"module": {
"requestPermissions":[
{
"name": "ohos.permission.CAMERA",
"reason": "$string:reason_camera",
"usedScene": {
"abilities": [
"MainAbility"
],
"when":"inuse"
}
}
]
}
}

其中,“name”必須是系統定義的有效許可權名稱,“reason”需要用簡潔明瞭的語言向使用者說明申請該許可權的原因,並且要遵循一定的文案規範,如使用直白、具體、易理解的完整短句,避免使用被動語態,以句號結尾,同時要確保字串長度適中,以適應多語言適配的需求。“usedScene”則用於指定許可權使用的場景,包括使用許可權的 UIAbility 或 ExtensionAbility 元件名稱以及呼叫時機(“inuse”表示使用時,“always”表示始終)。

(二)使用 API 動態請求使用者授權

  1. 許可權檢查與準備
    在動態請求使用者授權之前,應用應該先檢查當前是否已經獲得了所需的許可權。這可以透過呼叫“checkAccessToken()”函式來實現,該函式會返回“PERMISSION_GRANTED”或“PERMISSION_DENIED”,以指示當前許可權的授予狀態。這就好比在進入一個需要門票的場所之前,先檢查自己是否已經購買了門票。
  2. 動態請求授權的 API 呼叫
    如果應用尚未獲得所需許可權,就需要使用“requestPermissionsFromUser()”介面向使用者發起授權請求。這個介面接收一個許可權列表作為引數,例如,如果應用需要同時申請相機和麥克風許可權,可以這樣呼叫:
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

const permissions: Array<Permissions> = ['ohos.permission.CAMERA', 'ohos.permission.MICROPHONE'];

function reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext): void {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(context, permissions).then((data) => {
let grantStatus: Array<number> = data.authResults;
let length: number = grantStatus.length;
for (let i = 0; i < length; i++) {
if (grantStatus[i] === 0) {
// 使用者授權,可以繼續訪問目標操作
} else {
// 使用者拒絕授權,提示使用者必須授權才能訪問當前頁面的功能,並引導使用者到系統設定中開啟相應的許可權
return;
}
}
// 授權成功
}).catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
});
}

在上述程式碼中,首先建立了一個“AtManager”例項,然後呼叫“requestPermissionsFromUser()”方法向使用者請求許可權。根據使用者的授權結果,應用可以採取相應的操作,如繼續執行需要許可權的功能或提示使用者前往系統設定中手動授予許可權。

(三)處理使用者授權結果

  1. 授權成功後的操作
    當使用者授權成功後,應用可以繼續執行需要該許可權的操作。例如,如果應用申請了相機許可權並獲得授權,就可以開啟相機進行拍照或錄影操作。這就像獲得了進入寶庫的鑰匙,可以順利取出寶藏(執行相應功能)。
  2. 授權失敗後的應對策略
    如果使用者拒絕授權,應用需要友好地提示使用者授權的必要性,並引導使用者前往系統設定中手動授予許可權。同時,應用應該確保在使用者未授權的情況下,不會影響其他無關功能的正常使用。這就好比在一扇緊閉的門前,向使用者解釋門後的精彩內容,並引導使用者找到開啟門的正確方法,而不是強行推門或影響周圍環境的正常秩序。

(四)使用者授權許可權列表展示

以下是一些常見的使用者授權許可權及其說明:

許可權名稱 許可權描述
ohos.permission.ACCESS_BLUETOOTH 允許應用接入藍芽並使用藍芽能力,例如配對、連線外圍裝置等。
ohos.permission.CAMERA 允許應用使用相機。
ohos.permission.MICROPHONE 允許應用使用麥克風。
ohos.permission.READ_CALENDAR 允許應用讀取日曆資訊。
ohos.permission.WRITE_CALENDAR 允許應用新增、移除或更改日曆活動。

四、不同許可權型別申請方式總結

為了更清晰地展示不同許可權型別的申請方式,我們透過以下表格進行總結:

許可權型別 授權方式 操作路徑
系統授權(system_grant) 自動授予 在配置檔案中宣告許可權
使用者授權(user_grant) 使用者手動授權 在配置檔案中宣告許可權 > 使用 API 動態請求使用者授權 > 處理使用者授權結果

五、示例程式碼:請求麥克風許可權

以下是一個完整的示例程式碼,演示瞭如何在鴻蒙 Next 應用中請求麥克風許可權:

import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 定義需要申請的許可權列表,這裡僅包含麥克風許可權
const permissions: Array<Permissions> = ['ohos.permission.MICROPHONE'];

// 檢查當前應用是否已被授予指定許可權
async function checkPermissionGrant(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
// 獲取應用程式的 accessTokenID
let tokenId: number = 0;
try {
let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
tokenId = appInfo.accessTokenId;
} catch (error) {
const err: BusinessError = error as BusinessError;
console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
}
// 校驗應用是否被授予許可權
try {
grantStatus = await atManager.checkAccessToken(tokenId, permission);
} catch (error) {
const err: BusinessError = error as BusinessError;
console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`);
}
return grantStatus;
}

// 檢查許可權並根據結果進行相應操作
async function checkPermissions(): Promise<void> {
let grantStatus: abilityAccessCtrl.GrantStatus = await checkPermissionGrant(permissions[0]);
if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
// 已經授權,可以繼續訪問目標操作,這裡可以新增使用麥克風的相關程式碼
console.log('已獲得麥克風許可權,可以進行錄音等操作。');
} else {
// 申請麥克風許可權
reqPermissionsFromUser(permissions);
}
}

// 使用 API 動態請求使用者授權
function reqPermissionsFromUser(permissions: Array<Permissions>): void {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(globalThis.context as common.UIAbilityContext, permissions).then((data) => {
let grantStatus: Array<number> = data.authResults;
let length: number = grantStatus.length;
for (let i = 0; i < length; i++) {
if (grantStatus[i] === 0) {
// 使用者授權,可以繼續訪問目標操作,這裡可以新增使用麥克風的相關程式碼
console.log('使用者已授權麥克風許可權,可以進行錄音等操作。');
} else {
// 使用者拒絕授權,提示使用者必須授權才能訪問當前頁面的功能,並引導使用者到系統設定中開啟相應的許可權
console.log('使用者拒絕授權麥克風許可權,請前往系統設定中手動授予許可權。');
return;
}
}
// 授權成功
}).catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
});
}

// 在應用啟動或需要使用麥克風的地方呼叫 checkPermissions() 函式來檢查和申請許可權
checkPermissions();

在上述程式碼中,首先定義了需要申請的麥克風許可權。然後,透過“checkPermissionGrant()”函式檢查應用當前是否已獲得該許可權。如果未獲得許可權,則呼叫“reqPermissionsFromUser()”函式向使用者發起授權請求。根據使用者的授權結果,應用會在控制檯輸出相應的提示資訊,並在授權成功後可以繼續執行使用麥克風的相關操作。

總之,在鴻蒙 Next 應用開發中,正確處理許可權申請是至關重要的。開發者需要深入理解系統授權和使用者授權的機制與流程,根據應用的實際需求合理選擇授權方式,並嚴格按照規範進行許可權宣告和請求操作。只有這樣,才能確保應用在保障使用者資料安全的前提下,提供穩定、優質的服務。希望透過本文的介紹,能幫助我們開發者更加順利地完成鴻蒙 Next 應用的許可權申請工作,讓我們一起打造更加安全、可靠的智慧應用生態。

相關文章