圖解之 相機(jī))
第15章 HarmonyOs開發(fā)圖解之 相機(jī)HarmonyOS 學(xué)習(xí)系統(tǒng) | 階段三高級(jí)深耕期學(xué)習(xí)目標(biāo)序號(hào)能力1掌握 HarmonyOS 相機(jī)開發(fā)的核心流程獲取設(shè)備 - 配置 - 預(yù)覽 - 拍照2理解 CameraKit、Camera、FrameConfig 三層架構(gòu)3能夠?qū)崿F(xiàn)預(yù)覽、拍照、連拍和錄像功能核心圖解內(nèi)容講解15.1 相機(jī)開發(fā)概述HarmonyOS 的相機(jī)開發(fā)基于三層架構(gòu)CameraKit選角導(dǎo)演選擇攝像頭 -Camera攝影機(jī)實(shí)際拍攝設(shè)備 -FrameConfig拍攝腳本定義預(yù)覽/拍照/連拍。Surface 則是監(jiān)視器屏幕決定了畫面顯示在哪里。生活化類比相機(jī)開發(fā)就像指揮一場(chǎng)拍攝CameraKit是選角導(dǎo)演選擇哪個(gè)攝像頭——前置/后置Camera是攝影機(jī)實(shí)際的拍攝設(shè)備FrameConfig是拍攝腳本定義拍什么類型——預(yù)覽/拍照/連拍Surface是監(jiān)視器屏幕畫面顯示在哪里。流程是先選角獲取相機(jī) ID再架設(shè)攝影機(jī)createCamera然后排練configure 配置 Surface最后開拍triggerLoopingCapture 預(yù)覽 / triggerSingleCapture 拍照。15.2 相機(jī)開發(fā)核心流程// 1. 獲取相機(jī)設(shè)備列表CameraKitcameraKitCameraKit.getInstance(context);String[]cameraIdscameraKit.getCameraIds();// 2. 創(chuàng)建相機(jī)實(shí)例cameraKit.createCamera(cameraIds[0],cameraStateCallback,eventHandler);// 3. 相機(jī)創(chuàng)建成功回調(diào)中配置 SurfaceOverridepublicvoidonCreated(Cameracamera){CameraConfig.BuilderbuildernewCameraConfig.Builder();builder.addSurface(previewSurface);// 預(yù)覽 Surfacebuilder.addSurface(pictureSurface);// 拍照 Surfacebuilder.setFrameStateCallback(frameStateCallback,eventHandler);camera.configure(builder.build());}// 4. 配置完成回調(diào)中開始預(yù)覽OverridepublicvoidonConfigured(Cameracamera){FrameConfigpreviewConfigcamera.getFrameConfigBuilder(FrameConfig.FRAME_CONFIG_PREVIEW).build();camera.triggerLoopingCapture(previewConfig);// 開始預(yù)覽}// 5. 拍照FrameConfigpictureConfigcamera.getFrameConfigBuilder(FrameConfig.FRAME_CONFIG_PICTURE).build();camera.triggerSingleCapture(pictureConfig);15.3 相機(jī)能力查詢不同設(shè)備的相機(jī)能力差異極大開發(fā)前務(wù)必查詢// 查詢相機(jī)支持的分辨率和幀率CameraAbilityabilitycameraKit.getCameraAbility(cameraIds[0]);Size[]sizesability.getSupportedSizes(FrameConfig.FRAME_CONFIG_PREVIEW);for(Sizesize:sizes){HiLog.info(TAG,支持預(yù)覽分辨率: size.widthxsize.height);}15.4 相機(jī)權(quán)限清單權(quán)限用途必要性ohos.permission.CAMERA使用相機(jī)硬件必選ohos.permission.MICROPHONE錄像時(shí)錄音可選ohos.permission.WRITE_MEDIA保存照片/視頻到外部存儲(chǔ)可選ohos.permission.MEDIA_LOCATION保存位置信息到照片可選代碼速查卡API功能示例CameraKit.getInstance(ctx)獲取 CameraKit 實(shí)例CameraKit.getInstance(context)getCameraIds()獲取相機(jī) ID 列表cameraKit.getCameraIds()createCamera(id, cb, handler)創(chuàng)建相機(jī)實(shí)例cameraKit.createCamera(ids[0], cb, handler)configure(config)配置相機(jī) Surfacecamera.configure(config)triggerLoopingCapture(fc)開始預(yù)覽循環(huán)捕獲camera.triggerLoopingCapture(previewConfig)triggerSingleCapture(fc)拍照單次捕獲camera.triggerSingleCapture(pictureConfig)getCameraAbility(id)查詢相機(jī)能力cameraKit.getCameraAbility(cameraId)release()釋放相機(jī)資源camera.release()與 Android/iOS 對(duì)比特性HarmonyOSAndroidiOS相機(jī) APICameraKit CameraCamera2 API / CameraXAVFoundation (AVCaptureSession)預(yù)覽方式SurfaceProvider SurfaceSurfaceView / PreviewViewAVCaptureVideoPreviewLayer拍照方式triggerSingleCaptureImageReader CaptureRequestAVCapturePhotoOutput相機(jī)選擇cameraIds[0]/[1]CameraCharacteristics.LENS_FACINGAVCaptureDevice.default()能力查詢getCameraAbility()CameraCharacteristicsAVCaptureDevice.DeviceType?? 踩坑回憶錄為什么相機(jī)一直打開失敗我寫了一個(gè)帶相機(jī)的 App啟動(dòng)時(shí)直接調(diào)用CameraKit.getInstance()結(jié)果總是返回 null。排查后發(fā)現(xiàn)——另一個(gè)相機(jī) App 還在后臺(tái)運(yùn)行HarmonyOS 規(guī)定同一時(shí)刻只有一個(gè)相機(jī)應(yīng)用能運(yùn)行因?yàn)閿z像頭是獨(dú)占硬件資源。正確做法是先檢查相機(jī)是否可用提示用戶關(guān)閉其他相機(jī) App或者使用try-catch捕獲異常并給出友好提示。另外不同設(shè)備的相機(jī)能力差異極大。我曾在 A 設(shè)備上完美運(yùn)行的 4K 預(yù)覽在 B 設(shè)備上直接黑屏——因?yàn)?B 設(shè)備最高只支持 1080P 預(yù)覽。開發(fā)前務(wù)必用CameraKit.getCameraAbility()查詢支持的分辨率和幀率不要硬編碼。必做實(shí)操任務(wù)序號(hào)任務(wù)難度1實(shí)現(xiàn)相機(jī)預(yù)覽功能在 SurfaceProvider 上顯示實(shí)時(shí)畫面中2實(shí)現(xiàn)拍照功能將照片保存到本地中3實(shí)現(xiàn)前后攝像頭切換中4查詢?cè)O(shè)備相機(jī)能力并展示支持的分辨率列表低5實(shí)現(xiàn)連拍功能triggerBurstCapture高學(xué)習(xí)檢查清單能說出相機(jī)開發(fā)的核心流程CameraKit - Camera - FrameConfig能實(shí)現(xiàn)相機(jī)預(yù)覽并在 SurfaceProvider 上顯示能實(shí)現(xiàn)拍照并保存照片知道相機(jī)是獨(dú)占資源需要處理被占用的情況能使用 getCameraAbility 查詢?cè)O(shè)備相機(jī)能力能正確聲明相機(jī)相關(guān)權(quán)限能在 Ability 生命周期中正確釋放相機(jī)資源理解 FRAME_CONFIG_PREVIEW 和 FRAME_CONFIG_PICTURE 的區(qū)別進(jìn)階方向結(jié)合第 13 章視頻能力實(shí)現(xiàn)視頻錄制 App實(shí)現(xiàn)自定義相機(jī) UI手動(dòng)對(duì)焦、曝光調(diào)節(jié)、濾鏡等探索相機(jī)與 AI 能力的結(jié)合人臉檢測(cè)、掃碼等理解 FRAME_CONFIG_PREVIEW 和 FRAME_CONFIG_PICTURE 的區(qū)別進(jìn)階方向結(jié)合第 13 章視頻能力實(shí)現(xiàn)視頻錄制 App實(shí)現(xiàn)自定義相機(jī) UI手動(dòng)對(duì)焦、曝光調(diào)節(jié)、濾鏡等探索相機(jī)與 AI 能力的結(jié)合人臉檢測(cè)、掃碼等