
第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 能力的結合人臉檢測、掃碼等