鸿蒙三方库 | harmony-utils之PermissionUtil运行时权限申请详解
·
前言
运行时权限是HarmonyOS安全体系的重要组成部分,敏感权限需要用户明确授权。@pura/harmony-utils 的 PermissionUtil 封装了权限申请和查询方法,简化了权限管理流程。本文将从API说明、代码实战、进阶用法、常见问题等多个维度进行全面讲解,帮助开发者快速掌握并应用到实际项目中。

一、PermissionUtil核心API
PermissionUtil 提供了以下权限管理方法:
| 方法 | 说明 | 参数 | 使用场景 |
|---|---|---|---|
checkPermission(permission) |
检查权限状态 | string | 权限状态查询 |
requestPermission(permission) |
请求权限 | string | 单个权限申请 |
requestPermissions(permissions) |
批量请求权限 | string[] | 多权限申请 |
1.1 核心特性
- 简洁易用:封装复杂API为一行调用,降低使用门槛
- 类型安全:完整的TypeScript类型定义,编译期即可发现错误
- 异常处理:内置异常捕获机制,避免运行时崩溃
- 批量支持:支持单个和批量权限申请
1.2 常见运行时权限
| 权限 | 说明 | 类型 |
|---|---|---|
| ohos.permission.CAMERA | 相机 | user_grant |
| ohos.permission.LOCATION | 精确定位 | user_grant |
| ohos.permission.APPROXIMATELY_LOCATION | 粗略定位 | user_grant |
| ohos.permission.MICROPHONE | 麦克风 | user_grant |
二、完整使用步骤
2.1 安装依赖
ohpm install @pura/harmony-utils
2.2 检查权限
import { PermissionUtil } from '@pura/harmony-utils';
Button('检查相机权限')
.width('100%')
.onClick(() => {
try {
let granted = PermissionUtil.checkPermission('ohos.permission.CAMERA');
this.result = `相机权限: ${granted ? '已授权 ✅' : '未授权 ❌'}`;
} catch (e) {
this.result = '异常: ' + e;
}
})
2.3 请求权限
Button('请求相机权限')
.width('100%')
.onClick(async () => {
try {
let result = await PermissionUtil.requestPermission('ohos.permission.CAMERA');
this.result = `请求结果: ${result ? '已授权 ✅' : '被拒绝 ❌'}`;
} catch (e) {
this.result = '异常: ' + e;
}
})

三、完整页面示例
import { PermissionUtil } from '@pura/harmony-utils';
@Entry
@Component
struct PermissionDemo {
@State result: string = '';
build() {
Column({ space: 12 }) {
Button('检查位置权限').width('100%').onClick(() => {
try {
let granted = PermissionUtil.checkPermission('ohos.permission.APPROXIMATELY_LOCATION');
this.result = `位置权限: ${granted ? '已授权' : '未授权'}`;
} catch (e) { this.result = '异常: ' + e; }
});
Button('请求位置权限').width('100%').onClick(async () => {
try {
let result = await PermissionUtil.requestPermission('ohos.permission.APPROXIMATELY_LOCATION');
this.result = `结果: ${result ? '已授权' : '被拒绝'}`;
} catch (e) { this.result = '异常: ' + e; }
});
Text(this.result).fontSize(14).fontColor('#333333')
}
.padding(16)
}
}
四、进阶用法
4.1 权限申请流程封装
import { PermissionUtil, ToastUtil } from '@pura/harmony-utils';
async function ensurePermission(permission: string): Promise<boolean> {
if (PermissionUtil.checkPermission(permission)) return true;
let result = await PermissionUtil.requestPermission(permission);
if (!result) {
ToastUtil.showToast('需要权限才能使用此功能');
}
return result;
}
4.2 批量权限申请
Button('申请多媒体权限')
.width('100%')
.onClick(async () => {
try {
let results = await PermissionUtil.requestPermissions([
'ohos.permission.CAMERA',
'ohos.permission.MICROPHONE'
]);
this.result = `批量申请完成`;
} catch (e) { this.result = '异常: ' + e; }
})
五、注意事项
- 权限声明:需在module.json5中声明所需权限
- user_grant权限:需要用户手动授权的权限必须使用运行时申请
- 权限说明:建议在请求前向用户说明权限用途
- 初始化依赖:使用前需确保
AppUtil.init()已调用 - 拒绝处理:用户拒绝后应提供替代方案或引导设置
六、常见问题
Q1: 请求权限后总是被拒绝?
检查module.json5中是否声明了对应权限,未声明的权限无法通过运行时申请获取。
Q2: 用户拒绝后如何再次申请?
可以引导用户到系统设置中手动开启权限,或使用AlertDialog说明权限用途后再次请求。
Q3: checkPermission和requestPermission的区别?
checkPermission 仅查询当前状态不弹窗,requestPermission 会弹出授权对话框。
Q4: 批量申请权限时部分被拒绝怎么办?
requestPermissions 会返回每个权限的授权结果,开发者可以逐个检查并处理。


总结
PermissionUtil 简化了HarmonyOS的运行时权限管理流程,开发者可以轻松检查和请求权限。本文详细介绍了核心API、使用步骤、完整示例、进阶用法以及常见问题的解决方案。合理的权限管理既保障了用户隐私,又确保了应用功能正常运行。
本文基于
@pura/harmony-utils工具库,更多功能请参考官方文档与后续系列文章。
更多推荐


所有评论(0)