
摘要
在 HarmonyOS NEXT 中开发原生应用时,很多功能都涉及调用系统设备能力,比如摄像头、定位、传感器等。本文将以摄像头调用为例,介绍如何通过 ArkTS 编写可运行的预览、拍照、扫码等功能模块。文章会包含完整代码、关键权限说明、使用组件绑定预览画面的方式,以及多个实际场景的代码示例和讲解,适合鸿蒙新手开发者快速上手。
引言
随着设备类型的多样化(手机、手表、智能屏、车机等),对系统能力的调用已经是鸿蒙开发中的基本操作。无论是开发扫码登录的小程序,还是做远程视频采集的设备,摄像头都是核心入口之一。
ArkTS 作为鸿蒙原生开发语言,提供了清晰的 API 接口和模块化能力,让开发者可以快速接入并调用硬件功能。
调用摄像头进行视频预览
模块准备与权限声明
在开发摄像头功能之前,首先要确保应用配置中申请了摄像头权限。在 module.json5
中添加如下内容:
json
"requestPermissions": [
{
"name": "ohos.permission.CAMERA"
}
],
"deviceCapabilities": [
"camera"
]
基础流程与代码实现
步骤解析
鸿蒙调用摄像头的一般流程如下:
- 获取摄像头管理器(CameraManager)
- 获取摄像头 ID(默认前/后置)
- 打开摄像头设备
- 创建输入流(CameraInput)
- 创建预览输出(PreviewOutput)
- 启动预览
完整代码 + 逐行解释
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_MEDIA
或ohos.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 绑定预览画面
- 拍照、扫码、监控等多个实际场景
未来你可以用类似方式继续探索蓝牙、麦克风、传感器等设备能力,构建更复杂、更智能的应用。