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

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