向用戶申請授權
當應用需要訪問用戶的隱私信息或使用系統能力時,例如獲取位置信息、訪問日歷、使用相機拍攝照片或錄制視頻等,應該向用戶請求授權,這部分權限是user_grant權限。
當應用申請user_grant權限時,需要完成以下步驟:
- 在配置文件中,聲明應用需要請求的權限。
- 將應用中需要申請權限的目標對象與對應目標權限進行關聯,讓用戶明確地知道,哪些操作需要用戶向應用授予指定的權限。
- 運行應用時,在用戶觸發訪問操作目標對象時應該調用接口,精準觸發動態授權彈框。該接口的內部會檢查當前用戶是否已經授權應用所需的權限,如果當前用戶尚未授予應用所需的權限,該接口會拉起動態授權彈框,向用戶請求授權。
- 檢查用戶的授權結果,確認用戶已授權才可以進行下一步操作。
- 開發前請熟悉鴻蒙開發指導文檔 :[
gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]
本章節會介紹如何完成步驟3和4。
約束與限制
- 每次執行需要目標權限的操作時,應用都必須檢查自己是否已經具有該權限。
如需檢查用戶是否已向您的應用授予特定權限,可以使用[checkAccessToken()]函數,此方法會返回[PERMISSION_GRANTED]或[PERMISSION_DENIED]。具體示例可參考下文。 - 每次訪問受目標權限保護的接口之前,都需要使用[requestPermissionsFromUser()]接口請求相應的權限。
用戶可能在動態授予權限后通過系統設置來取消應用的權限,因此不能將之前授予的授權狀態持久化。 - user_grant權限授權要基于用戶可知可控的原則,需要應用在運行時主動調用系統動態申請權限的接口,系統彈框由用戶授權,用戶結合應用運行場景的上下文,識別出應用申請相應敏感權限的合理性,從而做出正確的選擇。
- 系統不鼓勵頻繁彈窗打擾用戶,如果用戶拒絕授權,將無法再次拉起彈窗,需要應用引導用戶在系統應用“設置”的界面中手動授予權限。
開發步驟
以申請使用麥克風權限為例進行說明。
效果展示:
- 申請ohos.permission.MICROPHONE權限。
- 校驗當前是否已經授權。
在進行權限申請之前,需要先檢查當前應用程序是否已經被授予權限。可以通過調用[checkAccessToken()]方法來校驗當前是否已經授權。如果已經授權,則可以直接訪問目標操作,否則需要進行下一步操作,即向用戶申請授權。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) { // 已經授權,可以繼續訪問目標操作 } else { // 申請麥克風權限 } }
- 動態向用戶申請授權。
動態向用戶申請權限是指在應用程序運行時向用戶請求授權的過程。可以通過調用[requestPermissionsFromUser()]方法來實現。該方法接收一個權限列表參數,例如位置、日歷、相機、麥克風等。用戶可以選擇授予權限或者拒絕授權。
可以在UIAbility的onWindowStageCreate()回調中調用[requestPermissionsFromUser()]方法來動態申請權限,也可以根據業務需要在UI中向用戶申請授權。在UIAbility中向用戶申請授權。
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會判斷權限的授權狀態來決定是否喚起彈窗 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}`); }) } export default class EntryAbility extends UIAbility { onWindowStageCreate(windowStage: window.WindowStage): void { // ... windowStage.loadContent('pages/Index', (err, data) = > { reqPermissionsFromUser(permissions, this.context); // ... }); } // ... }
在UI中向用戶申請授權。
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會判斷權限的授權狀態來決定是否喚起彈窗 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}`); }) } @Entry @Component struct Index { aboutToAppear() { const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; reqPermissionsFromUser(permissions, context); } build() { // ... } }
HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿
- 處理授權結果。
調用[requestPermissionsFromUser()]方法后,應用程序將等待用戶授權的結果。如果用戶授權,則可以繼續訪問目標操作。如果用戶拒絕授權,則需要提示用戶必須授權才能訪問當前頁面的功能,并引導用戶到系統應用“設置”中打開相應的權限。
路徑:設置 > 隱私 > 權限管理 > 應用 > 目標應用
審核編輯 黃宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
框架
+關注
關注
0文章
403瀏覽量
17475 -
鴻蒙
+關注
關注
57文章
2339瀏覽量
42805
發布評論請先 登錄
相關推薦
鴻蒙開發接口Ability框架:【@ohos.ability.featureAbility (FeatureAbility模塊)】
FeatureAbility模塊提供帶有UI設計與用戶交互的能力,包括啟動新的ability、獲取dataAbilityHelper、設置此Page Ability、獲取當前Ability
鴻蒙Ability Kit(程序框架服務)【ServiceExtensionAbility】
[ServiceExtensionAbility]是SERVICE類型的ExtensionAbility組件,提供后臺服務能力,其內部持有了一個[ServiceExtensionContext],通過[ServiceExtensionContext]提供了豐富的接口供外部使用。
鴻蒙Ability開發-Stage模型下Ability的創建和使用
) ?? \'\');
});
}
...
};
UIAbilityContext模塊啟動Ability的能力
UIAbilityContext模塊提供允許訪問特定Ability的資源的能力,包括對Ability的啟動、停止
發表于 01-08 15:34
鴻蒙原生應用元服務-訪問控制(權限)開發Stage模型向用戶申請授權
之前,需要先檢查當前應用程序是否已經被授予了權限。可以通過調用checkAccessToken()方法來校驗當前是否已經授權。如果已經授權,則可以直接訪問目標操作,否則需要進行下一步操作,即向
發表于 04-15 16:44
鴻蒙原生應用元服務-訪問控制(權限)開發等級和類型
,列表中給出了詳細的權限使用理由。
應用需要在應用商店的詳情頁面,向用戶展示所申請的user_grant權限列表。
不同權限類型的授權流程
如權限的工作流程所示,如果應用需要獲取目標權限,那么需要先進
發表于 04-17 15:29
HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)事件推薦接入方案
一、方案概述
當開發者有事件想要通知到用戶時,可通過應用/元服務的云側服務器向智慧分發平臺推送事件內容(意圖共享)。系統通過智慧決策判斷事件發生的條件,在滿足條件時,
發表于 11-14 15:26
HarmonyOS NEXT應用元服務開發Intents Kit(意圖框架服務)綜述
一、綜述
Intents Kit(意圖框架服務)是HarmonyOS級的意圖標準體系 ,意圖連接了應用/元服務內的業務功能。
意圖框架能幫
發表于 11-28 10:43
鴻蒙Ability Kit(程序框架服務)【Ability與ServiceExtensionAbility通信】
本示例展示通過[IDL的方式]和?[@ohos.rpc]?等接口實現了Ability與ServiceExtensionAbility之間的通信。
鴻蒙Ability Kit(程序框架服務)【應用啟動框架AppStartup】
`AppStartup`提供了一種更加簡單高效的初始化組件的方式,支持異步初始化組件加速應用的啟動時間。使用啟動框架應用開發者只需要分別為待初始化的組件實現`AppStartup`提供
鴻蒙開發Ability Kit程序訪問控制:向用戶申請單次授權
受限開放的權限通常是不允許三方應用申請的。當應用在申請權限來訪問必要的資源時,發現部分權限的等級比應用APL等級高,開發者可以選擇通過ACL方式來解決等級不匹配的問題,從而使用受限權限。
評論