鴻蒙Next權(quán)限申請全攻略:系統(tǒng)授權(quán)與用戶授權(quán)之道

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

在鴻蒙 Next 系統(tǒng)的應(yīng)用開發(fā)中,權(quán)限申請是確保應(yīng)用合法、安全且功能完備的關(guān)鍵環(huán)節(jié)。正確理解并運用系統(tǒng)授權(quán)與用戶授權(quán)機制,不僅能保障用戶數(shù)據(jù)隱私,還能提升應(yīng)用的穩(wěn)定性與用戶體驗。今天,我們就來深入探討如何根據(jù)權(quán)限類型和應(yīng)用需求,選擇恰當(dāng)?shù)纳暾埛绞健?/p>

一、鴻蒙 Next 權(quán)限申請概覽

鴻蒙 Next 系統(tǒng)為了保護用戶數(shù)據(jù)和系統(tǒng)資源,對應(yīng)用的權(quán)限進行了細致的分類管理。其中,系統(tǒng)授權(quán)和用戶授權(quán)是兩種主要的授權(quán)方式,它們各自適用于不同類型的權(quán)限,開發(fā)者需要根據(jù)應(yīng)用的具體功能需求來選擇合適的授權(quán)方式。這就好比在建造一座大廈時,需要根據(jù)不同區(qū)域的功能需求選擇合適的建筑材料和施工工藝,以確保大廈的穩(wěn)固與安全。

(一)系統(tǒng)授權(quán):自動授予的便捷性

系統(tǒng)授權(quán),正如其名,是由系統(tǒng)在應(yīng)用安裝過程中自動完成的權(quán)限授予操作。這種授權(quán)方式適用于那些對系統(tǒng)或其他應(yīng)用影響較小、不涉及用戶敏感信息的權(quán)限。例如,應(yīng)用獲取網(wǎng)絡(luò)信息、查詢自身基本信息等操作所需的權(quán)限,通常都采用系統(tǒng)授權(quán)方式。

(二)用戶授權(quán):以用戶為中心的權(quán)限授予

與系統(tǒng)授權(quán)不同,用戶授權(quán)則更加注重用戶的知情權(quán)和選擇權(quán)。當(dāng)應(yīng)用需要訪問用戶的敏感信息或執(zhí)行可能影響用戶隱私的操作時,如使用攝像頭、麥克風(fēng)、讀取通訊錄等,就必須通過用戶授權(quán)方式獲得用戶的明確許可。這確保了用戶始終對自己的數(shù)據(jù)擁有控制權(quán),就像在自己的私人領(lǐng)地設(shè)置了一道道關(guān)卡,只有經(jīng)過用戶親自授權(quán)的應(yīng)用才能進入并使用相關(guān)資源。

二、系統(tǒng)授權(quán)流程解析

(一)權(quán)限判斷與申請準備

在進行系統(tǒng)授權(quán)之前,開發(fā)者首先要明確應(yīng)用所需的權(quán)限,并判斷這些權(quán)限是否屬于系統(tǒng)授權(quán)類型。這需要開發(fā)者對鴻蒙 Next 的權(quán)限體系有深入的了解,熟悉各種權(quán)限的分類和適用場景??梢詫⑵漕惐葹楹胶G暗暮骄€規(guī)劃,只有明確目的地和路線,才能確保航行的順利進行。

(二)系統(tǒng)自動授予權(quán)限的過程

一旦確定應(yīng)用所需的權(quán)限為系統(tǒng)授權(quán)類型,開發(fā)者只需在應(yīng)用的配置文件中正確聲明這些權(quán)限。當(dāng)用戶安裝應(yīng)用時,系統(tǒng)會自動識別并授予相應(yīng)的權(quán)限,整個過程無需用戶進行額外的操作。這就像在一家自動化餐廳,顧客只需選擇自己想要的菜品(聲明權(quán)限),餐廳的自動化系統(tǒng)(鴻蒙 Next 系統(tǒng))就會自動將菜品送到顧客面前(授予權(quán)限)。

(三)系統(tǒng)授權(quán)權(quán)限列表展示

以下是一些常見的系統(tǒng)授權(quán)權(quán)限及其說明:

權(quán)限名稱 權(quán)限描述
ohos.permission.USE_BLUETOOTH 允許應(yīng)用查看藍牙的配置。
ohos.permission.GET_BUNDLE_INFO 允許查詢應(yīng)用的基本信息。
ohos.permission.PREPARE_APP_TERMINATE 允許應(yīng)用關(guān)閉前執(zhí)行自定義的預(yù)關(guān)閉動作。
ohos.permission.PRINT 允許應(yīng)用獲取打印框架的能力。
ohos.permission.DISCOVER_BLUETOOTH 允許應(yīng)用配置本地藍牙,查找遠端設(shè)備且與之配對連接。

三、用戶授權(quán)流程詳解

(一)在配置文件中聲明權(quán)限

  1. 配置文件的選擇與定位
    用戶授權(quán)的第一步是在應(yīng)用的配置文件中聲明所需的權(quán)限。在鴻蒙 Next 項目中,通常使用“module.json5”配置文件來進行權(quán)限聲明。這個配置文件就像是應(yīng)用的“說明書”,告訴系統(tǒng)應(yīng)用需要哪些權(quán)限才能正常運行。
  2. 權(quán)限聲明的格式與規(guī)范
    在“module.json5”文件中,通過“requestPermissions”字段來聲明權(quán)限。每個權(quán)限聲明都包含“name”(權(quán)限名稱)、“reason”(申請權(quán)限的原因)和“usedScene”(權(quán)限使用的場景)等屬性。例如:
{
"module": {
"requestPermissions":[
{
"name": "ohos.permission.CAMERA",
"reason": "$string:reason_camera",
"usedScene": {
"abilities": [
"MainAbility"
],
"when":"inuse"
}
}
]
}
}

其中,“name”必須是系統(tǒng)定義的有效權(quán)限名稱,“reason”需要用簡潔明了的語言向用戶說明申請該權(quán)限的原因,并且要遵循一定的文案規(guī)范,如使用直白、具體、易理解的完整短句,避免使用被動語態(tài),以句號結(jié)尾,同時要確保字符串長度適中,以適應(yīng)多語言適配的需求?!皍sedScene”則用于指定權(quán)限使用的場景,包括使用權(quán)限的 UIAbility 或 ExtensionAbility 組件名稱以及調(diào)用時機(“inuse”表示使用時,“always”表示始終)。

(二)使用 API 動態(tài)請求用戶授權(quán)

  1. 權(quán)限檢查與準備
    在動態(tài)請求用戶授權(quán)之前,應(yīng)用應(yīng)該先檢查當(dāng)前是否已經(jīng)獲得了所需的權(quán)限。這可以通過調(diào)用“checkAccessToken()”函數(shù)來實現(xiàn),該函數(shù)會返回“PERMISSION_GRANTED”或“PERMISSION_DENIED”,以指示當(dāng)前權(quán)限的授予狀態(tài)。這就好比在進入一個需要門票的場所之前,先檢查自己是否已經(jīng)購買了門票。
  2. 動態(tài)請求授權(quán)的 API 調(diào)用
    如果應(yīng)用尚未獲得所需權(quán)限,就需要使用“requestPermissionsFromUser()”接口向用戶發(fā)起授權(quán)請求。這個接口接收一個權(quán)限列表作為參數(shù),例如,如果應(yīng)用需要同時申請相機和麥克風(fēng)權(quán)限,可以這樣調(diào)用:
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) {
// 用戶授權(quán),可以繼續(xù)訪問目標操作
} else {
// 用戶拒絕授權(quán),提示用戶必須授權(quán)才能訪問當(dāng)前頁面的功能,并引導(dǎo)用戶到系統(tǒng)設(shè)置中打開相應(yīng)的權(quán)限
return;
}
}
// 授權(quán)成功
}).catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
});
}

在上述代碼中,首先創(chuàng)建了一個“AtManager”實例,然后調(diào)用“requestPermissionsFromUser()”方法向用戶請求權(quán)限。根據(jù)用戶的授權(quán)結(jié)果,應(yīng)用可以采取相應(yīng)的操作,如繼續(xù)執(zhí)行需要權(quán)限的功能或提示用戶前往系統(tǒng)設(shè)置中手動授予權(quán)限。

(三)處理用戶授權(quán)結(jié)果

  1. 授權(quán)成功后的操作
    當(dāng)用戶授權(quán)成功后,應(yīng)用可以繼續(xù)執(zhí)行需要該權(quán)限的操作。例如,如果應(yīng)用申請了相機權(quán)限并獲得授權(quán),就可以打開相機進行拍照或錄像操作。這就像獲得了進入寶庫的鑰匙,可以順利取出寶藏(執(zhí)行相應(yīng)功能)。
  2. 授權(quán)失敗后的應(yīng)對策略
    如果用戶拒絕授權(quán),應(yīng)用需要友好地提示用戶授權(quán)的必要性,并引導(dǎo)用戶前往系統(tǒng)設(shè)置中手動授予權(quán)限。同時,應(yīng)用應(yīng)該確保在用戶未授權(quán)的情況下,不會影響其他無關(guān)功能的正常使用。這就好比在一扇緊閉的門前,向用戶解釋門后的精彩內(nèi)容,并引導(dǎo)用戶找到打開門的正確方法,而不是強行推門或影響周圍環(huán)境的正常秩序。

(四)用戶授權(quán)權(quán)限列表展示

以下是一些常見的用戶授權(quán)權(quán)限及其說明:

權(quán)限名稱 權(quán)限描述
ohos.permission.ACCESS_BLUETOOTH 允許應(yīng)用接入藍牙并使用藍牙能力,例如配對、連接外圍設(shè)備等。
ohos.permission.CAMERA 允許應(yīng)用使用相機。
ohos.permission.MICROPHONE 允許應(yīng)用使用麥克風(fēng)。
ohos.permission.READ_CALENDAR 允許應(yīng)用讀取日歷信息。
ohos.permission.WRITE_CALENDAR 允許應(yīng)用添加、移除或更改日歷活動。

四、不同權(quán)限類型申請方式總結(jié)

為了更清晰地展示不同權(quán)限類型的申請方式,我們通過以下表格進行總結(jié):

權(quán)限類型 授權(quán)方式 操作路徑
系統(tǒng)授權(quán)(system_grant) 自動授予 在配置文件中聲明權(quán)限
用戶授權(quán)(user_grant) 用戶手動授權(quán) 在配置文件中聲明權(quán)限 > 使用 API 動態(tài)請求用戶授權(quán) > 處理用戶授權(quán)結(jié)果

五、示例代碼:請求麥克風(fēng)權(quán)限

以下是一個完整的示例代碼,演示了如何在鴻蒙 Next 應(yīng)用中請求麥克風(fēng)權(quán)限:

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

// 定義需要申請的權(quán)限列表,這里僅包含麥克風(fēng)權(quán)限
const permissions: Array<Permissions> = ['ohos.permission.MICROPHONE'];

// 檢查當(dāng)前應(yīng)用是否已被授予指定權(quán)限
async function checkPermissionGrant(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
// 獲取應(yīng)用程序的 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}`);
}
// 校驗應(yīng)用是否被授予權(quán)限
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;
}

// 檢查權(quán)限并根據(jù)結(jié)果進行相應(yīng)操作
async function checkPermissions(): Promise<void> {
let grantStatus: abilityAccessCtrl.GrantStatus = await checkPermissionGrant(permissions[0]);
if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
// 已經(jīng)授權(quán),可以繼續(xù)訪問目標操作,這里可以添加使用麥克風(fēng)的相關(guān)代碼
console.log('已獲得麥克風(fēng)權(quán)限,可以進行錄音等操作。');
} else {
// 申請麥克風(fēng)權(quán)限
reqPermissionsFromUser(permissions);
}
}

// 使用 API 動態(tài)請求用戶授權(quán)
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) {
// 用戶授權(quán),可以繼續(xù)訪問目標操作,這里可以添加使用麥克風(fēng)的相關(guān)代碼
console.log('用戶已授權(quán)麥克風(fēng)權(quán)限,可以進行錄音等操作。');
} else {
// 用戶拒絕授權(quán),提示用戶必須授權(quán)才能訪問當(dāng)前頁面的功能,并引導(dǎo)用戶到系統(tǒng)設(shè)置中打開相應(yīng)的權(quán)限
console.log('用戶拒絕授權(quán)麥克風(fēng)權(quán)限,請前往系統(tǒng)設(shè)置中手動授予權(quán)限。');
return;
}
}
// 授權(quán)成功
}).catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
});
}

// 在應(yīng)用啟動或需要使用麥克風(fēng)的地方調(diào)用 checkPermissions() 函數(shù)來檢查和申請權(quán)限
checkPermissions();

在上述代碼中,首先定義了需要申請的麥克風(fēng)權(quán)限。然后,通過“checkPermissionGrant()”函數(shù)檢查應(yīng)用當(dāng)前是否已獲得該權(quán)限。如果未獲得權(quán)限,則調(diào)用“reqPermissionsFromUser()”函數(shù)向用戶發(fā)起授權(quán)請求。根據(jù)用戶的授權(quán)結(jié)果,應(yīng)用會在控制臺輸出相應(yīng)的提示信息,并在授權(quán)成功后可以繼續(xù)執(zhí)行使用麥克風(fēng)的相關(guān)操作。

總之,在鴻蒙 Next 應(yīng)用開發(fā)中,正確處理權(quán)限申請是至關(guān)重要的。開發(fā)者需要深入理解系統(tǒng)授權(quán)和用戶授權(quán)的機制與流程,根據(jù)應(yīng)用的實際需求合理選擇授權(quán)方式,并嚴格按照規(guī)范進行權(quán)限聲明和請求操作。只有這樣,才能確保應(yīng)用在保障用戶數(shù)據(jù)安全的前提下,提供穩(wěn)定、優(yōu)質(zhì)的服務(wù)。希望通過本文的介紹,能幫助我們開發(fā)者更加順利地完成鴻蒙 Next 應(yīng)用的權(quán)限申請工作,讓我們一起打造更加安全、可靠的智能應(yīng)用生態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容