本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、Camera Kit

Camera Kit(相机服务)提供了相机开发的接口:

  • 访问和操作相机硬件

  • 实现预览、拍照和录像等基础操作

  • 通过接口组合完成更多操作(控制闪光灯、曝光时间、对焦等)

开发场景

场景 说明
相机应用开发 开发独立的相机应用
应用内相机模块 在应用中嵌入相机功能
快速拍摄 使用CameraPicker拉起系统相机

提示:如果仅是需要拉起系统相机拍摄一张照片、录制一段视频,可直接使用CameraPicker,无需申请相机权限。

二、相机开发模型

2.1 工作流程三部分

相机应用开发的工作流程可概括为三部分:

┌─────────────────────────────────────────────────────────┐
│                     相机应用                              │
├─────────────────────────────────────────────────────────┤
│  1. 相机设备      │  2. 相机会话管理  │  3. 相机输出管理   │
│  (相机输入流)    │  (配置参数)     │  (预览/拍照/录像) │
└─────────────────────────────────────────────────────────┘

2.2 各模块

模块 功能 说明
相机设备 相机输入流 选择合适的相机镜头(前置/后置)进行拍摄
相机会话管理 配置参数 配置闪光灯、曝光时间、对焦和调焦等参数
相机输出管理 输出配置 将图像内容以预览流、拍照流或视频流输出

2.3 数据流转流程

相机设备采集数据
    ↓
图像信号处理器(ISP)处理
    ↓
相机HDI接口(硬件设备接口)
    ↓
缓存队列传递
    ↓
上层应用(预览/拍照/录像)

三、相机开发所需权限

3.1 权限清单

权限 说明 必需性
ohos.permission.CAMERA 相机权限,访问相机硬件 必需
ohos.permission.MICROPHONE 麦克风权限,录制音频时需申请 录制音视频时必需
ohos.permission.MEDIA_LOCATION 地理位置信息,照片/视频显示位置时需申请 需要位置信息时必需

3.2 权限申请原则

以上权限均需要:

  1. 配置文件权限声明

  2. 通过弹窗向用户申请授权

3.3 替代方案建议

需求 推荐方案 说明
读取图片/视频文件 媒体库Picker 优先使用PhotoViewPicker选择媒体资源
保存图片/视频文件 安全控件 优先使用SaveButton安全控件保存媒体资源

3.4 受限权限说明

仅当应用需要克隆、备份或同步用户公共目录的图片、视频类文件时,可申请以下受限权限:

权限 说明
ohos.permission.READ_IMAGEVIDEO 读取图片视频文件
ohos.permission.WRITE_IMAGEVIDEO 写入图片视频文件

注意:受限权限需要通过AGC审核后才能使用。为避免应用上架申请被驳回,应优先使用Picker/控件等替代方案,仅少量符合特殊场景的应用被允许申请受限权限。

四、权限申请代码示例

4.1 声明权限(module.json5)

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.CAMERA",
        "reason": "$string:camera_permission_reason",
        "usedScene": {
          "abilities": ["EntryAbility"],
          "when": "inuse"
        }
      },
      {
        "name": "ohos.permission.MICROPHONE",
        "reason": "$string:microphone_permission_reason",
        "usedScene": {
          "abilities": ["EntryAbility"],
          "when": "inuse"
        }
      }
    ]
  }
}

4.2 动态申请权限

import { abilityAccessCtrl, common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

async function requestCameraPermission() {
    const permissions: Array<string> = [
        'ohos.permission.CAMERA',
        'ohos.permission.MICROPHONE'
    ];
    
    let atManager = abilityAccessCtrl.createAtManager();
    let context = getContext(this) as common.UIAbilityContext;
    
    try {
        let result = await atManager.requestPermissionsFromUser(context, permissions);
        let grantStatus = result.authResults;
        
        for (let i = 0; i < grantStatus.length; i++) {
            if (grantStatus[i] === 0) {
                console.info(`${permissions[i]} 授权成功`);
            } else {
                console.warn(`${permissions[i]} 授权失败`);
            }
        }
    } catch (error) {
        let err = error as BusinessError;
        console.error(`权限申请失败: ${err.code}, ${err.message}`);
    }
}

五、CameraPicker快速方案

如果仅需要拉起系统相机拍摄一张照片、录制一段视频,可直接使用CameraPicker无需申请相机权限,直接拉起系统相机完成拍摄。

使用场景

场景 说明
快速拍照 拉起系统相机拍照后返回
快速录像 拉起系统相机录像后返回
无需预览 不需要自定义相机预览界面

优势

  • 无需申请权限:无需声明CAMERA权限

  • 开发简单:几行代码即可完成

  • 用户体验统一:使用系统相机界面

   鸿蒙相机开发可通过Camera Kit实现自定义相机界面(需申请CAMERA权限),也可通过CameraPicker快速拉起系统相机(无需权限),读写媒体文件时优先使用Picker/安全控件替代受限权限。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐