前言

运行时权限是HarmonyOS安全体系的重要组成部分,敏感权限需要用户明确授权。@pura/harmony-utilsPermissionUtil 封装了权限申请和查询方法,简化了权限管理流程。本文将从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; }
  })

五、注意事项

  1. 权限声明:需在module.json5中声明所需权限
  2. user_grant权限:需要用户手动授权的权限必须使用运行时申请
  3. 权限说明:建议在请求前向用户说明权限用途
  4. 初始化依赖:使用前需确保 AppUtil.init() 已调用
  5. 拒绝处理:用户拒绝后应提供替代方案或引导设置

六、常见问题

Q1: 请求权限后总是被拒绝?

检查module.json5中是否声明了对应权限,未声明的权限无法通过运行时申请获取。

Q2: 用户拒绝后如何再次申请?

可以引导用户到系统设置中手动开启权限,或使用AlertDialog说明权限用途后再次请求。

Q3: checkPermission和requestPermission的区别?

checkPermission 仅查询当前状态不弹窗,requestPermission 会弹出授权对话框。

Q4: 批量申请权限时部分被拒绝怎么办?

requestPermissions 会返回每个权限的授权结果,开发者可以逐个检查并处理。

在这里插入图片描述
在这里插入图片描述

总结

PermissionUtil 简化了HarmonyOS的运行时权限管理流程,开发者可以轻松检查和请求权限。本文详细介绍了核心API、使用步骤、完整示例、进阶用法以及常见问题的解决方案。合理的权限管理既保障了用户隐私,又确保了应用功能正常运行。

本文基于 @pura/harmony-utils 工具库,更多功能请参考官方文档与后续系列文章。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐