向用户申请授权
当应用需要访问用户的隐私信息或使用系统能力时,例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等,应该向用户请求授权,这部分权限是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浏览量
17514 -
鸿蒙
+关注
关注
57文章
2373浏览量
42916
发布评论请先 登录
相关推荐
鸿蒙开发接口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方式来解决等级不匹配的问题,从而使用受限权限。
评论