权限管理说明

权限管理说明在鸿蒙开发中 调用部分 API 时需要申请权限后 才能调用 如 网络请求 获取网络信息等

大家好,欢迎来到IT知识分享网。

README

  1. 先了解应用权限的基本概念,知道:权限级别、授权方式。
  2. 掌握如何申请 user_grant 用户权限。
  3. 业务整合:打开系统权限设置页,开启应用权限。

一. 应用权限概述

1. 注意事项

        在鸿蒙开发中,调用部分 API 时需要申请权限后,才能调用,如:网络请求,获取网络信息等。

        部分 API 调用的时候还会弹窗,如:麦克风(录音)、日历。

        申请应用权限时,需要注意两个关键信息:权限级别 && 授权方式

2. 权限文档截图

权限管理说明

权限管理说明

权限管理说明

二. 应用权限级别

        系统根据应用的APL等级设置进程域和数据域标签,并通过访问控制机制限制应用可访问的数据范围,从而实现在机制上消减应用数据泄露的风险。

        不同APL等级的应用能够申请的权限等级不同,且不同的系统资源(如:通讯录等)或系统能力(如:访问摄像头、麦克风等)受不同的应用权限保护。通过严格的分层权限保护,有效抵御恶意攻击,确保系统安全可靠。

        应用权限管控的详细介绍,请参考应用权限管控概述。

1. 应用APL等级

        应用的等级可以分为以下三个等级,等级依次提高。

APL级别

说明

大白话

normal

默认情况下,应用的APL等级都为normal等级。

都能用

system_basic

该等级的应用服务提供系统基础服务。

要签名证书

system_core

该等级的应用服务提供操作系统核心能力。

仅对系统应用开放

不开放

三. 授权方式概述

根据授权方式的不同,权限类型可分为 system_grant 和 user_grant。

大白话:授权方式为 user_grant 会弹窗,而 system_grant 自动授权。

1. system_grant(系统授权)

        system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。

        如果在应用中申请了system_grant 权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。

2. user_grant(用户授权)

        user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。

        该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。

四. 应用权限列表

在应用权限列表中,分为:

  • 对所有应用开放的权限 – 都能用
  • 允许ACL跨级别申请权限 – 要签名证书

1. 权限分类

        日历、相机、麦克风、位置:权限级别 normal 所有应用都能用,但授权方式为 user_grant 需弹窗授权。

        照片、通讯录:属于跨级权限,需要通过应用市场(AGC)申请签名证书,开发阶段用自动签名即可。

        通知:其他权限。

2. 申请目标权限流程图

权限管理说明

五. 申请 user_grant 用户授权

以日历权限举例,相机、麦克风、位置的权限同理。

1. 配置声明权限

        在 module.json5 中添加权限说明

        注意:权限为 user_grant 时,还需添加授权原因。

{ "module": { "requestPermissions": [ { // 允许应用获取数据网络信息 "name": "ohos.permission.GET_NETWORK_INFO" }, // 日历 { "name": "ohos.permission.READ_CALENDAR", "reason": '$string:permission_reason_calendar', "usedScene": {} }, { "name": "ohos.permission.WRITE_CALENDAR", "reason": '$string:permission_reason_calendar', "usedScene": {} }, ], }

        添加 reason 权限使用理由。

        当申请的权限为 user_grant 权限时必填,并且需要进行多语种适配。

        参考句式:用于某事,如:(麦克风)用于录制加密视频和音频。

权限管理说明

{ "string": [ { "name": "permission_reason_calendar", "value": "用于清理过期日程,诈骗日程" } ] }

2. 检查当前是否已经授权

// 检查授权结果 checkPermissions(permissions: Permissions[]) { // 程序访问控制管理 const atManager = abilityAccessCtrl.createAtManager(); // 获取 bundle 信息 const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION) // 提取 tokenID 标识 const tokenID = bundleInfo.appInfo.accessTokenId; // 校验应用是否被授予权限 const authResults = permissions.map((permission) => atManager.checkAccessTokenSync(tokenID, permission)) // 返回是否已授权结果 return authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) }

3. 动态向用户申请授权

        注意:应用首次申请时才会弹窗。

// 拉起弹框请求用户授权 async requestPermissions(permissions: Permissions[]) { // 程序访问控制管理 const atManager = abilityAccessCtrl.createAtManager(); // 拉起弹框请求用户授权 const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissions) // 相应请求权限的结果 return grantStatus.authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) }

4. 处理授权结果

        注意:如果用户在弹窗中拒绝授权,再次调用 将没有任何反应。

        需要引导用户在系统设置页中开启应用权限。

// 打开系统设置的权限管理页 openPermissionSettingsPage() { // 获取上下文 const context = getContext() as common.UIAbilityContext // 获取包信息 const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION) // 打开系统设置页 context.startAbility({ bundleName: 'com.huawei.hmos.settings', abilityName: 'com.huawei.hmos.settings.MainAbility', uri: 'application_info_entry', parameters: { // 按照包名打开对应设置页 pushParams: bundleInfo.name } }) }

 5. 相机、麦克风、位置

        所有 授权方式为 user_grant 的权限都同理。

        在 module.json5 中添加权限说明

{ "module": { "requestPermissions": [ { // 允许应用获取数据网络信息 "name": "ohos.permission.GET_NETWORK_INFO" }, // 日历 { "name": "ohos.permission.READ_CALENDAR", "reason": '$string:permission_reason_calendar', "usedScene": {} }, { "name": "ohos.permission.WRITE_CALENDAR", "reason": '$string:permission_reason_calendar', "usedScene": {} }, // 相机 { "name": "ohos.permission.CAMERA", "reason": '$string:permission_reason_camera', "usedScene": {} }, // 麦克风 { "name": "ohos.permission.MICROPHONE", "reason": '$string:permission_reason_microphone', "usedScene": {} }, // 位置信息 { "name": "ohos.permission.APPROXIMATELY_LOCATION", "reason": '$string:permission_reason_location', "usedScene": {} }, { "name": "ohos.permission.LOCATION", "reason": '$string:permission_reason_location', "usedScene": {} }, ], }

        添加 reason 权限使用理由。

        当申请的权限为 user_grant 权限时必填,并且需要进行多语种适配。

        参考句式:用于某事,如:(麦克风)用于录制加密视频和音频。

权限管理说明

        …省略

六. 权限管理封装

由于 检查授权,动态申请授权,处理授权结果 逻辑都是相同的,我们通过 class 类把功能封装,方便复用。

1. 基本结构

        新建文件:src/main/ets/manager/PermissionManager.ets

import { Permissions } from '@kit.AbilityKit'; class PermissionManager { // 检查是否授权 checkPermissions(permissions: Permissions[]) { } // 动态申请授权(首次弹窗申请) async requestPermissions(permissions: Permissions[]) { } // 打开系统设置的权限管理页(处理授权结果) openPermissionSettingsPage() { } } // 导出 Manager export const permissionManager = new PermissionManager()

2. 封装参考

import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit'; class PermissionManager { // 检查是否授权 checkPermissions(permissions: Permissions[]) { // 程序访问控制管理 const atManager = abilityAccessCtrl.createAtManager(); // 获取 bundle 信息 const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION) // 提取 tokenID 标识 const tokenID = bundleInfo.appInfo.accessTokenId // 校验应用是否被授予权限 const authResults = permissions.map((item) => atManager.checkAccessTokenSync(tokenID, item)) // 返回是否已授权结果 return authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) } // 动态申请授权(首次弹窗申请) async requestPermissions(permissions: Permissions[]) { // 程序访问控制管理 const atManager = abilityAccessCtrl.createAtManager(); // 拉起弹框请求用户授权 const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissions) // 获取请求权限的结果 const isAuth = grantStatus.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) // 返回 Promise 授权结果 return isAuth ? Promise.resolve(true) : Promise.reject(false) } // 打开系统设置的权限管理页(处理授权结果) openPermissionSettingsPage() { // 获取上下文 const context = getContext() as common.UIAbilityContext // 获取包信息 const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION) // 打开系统设置页 context.startAbility({ bundleName: 'com.huawei.hmos.settings', abilityName: 'com.huawei.hmos.settings.MainAbility', uri: 'application_info_entry', parameters: { // 按照包名打开对应设置页 pushParams: bundleInfo.name } }) } } export const permissionManager = new PermissionManager()

七. 跨级别申请的权限

1. 跨级别权限常见问题

在 module.json5 文件中,如果添加的权限为 ACL使能:true,在编译时会报错,如:通讯录、照片。

  • ohos.permission.READ_CONTACTS
  • ohos.permission.WRITE_CONTACTS
  • ohos.permission.READ_IMAGEVIDEO
  • ohos.permission.WRITE_IMAGEVIDEO

2. ACL权限

  • 访问控制列表ACL(Access Control List)提供了解决低等级应用访问高等级权限问题的特殊渠道。
  • 从 DevEco Studio 4.0 Release 版本起,支持在调测阶段自动签名快速申请ACL权限

API版本(compileSdkVersion)

支持的ACL权限

API Version > 10

  • ohos.permission.READ_CONTACTS
  • ohos.permission.WRITE_CONTACTS
  • ohos.permission.READ_AUDIO
  • ohos.permission.WRITE_AUDIO
  • ohos.permission.READ_IMAGEVIDEO
  • ohos.permission.WRITE_IMAGEVIDEO
  • ohos.permission.SYSTEM_FLOAT_WINDOW
  • ohos.permission.READ_PASTEBOARD
  • ohos.permission.ACCESS_DDK_USB
  • ohos.permission.ACCESS_DDK_HID

3. 自动签名步骤

        确保已连接真机或模拟器。

权限管理说明

        登录华为帐号后,勾选“Automatically generate signature”,即可完成签名。

权限管理说明

        温馨提示:

        项目要上线时,调用 ACL 权限需要手动签名,生成密钥和证书请求文件。

        由于流程和步骤较多,在后续项目上线时再详细讲解到。

        当下先使用自动签名方式调用 ACL 权限。

        在 module.json5 中添加权限

{ "module": { "requestPermissions": [ // ... // 通讯录 { "name": "ohos.permission.READ_CONTACTS", "reason": '$string:permission_reason_contact', "usedScene": {} }, { "name": "ohos.permission.WRITE_CONTACTS", "reason": '$string:permission_reason_contact', "usedScene": {} }, // 照片 { "name": "ohos.permission.READ_IMAGEVIDEO", "reason": "$string:permission_reason_imageVideo", "usedScene": {} }, { "name": "ohos.permission.WRITE_IMAGEVIDEO", "reason": "$string:permission_reason_imageVideo", "usedScene": {} }, ], } }

        添加 reason 权限使用理由。

        当申请的权限为 user_grant 权限时必填,并且需要进行多语种适配。

        参考句式:用于某事,如:(麦克风)用于录制加密视频和音频。

权限管理说明

        复用封装的权限管理

4. 自动签名常见错误

4.1 Windows 系统时间问题

        问题:系统时间不对

权限管理说明

        解决办法:同步系统时间后,重新签名。

权限管理说明

4.2 Mac 系统签名问题

问题:Mac 电脑在签名时 DevEco Studio 报错,无法签名成功。

解决方案:删除 /Users/你的用户名/.ohos/config 文件夹下的所有文件,重新签名,重新生成。

权限管理说明

八. 通知授权

        应用需要获取用户授权才能发送通知。

        在通知发布前调用requestEnableNotification()方法,弹窗让用户选择是否允许发送通知,后续再次调用requestEnableNotification()方法时,则不再弹窗。

1. 接口说明

接口名

描述

isNotificationEnabled():Promise<boolean>

查询通知是否授权。

requestEnableNotification(callback: AsyncCallback<void>): void

请求发送通知的许可,第一次调用会弹窗让用户选择。

2. 开发步骤

        2.1 导入 NotificationManager 模块。

        2.2 请求通知授权。

        2.3 发送通知。

@State isNotificationEnabled: boolean = false // 更新授权状态 async updatePermissionState() { // 是否开启通知 this.isNotificationEnabled = await notificationManager.isNotificationEnabled() } build(){ if (this.isNotificationEnabled) { Text('已开启') .fontSize(14) .fontColor($r('app.color.brand')) } else { Toggle({ type: ToggleType.Switch, isOn: this.isNotificationEnabled }) .onChange(async () => { try { // 授权弹窗 await notificationManager.requestEnableNotification() } catch (error) { // 打开设置页 } // 更新所有权限授权状态 this.updatePermissionState() }) } }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/128826.html

(0)
上一篇 2025-08-28 20:10
下一篇 2025-08-28 20:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信