向用戶(hù)申請(qǐng)授權(quán)
當(dāng)應(yīng)用需要訪問(wèn)用戶(hù)的隱私信息或使用系統(tǒng)能力時(shí),例如獲取位置信息、訪問(wèn)日歷、使用相機(jī)拍攝照片或錄制視頻等,應(yīng)該向用戶(hù)請(qǐng)求授權(quán),這部分權(quán)限是user_grant權(quán)限。
當(dāng)應(yīng)用申請(qǐng)user_grant權(quán)限時(shí),需要完成以下步驟:
- 在配置文件中,聲明應(yīng)用需要請(qǐng)求的權(quán)限。
- 將應(yīng)用中需要申請(qǐng)權(quán)限的目標(biāo)對(duì)象與對(duì)應(yīng)目標(biāo)權(quán)限進(jìn)行關(guān)聯(lián),讓用戶(hù)明確地知道,哪些操作需要用戶(hù)向應(yīng)用授予指定的權(quán)限。
- 運(yùn)行應(yīng)用時(shí),在用戶(hù)觸發(fā)訪問(wèn)操作目標(biāo)對(duì)象時(shí)應(yīng)該調(diào)用接口,精準(zhǔn)觸發(fā)動(dòng)態(tài)授權(quán)彈框。該接口的內(nèi)部會(huì)檢查當(dāng)前用戶(hù)是否已經(jīng)授權(quán)應(yīng)用所需的權(quán)限,如果當(dāng)前用戶(hù)尚未授予應(yīng)用所需的權(quán)限,該接口會(huì)拉起動(dòng)態(tài)授權(quán)彈框,向用戶(hù)請(qǐng)求授權(quán)。
- 檢查用戶(hù)的授權(quán)結(jié)果,確認(rèn)用戶(hù)已授權(quán)才可以進(jìn)行下一步操作。
- 開(kāi)發(fā)前請(qǐng)熟悉鴻蒙開(kāi)發(fā)指導(dǎo)文檔 :[
gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]
本章節(jié)會(huì)介紹如何完成步驟3和4。
約束與限制
- 每次執(zhí)行需要目標(biāo)權(quán)限的操作時(shí),應(yīng)用都必須檢查自己是否已經(jīng)具有該權(quán)限。
如需檢查用戶(hù)是否已向您的應(yīng)用授予特定權(quán)限,可以使用[checkAccessToken()]函數(shù),此方法會(huì)返回[PERMISSION_GRANTED]或[PERMISSION_DENIED]。具體示例可參考下文。 - 每次訪問(wèn)受目標(biāo)權(quán)限保護(hù)的接口之前,都需要使用[requestPermissionsFromUser()]接口請(qǐng)求相應(yīng)的權(quán)限。
用戶(hù)可能在動(dòng)態(tài)授予權(quán)限后通過(guò)系統(tǒng)設(shè)置來(lái)取消應(yīng)用的權(quán)限,因此不能將之前授予的授權(quán)狀態(tài)持久化。 - user_grant權(quán)限授權(quán)要基于用戶(hù)可知可控的原則,需要應(yīng)用在運(yùn)行時(shí)主動(dòng)調(diào)用系統(tǒng)動(dòng)態(tài)申請(qǐng)權(quán)限的接口,系統(tǒng)彈框由用戶(hù)授權(quán),用戶(hù)結(jié)合應(yīng)用運(yùn)行場(chǎng)景的上下文,識(shí)別出應(yīng)用申請(qǐng)相應(yīng)敏感權(quán)限的合理性,從而做出正確的選擇。
- 系統(tǒng)不鼓勵(lì)頻繁彈窗打擾用戶(hù),如果用戶(hù)拒絕授權(quán),將無(wú)法再次拉起彈窗,需要應(yīng)用引導(dǎo)用戶(hù)在系統(tǒng)應(yīng)用“設(shè)置”的界面中手動(dòng)授予權(quán)限。
開(kāi)發(fā)步驟
以申請(qǐng)使用麥克風(fēng)權(quán)限為例進(jìn)行說(shuō)明。
效果展示:

- 申請(qǐng)ohos.permission.MICROPHONE權(quán)限。
- 校驗(yàn)當(dāng)前是否已經(jīng)授權(quán)。
在進(jìn)行權(quán)限申請(qǐng)之前,需要先檢查當(dāng)前應(yīng)用程序是否已經(jīng)被授予權(quán)限??梢酝ㄟ^(guò)調(diào)用[checkAccessToken()]方法來(lái)校驗(yàn)當(dāng)前是否已經(jīng)授權(quán)。如果已經(jīng)授權(quán),則可以直接訪問(wèn)目標(biāo)操作,否則需要進(jìn)行下一步操作,即向用戶(hù)申請(qǐng)授權(quán)。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; // 獲取應(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àn)應(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; } async function checkPermissions(): Promise< void > { let grantStatus: abilityAccessCtrl.GrantStatus = await checkPermissionGrant(permissions[0]); if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) { // 已經(jīng)授權(quán),可以繼續(xù)訪問(wèn)目標(biāo)操作 } else { // 申請(qǐng)麥克風(fēng)權(quán)限 } } - 動(dòng)態(tài)向用戶(hù)申請(qǐng)授權(quán)。
動(dòng)態(tài)向用戶(hù)申請(qǐng)權(quán)限是指在應(yīng)用程序運(yùn)行時(shí)向用戶(hù)請(qǐng)求授權(quán)的過(guò)程。可以通過(guò)調(diào)用[requestPermissionsFromUser()]方法來(lái)實(shí)現(xiàn)。該方法接收一個(gè)權(quán)限列表參數(shù),例如位置、日歷、相機(jī)、麥克風(fēng)等。用戶(hù)可以選擇授予權(quán)限或者拒絕授權(quán)。
可以在UIAbility的onWindowStageCreate()回調(diào)中調(diào)用[requestPermissionsFromUser()]方法來(lái)動(dòng)態(tài)申請(qǐng)權(quán)限,也可以根據(jù)業(yè)務(wù)需要在UI中向用戶(hù)申請(qǐng)授權(quán)。在UIAbility中向用戶(hù)申請(qǐng)授權(quán)。
import { abilityAccessCtrl, common, Permissions, UIAbility } from '@kit.AbilityKit'; import { window } from '@kit.ArkUI'; import { BusinessError } from '@kit.BasicServicesKit'; const permissions: Array< Permissions > = ['ohos.permission.MICROPHONE']; function reqPermissionsFromUser(permissions: Array< Permissions >, context: common.UIAbilityContext): void { let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager(); // requestPermissionsFromUser會(huì)判斷權(quán)限的授權(quán)狀態(tài)來(lái)決定是否喚起彈窗 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) { // 用戶(hù)授權(quán),可以繼續(xù)訪問(wèn)目標(biāo)操作 } else { // 用戶(hù)拒絕授權(quán),提示用戶(hù)必須授權(quán)才能訪問(wèn)當(dāng)前頁(yè)面的功能,并引導(dǎo)用戶(hù)到系統(tǒng)設(shè)置中打開(kāi)相應(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}`); }) } export default class EntryAbility extends UIAbility { onWindowStageCreate(windowStage: window.WindowStage): void { // ... windowStage.loadContent('pages/Index', (err, data) = > { reqPermissionsFromUser(permissions, this.context); // ... }); } // ... }在UI中向用戶(hù)申請(qǐng)授權(quán)。
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit'; import { BusinessError } from '@kit.BasicServicesKit'; const permissions: Array< Permissions > = ['ohos.permission.MICROPHONE']; function reqPermissionsFromUser(permissions: Array< Permissions >, context: common.UIAbilityContext): void { let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager(); // requestPermissionsFromUser會(huì)判斷權(quán)限的授權(quán)狀態(tài)來(lái)決定是否喚起彈窗 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) { // 用戶(hù)授權(quán),可以繼續(xù)訪問(wèn)目標(biāo)操作 } else { // 用戶(hù)拒絕授權(quán),提示用戶(hù)必須授權(quán)才能訪問(wèn)當(dāng)前頁(yè)面的功能,并引導(dǎo)用戶(hù)到系統(tǒng)設(shè)置中打開(kāi)相應(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}`); }) } @Entry @Component struct Index { aboutToAppear() { const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; reqPermissionsFromUser(permissions, context); } build() { // ... } }HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿
- 處理授權(quán)結(jié)果。
調(diào)用[requestPermissionsFromUser()]方法后,應(yīng)用程序?qū)⒌却脩?hù)授權(quán)的結(jié)果。如果用戶(hù)授權(quán),則可以繼續(xù)訪問(wèn)目標(biāo)操作。如果用戶(hù)拒絕授權(quán),則需要提示用戶(hù)必須授權(quán)才能訪問(wèn)當(dāng)前頁(yè)面的功能,并引導(dǎo)用戶(hù)到系統(tǒng)應(yīng)用“設(shè)置”中打開(kāi)相應(yīng)的權(quán)限。
路徑:設(shè)置 > 隱私 > 權(quán)限管理 > 應(yīng)用 > 目標(biāo)應(yīng)用
審核編輯 黃宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
框架
+關(guān)注
關(guān)注
0文章
404瀏覽量
18429 -
鴻蒙
+關(guān)注
關(guān)注
60文章
2963瀏覽量
45925
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
鴻蒙原生應(yīng)用元服務(wù)-訪問(wèn)控制(權(quán)限)開(kāi)發(fā)Stage模型向用戶(hù)申請(qǐng)授權(quán)
之前,需要先檢查當(dāng)前應(yīng)用程序是否已經(jīng)被授予了權(quán)限。可以通過(guò)調(diào)用checkAccessToken()方法來(lái)校驗(yàn)當(dāng)前是否已經(jīng)授權(quán)。如果已經(jīng)授權(quán),則可以直接訪問(wèn)目標(biāo)操作,否則需要進(jìn)行下一步操作,即向
發(fā)表于 04-15 16:44
鴻蒙原生應(yīng)用元服務(wù)開(kāi)發(fā)-位置服務(wù)申請(qǐng)權(quán)限
申請(qǐng)位置權(quán)限開(kāi)發(fā)指導(dǎo)
場(chǎng)景概述
應(yīng)用在使用位置服務(wù)系統(tǒng)能力前,需要檢查是否已經(jīng)獲取用戶(hù)授權(quán)訪問(wèn)設(shè)備位置信息。如未獲得
發(fā)表于 06-18 15:27
HarmonyOS NEXT應(yīng)用元服務(wù)開(kāi)發(fā)Intents Kit(意圖框架服務(wù))事件推薦接入方案
一、方案概述
當(dāng)開(kāi)發(fā)者有事件想要通知到用戶(hù)時(shí),可通過(guò)應(yīng)用/元服務(wù)的云側(cè)服務(wù)器向智慧分發(fā)平臺(tái)推送事件內(nèi)容(意圖共享)。系統(tǒng)通過(guò)智慧決策判斷事件發(fā)生的條件,在滿(mǎn)足條件時(shí),
發(fā)表于 11-14 15:26
HarmonyOS NEXT應(yīng)用元服務(wù)開(kāi)發(fā)Intents Kit(意圖框架服務(wù))綜述
一、綜述
Intents Kit(意圖框架服務(wù))是HarmonyOS級(jí)的意圖標(biāo)準(zhǔn)體系 ,意圖連接了應(yīng)用/元服務(wù)內(nèi)的業(yè)務(wù)功能。
意圖框架能幫
發(fā)表于 11-28 10:43
鴻蒙應(yīng)用元服務(wù)開(kāi)發(fā)-Account Kit概述
Account Kit(華為賬號(hào)服務(wù))提供簡(jiǎn)單、快速、安全的登錄功能,讓用戶(hù)快捷地使用華為賬號(hào)登錄元服務(wù)。用戶(hù)
發(fā)表于 03-31 12:08
鴻蒙應(yīng)用元服務(wù)開(kāi)發(fā)-Account Kit獲取華為賬號(hào)用戶(hù)信息概述
一、概述
當(dāng)元服務(wù)需要完善用戶(hù)個(gè)人資料(頭像、手機(jī)號(hào)、收貨地址、發(fā)票抬頭)時(shí),可通過(guò)Account Kit提供的相關(guān)能力,引導(dǎo)用戶(hù)填寫(xiě)、管理相關(guān)信息并完成
發(fā)表于 04-02 11:10
鴻蒙應(yīng)用元服務(wù)開(kāi)發(fā)-Account Kit獲取手機(jī)號(hào)
。
二、快速驗(yàn)證
(一)場(chǎng)景介紹
當(dāng)元服務(wù)對(duì)獲取的手機(jī)號(hào)時(shí)效性要求不高時(shí),可調(diào)用Scenario Fusion Kit的快速驗(yàn)證手機(jī)號(hào)Button,向用戶(hù)發(fā)起手機(jī)號(hào)授權(quán)
發(fā)表于 04-08 16:14
鴻蒙應(yīng)用元服務(wù)開(kāi)發(fā)-Account Kit配置登錄權(quán)限
一、場(chǎng)景介紹
華為賬號(hào)登錄是基于OAuth 2.0協(xié)議標(biāo)準(zhǔn)和OpenID Connect協(xié)議標(biāo)準(zhǔn)構(gòu)建的OAuth2.0 授權(quán)登錄系統(tǒng),元服務(wù)可以方便地獲取華為賬號(hào)用戶(hù)的身份標(biāo)識(shí),快速建立元服務(wù)
發(fā)表于 04-15 16:03
鴻蒙Ability Kit(程序框架服務(wù))【Ability內(nèi)頁(yè)面間的跳轉(zhuǎn)】
基于Stage模型下的Ability開(kāi)發(fā),實(shí)現(xiàn)Ability內(nèi)頁(yè)面間的跳轉(zhuǎn)和數(shù)據(jù)傳遞。
鴻蒙Ability Kit(程序框架服務(wù))【Ability與ServiceExtensionAbility通信】
本示例展示通過(guò)[IDL的方式]和?[@ohos.rpc]?等接口實(shí)現(xiàn)了Ability與ServiceExtensionAbility之間的通信。
鴻蒙Ability Kit(程序框架服務(wù))【應(yīng)用啟動(dòng)框架AppStartup】
`AppStartup`提供了一種更加簡(jiǎn)單高效的初始化組件的方式,支持異步初始化組件加速應(yīng)用的啟動(dòng)時(shí)間。使用啟動(dòng)框架應(yīng)用開(kāi)發(fā)者只需要分別為待初始化的組件實(shí)現(xiàn)`AppStartup`提供
鴻蒙開(kāi)發(fā)Ability Kit程序框架服務(wù):聲明權(quán)限
應(yīng)用在申請(qǐng)權(quán)限時(shí),需要在項(xiàng)目的配置文件中,逐個(gè)聲明需要的權(quán)限,否則應(yīng)用將無(wú)法獲取授權(quán)。
鴻蒙開(kāi)發(fā)Ability Kit程序框架服務(wù):向用戶(hù)申請(qǐng)單次授權(quán)
基于授權(quán)最小化的原則,防止應(yīng)用獲取和濫用用戶(hù)數(shù)據(jù),針對(duì)部分應(yīng)用敏感權(quán)限,在彈窗向用戶(hù)申請(qǐng)授權(quán)時(shí),新增“允許本次使用”的
鴻蒙開(kāi)發(fā)Ability Kit程序訪問(wèn)控制:向用戶(hù)申請(qǐng)單次授權(quán)
受限開(kāi)放的權(quán)限通常是不允許三方應(yīng)用申請(qǐng)的。當(dāng)應(yīng)用在申請(qǐng)權(quán)限來(lái)訪問(wèn)必要的資源時(shí),發(fā)現(xiàn)部分權(quán)限的等級(jí)比應(yīng)用APL等級(jí)高,開(kāi)發(fā)者可以選擇通過(guò)ACL方式來(lái)解決等級(jí)不匹配的問(wèn)題,從而使用受限權(quán)限。
鴻蒙開(kāi)發(fā)Ability Kit程序框架服務(wù):向用戶(hù)申請(qǐng)授權(quán)
評(píng)論