一、HarmonyOS 5 权限管理概述

在 HarmonyOS 5 应用开发中,权限管理是保障用户隐私安全的核心机制。当应用需要访问系统敏感资源(如相机、位置、麦克风等)时,必须遵循"最小权限原则"并经过用户明确授权。HarmonyOS 5 的权限体系主要分为两类:

  1. **普通权限 (normal)**:系统自动授予,无需用户操作
  2. **敏感权限 (system_grant/user_grant)**:需要显式申请,部分由系统自动授予,部分需用户手动授权

本文将重点介绍需要用户授权的敏感权限申请流程,并提供完整的 ArkTS 实现示例。

二、权限申请开发流程

2.1 声明权限

首先在 module.json5 配置文件中声明需要的权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.CAMERA",
        "reason": "需要拍照功能",
        "usedScene": {
          "abilities": ["MainAbility"],
          "when": "always"
        }
      },
      {
        "name": "ohos.permission.MICROPHONE",
        "reason": "需要录制音频",
        "usedScene": {
          "abilities": ["MainAbility"],
          "when": "always"
        }
      }
    ]
  }
}

2.2 检查权限状态

在代码中检查当前是否已获得授权:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

async function checkPermission(permission: string): Promise<boolean> {
  try {
    let atManager = abilityAccessCtrl.createAtManager();
    let grantStatus = await atManager.checkAccessToken(
      abilityAccessCtrl.AccessTokenID.INVALID_TOKEN,
      permission
    );
    return grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;
  } catch (err) {
    console.error(`checkPermission failed, code is ${err.code}, message is ${err.message}`);
    return false;
  }
}

2.3 请求权限

如果未授权,则需要向用户请求权限:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import promptAction from '@ohos.promptAction';

async function requestPermission(context: common.Context, permission: string): Promise<boolean> {
  try {
    let atManager = abilityAccessCtrl.createAtManager();
    await atManager.requestPermissionsFromUser(
      context,
      [permission]
    );
    
    // 再次检查权限状态
    return await checkPermission(permission);
  } catch (err) {
    console.error(`requestPermission failed, code is ${err.code}, message is ${err.message}`);
    promptAction.showToast({ message: '权限申请失败: ' + err.message });
    return false;
  }
}

三、完整示例:相机权限申请

下面是一个完整的相机权限申请与使用的 ArkUI 示例:

@Entry
@Component
struct CameraPermissionExample {
  @State hasCameraPermission: boolean = false
  @State cameraStatus: string = '未授权'
  private context = getContext(this) as common.UIAbilityContext

  // 检查并申请相机权限
  async requestCameraPermission() {
    // 先检查是否已有权限
    const isGranted = await checkPermission('ohos.permission.CAMERA')
    if (isGranted) {
      this.hasCameraPermission = true
      this.cameraStatus = '已授权'
      promptAction.showToast({ message: '已有相机权限' })
      return
    }

    // 请求权限
    const result = await requestPermission(this.context, 'ohos.permission.CAMERA')
    this.hasCameraPermission = result
    this.cameraStatus = result ? '已授权' : '未授权'
    
    if (!result) {
      promptAction.showToast({ message: '用户拒绝了相机权限' })
    }
  }

  build() {
    Column() {
      Text('相机权限状态: ' + this.cameraStatus)
        .fontSize(20)
        .margin(10)

      Button('申请相机权限')
        .width(200)
        .height(50)
        .margin(10)
        .onClick(() => {
          this.requestCameraPermission()
        })

      if (this.hasCameraPermission) {
        Button('打开相机')
          .width(200)
          .height(50)
          .margin(10)
          .backgroundColor('#007DFF')
          .onClick(() => {
            // 这里可以添加打开相机的逻辑
            promptAction.showToast({ message: '相机已打开' })
          })
      }
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

四、最佳实践建议

  1. 按需申请:仅在真正需要时才申请权限,避免应用启动时一次性申请所有权限
  2. 解释原因:在 module.json5 中清晰说明权限用途 (reason 字段)
  3. 优雅降级:当权限被拒绝时,应用应能继续运行核心功能
  4. 权限检查:关键操作前都应检查权限状态,因为用户可能随时更改权限设置
  5. 权限组管理:HarmonyOS 5 将权限分组管理,授予组内某个权限会自动授予同组其他权限

五、总结

HarmonyOS 5 的权限系统设计既保护了用户隐私,又为开发者提供了清晰的API接口。通过本文的示例代码,开发者可以快速掌握权限申请的核心流程,并在实际开发中构建更安全、用户友好的应用。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐