第15章_HarmonyOs开发图解之 相机

发布时间:2026/7/28 19:18:29

第15章_HarmonyOs开发图解之 相机 第15章 HarmonyOs开发图解之 相机HarmonyOS 学习系统 | 阶段三高级深耕期学习目标序号能力1掌握 HarmonyOS 相机开发的核心流程获取设备 - 配置 - 预览 - 拍照2理解 CameraKit、Camera、FrameConfig 三层架构3能够实现预览、拍照、连拍和录像功能核心图解内容讲解15.1 相机开发概述HarmonyOS 的相机开发基于三层架构CameraKit选角导演选择摄像头 -Camera摄影机实际拍摄设备 -FrameConfig拍摄脚本定义预览/拍照/连拍。Surface 则是监视器屏幕决定了画面显示在哪里。生活化类比相机开发就像指挥一场拍摄CameraKit是选角导演选择哪个摄像头——前置/后置Camera是摄影机实际的拍摄设备FrameConfig是拍摄脚本定义拍什么类型——预览/拍照/连拍Surface是监视器屏幕画面显示在哪里。流程是先选角获取相机 ID再架设摄影机createCamera然后排练configure 配置 Surface最后开拍triggerLoopingCapture 预览 / triggerSingleCapture 拍照。15.2 相机开发核心流程// 1. 获取相机设备列表CameraKitcameraKitCameraKit.getInstance(context);String[]cameraIdscameraKit.getCameraIds();// 2. 创建相机实例cameraKit.createCamera(cameraIds[0],cameraStateCallback,eventHandler);// 3. 相机创建成功回调中配置 SurfaceOverridepublicvoidonCreated(Cameracamera){CameraConfig.BuilderbuildernewCameraConfig.Builder();builder.addSurface(previewSurface);// 预览 Surfacebuilder.addSurface(pictureSurface);// 拍照 Surfacebuilder.setFrameStateCallback(frameStateCallback,eventHandler);camera.configure(builder.build());}// 4. 配置完成回调中开始预览OverridepublicvoidonConfigured(Cameracamera){FrameConfigpreviewConfigcamera.getFrameConfigBuilder(FrameConfig.FRAME_CONFIG_PREVIEW).build();camera.triggerLoopingCapture(previewConfig);// 开始预览}// 5. 拍照FrameConfigpictureConfigcamera.getFrameConfigBuilder(FrameConfig.FRAME_CONFIG_PICTURE).build();camera.triggerSingleCapture(pictureConfig);15.3 相机能力查询不同设备的相机能力差异极大开发前务必查询// 查询相机支持的分辨率和帧率CameraAbilityabilitycameraKit.getCameraAbility(cameraIds[0]);Size[]sizesability.getSupportedSizes(FrameConfig.FRAME_CONFIG_PREVIEW);for(Sizesize:sizes){HiLog.info(TAG,支持预览分辨率: size.widthxsize.height);}15.4 相机权限清单权限用途必要性ohos.permission.CAMERA使用相机硬件必选ohos.permission.MICROPHONE录像时录音可选ohos.permission.WRITE_MEDIA保存照片/视频到外部存储可选ohos.permission.MEDIA_LOCATION保存位置信息到照片可选代码速查卡API功能示例CameraKit.getInstance(ctx)获取 CameraKit 实例CameraKit.getInstance(context)getCameraIds()获取相机 ID 列表cameraKit.getCameraIds()createCamera(id, cb, handler)创建相机实例cameraKit.createCamera(ids[0], cb, handler)configure(config)配置相机 Surfacecamera.configure(config)triggerLoopingCapture(fc)开始预览循环捕获camera.triggerLoopingCapture(previewConfig)triggerSingleCapture(fc)拍照单次捕获camera.triggerSingleCapture(pictureConfig)getCameraAbility(id)查询相机能力cameraKit.getCameraAbility(cameraId)release()释放相机资源camera.release()与 Android/iOS 对比特性HarmonyOSAndroidiOS相机 APICameraKit CameraCamera2 API / CameraXAVFoundation (AVCaptureSession)预览方式SurfaceProvider SurfaceSurfaceView / PreviewViewAVCaptureVideoPreviewLayer拍照方式triggerSingleCaptureImageReader CaptureRequestAVCapturePhotoOutput相机选择cameraIds[0]/[1]CameraCharacteristics.LENS_FACINGAVCaptureDevice.default()能力查询getCameraAbility()CameraCharacteristicsAVCaptureDevice.DeviceType⚠️ 踩坑回忆录为什么相机一直打开失败我写了一个带相机的 App启动时直接调用CameraKit.getInstance()结果总是返回 null。排查后发现——另一个相机 App 还在后台运行HarmonyOS 规定同一时刻只有一个相机应用能运行因为摄像头是独占硬件资源。正确做法是先检查相机是否可用提示用户关闭其他相机 App或者使用try-catch捕获异常并给出友好提示。另外不同设备的相机能力差异极大。我曾在 A 设备上完美运行的 4K 预览在 B 设备上直接黑屏——因为 B 设备最高只支持 1080P 预览。开发前务必用CameraKit.getCameraAbility()查询支持的分辨率和帧率不要硬编码。必做实操任务序号任务难度1实现相机预览功能在 SurfaceProvider 上显示实时画面中2实现拍照功能将照片保存到本地中3实现前后摄像头切换中4查询设备相机能力并展示支持的分辨率列表低5实现连拍功能triggerBurstCapture高学习检查清单能说出相机开发的核心流程CameraKit - Camera - FrameConfig能实现相机预览并在 SurfaceProvider 上显示能实现拍照并保存照片知道相机是独占资源需要处理被占用的情况能使用 getCameraAbility 查询设备相机能力能正确声明相机相关权限能在 Ability 生命周期中正确释放相机资源理解 FRAME_CONFIG_PREVIEW 和 FRAME_CONFIG_PICTURE 的区别进阶方向结合第 13 章视频能力实现视频录制 App实现自定义相机 UI手动对焦、曝光调节、滤镜等探索相机与 AI 能力的结合人脸检测、扫码等理解 FRAME_CONFIG_PREVIEW 和 FRAME_CONFIG_PICTURE 的区别进阶方向结合第 13 章视频能力实现视频录制 App实现自定义相机 UI手动对焦、曝光调节、滤镜等探索相机与 AI 能力的结合人脸检测、扫码等

相关新闻