向用戶申請授權(quán)
當(dāng)應(yīng)用需要訪問用戶的隱私信息或使用系統(tǒng)能力時(shí),例如獲取位置信息、訪問日歷、使用相機(jī)拍攝照片或錄制視頻等,應(yīng)該向用戶請求授權(quán),這部分權(quán)限是user_grant權(quán)限。
當(dāng)應(yīng)用申請user_grant權(quán)限時(shí),需要完成以下步驟:
- 在配置文件中,聲明應(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)用時(shí),在用戶觸發(fā)訪問操作目標(biāo)對象時(shí)應(yīng)該調(diào)用接口,精準(zhǔn)觸發(fā)動(dòng)態(tài)授權(quán)彈框。該接口的內(nèi)部會(huì)檢查當(dāng)前用戶是否已經(jīng)授權(quán)應(yīng)用所需的權(quán)限,如果當(dāng)前用戶尚未授予應(yīng)用所需的權(quán)限,該接口會(huì)拉起動(dòng)態(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é)會(huì)介紹如何完成步驟3和4。
約束與限制
- 每次執(zhí)行需要目標(biāo)權(quán)限的操作時(shí),應(yīng)用都必須檢查自己是否已經(jīng)具有該權(quán)限。
如需檢查用戶是否已向您的應(yīng)用授予特定權(quán)限,可以使用[checkAccessToken()]函數(shù),此方法會(huì)返回[PERMISSION_GRANTED]或[PERMISSION_DENIED]。具體示例可參考下文。 - 每次訪問受目標(biāo)權(quán)限保護(hù)的接口之前,都需要使用[requestPermissionsFromUser()]接口請求相應(yīng)的權(quán)限。
用戶可能在動(dòng)態(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)行時(shí)主動(dòng)調(diào)用系統(tǒng)動(dòng)態(tài)申請權(quán)限的接口,系統(tǒng)彈框由用戶授權(quán),用戶結(jié)合應(yīng)用運(yùn)行場景的上下文,識別出應(yīng)用申請相應(yīng)敏感權(quán)限的合理性,從而做出正確的選擇。
- 系統(tǒng)不鼓勵(lì)頻繁彈窗打擾用戶,如果用戶拒絕授權(quán),將無法再次拉起彈窗,需要應(yīng)用引導(dǎo)用戶在系統(tǒng)應(yīng)用“設(shè)置”的界面中手動(dòng)授予權(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)限 } }
- 動(dòng)態(tài)向用戶申請授權(quán)。
動(dòng)態(tài)向用戶申請權(quán)限是指在應(yīng)用程序運(yùn)行時(shí)向用戶請求授權(quán)的過程??梢酝ㄟ^調(diào)用[requestPermissionsFromUser()]方法來實(shí)現(xiàn)。該方法接收一個(gè)權(quán)限列表參數(shù),例如位置、日歷、相機(jī)、麥克風(fēng)等。用戶可以選擇授予權(quán)限或者拒絕授權(quán)。
可以在UIAbility的onWindowStageCreate()回調(diào)中調(diào)用[requestPermissionsFromUser()]方法來動(dòng)態(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會(huì)判斷權(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會(huì)判斷權(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)用
審核編輯 黃宇
-
框架
+關(guān)注
關(guān)注
0文章
403瀏覽量
17469 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2333瀏覽量
42790
發(fā)布評論請先 登錄
相關(guān)推薦
評論