开发者必看!如何在HarmonyOS中快速调用摄像头功能

摘要

在 HarmonyOS NEXT 中开发原生应用时,很多功能都涉及调用系统设备能力,比如摄像头、定位、传感器等。本文将以摄像头调用为例,介绍如何通过 ArkTS 编写可运行的预览、拍照、扫码等功能模块。文章会包含完整代码、关键权限说明、使用组件绑定预览画面的方式,以及多个实际场景的代码示例和讲解,适合鸿蒙新手开发者快速上手。

引言

随着设备类型的多样化(手机、手表、智能屏、车机等),对系统能力的调用已经是鸿蒙开发中的基本操作。无论是开发扫码登录的小程序,还是做远程视频采集的设备,摄像头都是核心入口之一。

ArkTS 作为鸿蒙原生开发语言,提供了清晰的 API 接口和模块化能力,让开发者可以快速接入并调用硬件功能。

调用摄像头进行视频预览

模块准备与权限声明

在开发摄像头功能之前,首先要确保应用配置中申请了摄像头权限。在 module.json5 中添加如下内容:

json 复制代码
"requestPermissions": [
  {
    "name": "ohos.permission.CAMERA"
  }
],
"deviceCapabilities": [
  "camera"
]

基础流程与代码实现

步骤解析

鸿蒙调用摄像头的一般流程如下:

  1. 获取摄像头管理器(CameraManager)
  2. 获取摄像头 ID(默认前/后置)
  3. 打开摄像头设备
  4. 创建输入流(CameraInput)
  5. 创建预览输出(PreviewOutput)
  6. 启动预览

完整代码 + 逐行解释

ts 复制代码
import camera from '@ohos.multimedia.camera';

let cameraManager = camera.getCameraManager(); // 获取摄像头管理器对象
let cameraDevice;     // 摄像头设备实例
let cameraInput;      // 输入流实例
let previewOutput;    // 输出流实例

// 获取所有可用摄像头ID(可能是前置、后置等)
cameraManager.getSupportedCameras().then((cameraArray) => {
  let cameraId = cameraArray[0]; // 默认使用第一个摄像头(通常为后置)

  // 打开摄像头设备
  cameraManager.openCamera(cameraId).then((device) => {
    cameraDevice = device;

    // 创建输入流(负责采集)
    cameraDevice.createCameraInput().then((input) => {
      cameraInput = input;

      // 创建预览输出流,供界面展示用
      cameraDevice.createPreviewOutput().then((output) => {
        previewOutput = output;

        // 启动采集并将数据流输出到预览中
        cameraDevice.startCapture([cameraInput], [previewOutput]).then(() => {
          console.info("摄像头预览启动成功");
        });
      });
    });
  });
});

如何将预览画面显示在界面上?

ArkTS UI 中的 Surface 控件可以作为摄像头画面承载组件:

ts 复制代码
@Entry
@Component
struct CameraPreviewPage {
  private previewSurface: any;

  build() {
    Column() {
      Text('摄像头预览').fontSize(20)

      // 预览画面绑定 Surface
      Surface({ id: 'cameraPreview' })
        .width('100%')
        .height(400)
        .onLoad((surface) => {
          this.previewSurface = surface;

          // 将 previewOutput 绑定到 UI surface
          if (previewOutput) {
            previewOutput.surface = surface;
          }
        })
    }
  }
}

典型场景应用与实战示例

场景 1:扫码识别功能

用于门禁扫码、App登录、付款二维码识别等。

ts 复制代码
import barcode from '@ohos.barcode'; // 假设已支持该模块

// 在预览输出回调中,监听每帧画面并进行识别
previewOutput.on('frame', (frameData) => {
  barcode.decode(frameData).then((result) => {
    if (result.success) {
      console.log("扫码内容:", result.text);
    }
  });
});

提示:扫码需要额外权限 ohos.permission.READ_MEDIAohos.permission.CAMERA,并配合图像识别框架使用。

场景 2:证件拍照并上传

用于表单提交、人脸认证等业务。

ts 复制代码
cameraDevice.takePhoto().then((photoData) => {
  // photoData 是 Uint8Array 格式的图片数据
  uploadImage(photoData);
});

function uploadImage(data: Uint8Array) {
  // 调用上传服务
  console.info('正在上传图片,长度:', data.length);
}

场景 3:远程视频监控(简版)

结合 WebSocket 或 HTTP 推流,采集预览帧并上传。

ts 复制代码
previewOutput.on('frame', (frameData) => {
  // 将画面帧编码为流数据,然后通过 WebSocket 发送
  sendFrameToServer(frameData);
});

function sendFrameToServer(data: Uint8Array) {
  // 示例发送逻辑
  console.log('发送帧大小:', data.length);
}

QA 常见问题答疑

问:摄像头打不开怎么办?

  • 检查权限是否声明和授权
  • 确保当前设备支持摄像头模块(模拟器部分机型不支持)
  • 检查摄像头是否已被占用

问:怎么切换前后摄像头?

调用 getSupportedCameras() 后遍历摄像头数组,判断 cameraType'front''back',切换即可。

问:拍照保存的照片如何本地持久化?

需要使用文件系统模块 @ohos.file.fs,将图片数据写入本地文件。

总结

鸿蒙系统在调用设备能力方面提供了统一、模块化的 API 接口,配合 ArkTS 语法,开发效率和代码可读性都非常高。本文围绕摄像头进行了完整的演示,涵盖:

  • 权限声明
  • 基本调用流程
  • UI 绑定预览画面
  • 拍照、扫码、监控等多个实际场景

未来你可以用类似方式继续探索蓝牙、麦克风、传感器等设备能力,构建更复杂、更智能的应用。

相关推荐
zhanshuo9 小时前
在鸿蒙里优雅地处理网络错误:从 Demo 到实战案例
harmonyos
zhanshuo9 小时前
在鸿蒙中实现深色/浅色模式切换:从原理到可运行 Demo
harmonyos
whysqwhw14 小时前
鸿蒙分布式投屏
harmonyos
whysqwhw15 小时前
鸿蒙AVSession Kit
harmonyos
whysqwhw17 小时前
鸿蒙各种生命周期
harmonyos
whysqwhw18 小时前
鸿蒙音频编码
harmonyos
whysqwhw18 小时前
鸿蒙音频解码
harmonyos
whysqwhw18 小时前
鸿蒙视频解码
harmonyos
whysqwhw19 小时前
鸿蒙视频编码
harmonyos
ajassi200019 小时前
开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器
华为·开源·harmonyos