一、应用权限概述
注意事项
在鸿蒙开发中,调用部分 API 时需要申请权限后,才能调用,如:网络请求,获取网络信息等。
部分 API 权限调用的时候还会弹窗,如:麦克风、位置、摄像头、相册、传感器(sensor)、日历等。
申请应用权限时,需要注意两个关键信息:
- 权限级别
- 授权方式
权限文档截图
应用权限级别
系统根据应用的APL等级设置进程域和数据域标签,并通过访问控制机制限制应用可访问的数据范围,从而实现在机制上消减应用数据泄露的风险。
不同APL等级的应用能够申请的权限等级不同,且不同的系统资源(如:通讯录等)或系统能力(如:访问摄像头、麦克风等)受不同的应用权限保护。通过严格的分层权限保护,有效抵御恶意攻击,确保系统安全可靠。
应用权限管控的详细介绍,请参考应用权限管控概述。
应用APL等级
应用的等级可以分为以下三个等级,等级依次提高。
APL级别 | 说明 | 大白话 |
normal | 默认情况下,应用的APL等级都为normal等级。 | 都能用 |
system_basic | 该等级的应用服务提供系统基础服务。 | 要签名证书 |
system_core | 该等级的应用服务提供操作系统核心能力。 仅对系统应用开放 | 不开放 |
授权方式概述
根据授权方式的不同,权限类型可分为 system_grant 和 user_grant。
大白话:授权方式为 user_grant 会弹窗,而 system_grant 自动授权。
system_grant(系统授权)
system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。
如果在应用中申请了system_grant 权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。
user_grant(用户授权)
user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。
该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。
申请 user_grant 用户授权
权限管理封装
由于 检查授权,动态申请授权,处理授权结果 逻辑都是相同的,我们通过 class 类把功能封装,方便复用。
基本结构
import { Permissions } from '@kit.AbilityKit';
class PermissionManager {
// 检查是否授权
checkPermissions(permissions: Permissions[]) {
}
// 动态申请授权(首次弹窗申请)
async requestPermissions(permissions: Permissions[]) {
}
// 打开系统设置的权限管理页(处理授权结果)
openPermissionSettingsPage() {
}
}
// 导出 Manager
export const permissionManager = new PermissionManager()
封装参考
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()
跨级别申请的权限
跨级别权限常见问题
在 module.json5 文件中,如果添加的权限为 ACL使能:true,在编译时会报错,如:通讯录、照片。
- ohos.permission.READ_CONTACTS
- ohos.permission.WRITE_CONTACTS
- ohos.permission.READ_IMAGEVIDEO
- ohos.permission.WRITE_IMAGEVIDEO
ACL权限
- 访问控制列表ACL(Access Control List)提供了解决低等级应用访问高等级权限问题的特殊渠道。
- 从 DevEco Studio 4.0 Release 版本起,支持在调测阶段自动签名快速申请ACL权限。
API版本(compileSdkVersion) | 支持的ACL权限 |
API Version > 10 |
|
自动签名步骤
- 确保已连接真机或模拟器。
2.登录华为帐号后,勾选“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": {}
},
],
}
}
2.添加 reason 权限使用理由。
- 当申请的权限为 user_grant 权限时必填,并且需要进行多语种适配。
- 参考句式:用于某事,如:(麦克风)用于录制加密视频和音频。
标签:const,鸿蒙,permission,grant,Next,应用,授权,权限 From: https://blog.csdn.net/xp1870069025/article/details/139370303