34 相机开发基础Camera Kit 接入与权限管理前言图34 相机开发基础Camera Kit 接入与权限管理 运行效果截图HarmonyOS NEXT在鸿蒙应用中相机功能是很多场景的核心入口——拍照识别、扫码、AR 等。HarmonyOS 提供了Camera Kitkit.CameraKit作为相机开发的标准库支持相机管理、预览输出和拍照捕获等功能。本文以鹿鹿·笔迹心理分析项目中的 [CapturePage.ets](file:///Users/fiona/Downloads/bijixinli/harmony-app/entry/src/main/ets/pages/CapturePage.ets) 为例深入解析 Camera Kit 的接入流程、初始化方法和权限管理策略。鸿蒙官方·Camera Kit 文档developer.huawei.com项目源码仓库harmony-app GitHub图Camera Kit 接入全流程——权限申请 → CameraManager → 设备枚举 → CaptureSession拒绝授权声明 CAMERA 权限module.json5运行时申请权限requestPermissionsFromUser用户授权?显示拒绝提示获取 CameraManagercamera.getCameraManager枚举相机设备getSupportedCameras选择后置相机CameraPosition.CAMERA_POSITION_BACK初始化 CaptureSession配置预览 拍照输出开始预览XComponent 显示画面一、Camera Kit 模块导入1.1 引入模块import{camera}fromkit.CameraKitimport{fileIoasfs}fromkit.CoreFileKitimport{common}fromkit.AbilityKit模块包名用途kit.CameraKitcamera相机管理器、输入输出设备kit.CoreFileKitfileIo文件读写保存照片kit.AbilityKitcommonUIAbility 上下文提示API 12 中推荐使用kit.*的模块化导入方式而非旧版的ohos.multimedia.camera。二、相机初始化流程2.1 获取相机管理器privatecameraManager:camera.CameraManager|nullnullprivateasyncinitCamera(){try{this.cameraManagercamera.getCameraManager(getContext(this)ascommon.Context)if(!this.cameraManager){hilog.error(0x0000,TAG,相机管理器不可用)return}// ...}catch(error){hilog.error(0x0000,TAG,相机初始化失败: %s,JSON.stringify(error))this.cameraInitializedfalse}}关键点getCameraManager(context)— 获取相机管理器实例传入getContext(this)— 获取当前组件的上下文检查返回值为null— 模拟器或权限不足时会返回 null2.2 获取可用相机列表constcameras:camera.CameraDevice[]this.cameraManager.getSupportedCameras()if(cameras.length0){hilog.error(0x0000,TAG,无可用相机)return}CameraDevice结构属性类型说明cameraIdstring相机唯一标识cameraPositionCameraPosition摄像头位置前置/后置cameraTypeCameraType摄像头类型广角/超广角2.3 初始化时机aboutToAppear(){constparamsthis.getUIContext().getRouter().getParams()asRecordstring,Object|undefinedif(paramstypeofparams[source]string){this.sourceparams[source]asstring}if(this.sourcegallery){this.pickFromAlbum()// 相册模式 → 不初始化相机}else{this.initCamera()// 拍照模式 → 初始化相机}}三、相机权限管理3.1 权限声明在module.json5中声明相机权限{ requestPermissions: [ { name: ohos.permission.CAMERA, reason: $string:camera_permission_reason, usedScene: { abilities: [EntryAbility], when: inuse } } ] }属性说明示例值name权限名称ohos.permission.CAMERAreason权限用途说明用户可见$string:camera_permission_reasonusedScene.abilities使用权限的 Ability[EntryAbility]usedScene.when使用时机inuse使用时3.2 权限动态申请privateasyncrequestCameraPermission(){// 使用 API 12 的权限申请能力// import { abilityAccessCtrl } from kit.AbilityKit// const atManager abilityAccessCtrl.createAtManager()// const granted await atManager.requestPermissionsFromUser(// getContext(this),// [ohos.permission.CAMERA]// )this.getUIContext().getPromptAction().showToast({message:请在系统设置中授予相机权限,duration:2000})}3.3 权限状态检查状态含义处理方式已授权用户已同意正常初始化相机未授权首次用户未选择弹出授权对话框已拒绝用户拒绝了引导前往系统设置已拒绝并勾选不再询问永久拒绝只能引导去系统设置四、相机资源管理4.1 资源释放aboutToDisappear(){this.releaseCamera()}privatereleaseCamera(){try{if(this.captureSession){this.captureSession.release()// 释放会话}if(this.cameraInput){this.cameraInput.close()// 关闭输入}}catch(error){hilog.error(0x0000,TAG,释放相机资源失败: %s,JSON.stringify(error))}}4.2 未释放的后果资源未释放的后果CaptureSession相机设备被占用其他应用无法使用CameraInput相机驱动不释放可能发热和耗电PreviewOutputSurface 资源泄漏黄金法则在aboutToAppear中初始化的相机资源必须在aboutToDisappear中释放。五、开发者调试模式5.1 开发阶段降级策略在实际 Camera Kit 尚未完成集成时项目使用异步延时模拟拍照privateasynctakePhoto(){this.isCapturingtruetry{// 真实 Camera Kit 调用 // const photoOutput this.captureSession.createPhotoOutput()// const photoFile fs.openSync(..., fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)// await photoOutput.capture(photoFile.fd)// this.previewPath photoFile.path// 开发调试模式 awaitnewPromisevoid(resolvesetTimeout(resolve,500))this.previewPath/data/storage/el2/base/cache/capture_${Date.now()}.jpgthis.hasPreviewtrue}finally{this.isCapturingfalse}}六、完整的相机初始化状态管理6.1 状态变量StateisCapturing:booleanfalse// 拍照中防止重复点击StatehasPreview:booleanfalse// 是否有预览图StatepreviewPath:string// 预览图片路径StatecameraInitialized:booleanfalse// 相机是否已初始化privatecameraManager:camera.CameraManager|nullnullprivatecameraInput:camera.CameraInput|nullnullprivatepreviewOutput:camera.PreviewOutput|nullnullprivatecaptureSession:camera.CaptureSession|nullnullprivatesurfaceId:string6.2 状态流转page loaded ↓ source camera ? source gallery ? ↓ ↓ initCamera() pickFromAlbum() ↓ ↓ cameraInitialized true PhotoViewPicker.select() ↓ ↓ 用户点击拍照按钮 photoUris[0] ↓ ↓ takePhoto() 预览 / 确认 ↓ hasPreview true ↓ 用户确认使用 / 重拍七、常见问题排查问题原因解决方案getCameraManager返回 null权限未授予检查 module.json5 权限声明getSupportedCameras为空数组模拟器无相机使用真机调试拍照后图片无法预览surfaceId 未设置确保创建 PreviewOutput切换页面后相机仍然占用未释放资源在aboutToDisappear中 release权限弹窗只显示一次用户选择了不再询问引导用户前往系统设置八、Camera Kit 架构概览8.1 层次结构应用层 ↓ Camera Kitkit.CameraKit ↓ CameraManager相机管理器 ↓ CameraDevice[]相机设备列表 ├── CameraInput相机输入 ├── PreviewOutput预览输出 └── PhotoOutput拍照输出→ CaptureSession会话管理8.2 各组件职责组件职责创建方式CameraManager管理相机设备camera.getCameraManager(context)CameraInput相机数据输入session.addInput(device)PreviewOutput实时取景session.addOutput(previewSurface)PhotoOutput拍照session.addOutput(photoOutput)CaptureSession会话管理camera.createCaptureSession(context)总结本文从 CapturePage 的 Camera Kit 集成代码出发解析了鸿蒙相机开发的基础知识模块导入kit.CameraKit提供相机核心能力相机初始化getCameraManager(context)→getSupportedCameras()权限管理module.json5声明 运行时申请 状态检查资源释放aboutToDisappear中释放 CaptureSession 和 CameraInput调试模式开发阶段使用异步延时模拟拍照状态管理State控制拍照流程的 UI 状态下一篇文章将深入拍照流程实现——CaptureSession 的完整管理和照片文件保存。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力参考资源Camera Kit 开发指南[CapturePage 项目源码](file:///Users/fiona/Downloads/bijixinli/harmony-app/entry/src/main/ets/pages/CapturePage.ets)camera.getCameraManager API权限申请指南module.json5 权限配置kit.CameraKit 包说明HarmonyOS 开发文档abilityAccessCtrl 权限控制XComponent 相机预览组件CameraDevice 相机设备属性相机预览最佳实践requestPermissionsFromUser API相机录像开发指南下一篇将介绍拍照流程与 CaptureSession 管理——如何配置相机输入输出并触发拍照。七、Camera Kit 常见问题与最佳实践7.1 多相机支持鸿蒙设备通常有多个摄像头前置/后置/超广角等需要根据需求选择合适的相机// 获取所有可用相机constcamerascameraManager.getSupportedCameras()// 按类型筛选constbackCameracameras.find(cc.cameraPositioncamera.CameraPosition.CAMERA_POSITION_BACK)constfrontCameracameras.find(cc.cameraPositioncamera.CameraPosition.CAMERA_POSITION_FRONT)// 相机类型枚举// CAMERA_POSITION_UNSPECIFIED 0 任意相机// CAMERA_POSITION_BACK 1 后置相机// CAMERA_POSITION_FRONT 2 前置相机7.2 相机权限最佳实践权限必要性声明方式ohos.permission.CAMERA✅ 必须module.json5 运行时申请ohos.permission.MICROPHONE仅录像需要module.json5 运行时申请ohos.permission.READ_MEDIA相册访问module.json5 运行时申请7.3 Camera 资源释放相机是独占资源必须在页面销毁时释放aboutToDisappear(){// 严格按顺序释放CaptureSession → CameraInput → CameraManagerif(this.captureSession){this.captureSession.stop()this.captureSession.release()this.captureSessionundefined}if(this.cameraInput){this.cameraInput.close()this.cameraInputundefined}}7.4 权限拒绝的处理privatehandlePermissionDenied():void{// 方式1直接提示this.getUIContext().showToast({message:需要相机权限才能拍摄})// 方式2引导用户去设置页面手动开启constsettingParam:openlink.OpenLinkOptions{appLinkingOnly:false}openlink.openLink(app_settings://camera,settingParam)}如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力
34 相机开发基础:Camera Kit 接入与权限管理
34 相机开发基础Camera Kit 接入与权限管理前言图34 相机开发基础Camera Kit 接入与权限管理 运行效果截图HarmonyOS NEXT在鸿蒙应用中相机功能是很多场景的核心入口——拍照识别、扫码、AR 等。HarmonyOS 提供了Camera Kitkit.CameraKit作为相机开发的标准库支持相机管理、预览输出和拍照捕获等功能。本文以鹿鹿·笔迹心理分析项目中的 [CapturePage.ets](file:///Users/fiona/Downloads/bijixinli/harmony-app/entry/src/main/ets/pages/CapturePage.ets) 为例深入解析 Camera Kit 的接入流程、初始化方法和权限管理策略。鸿蒙官方·Camera Kit 文档developer.huawei.com项目源码仓库harmony-app GitHub图Camera Kit 接入全流程——权限申请 → CameraManager → 设备枚举 → CaptureSession拒绝授权声明 CAMERA 权限module.json5运行时申请权限requestPermissionsFromUser用户授权?显示拒绝提示获取 CameraManagercamera.getCameraManager枚举相机设备getSupportedCameras选择后置相机CameraPosition.CAMERA_POSITION_BACK初始化 CaptureSession配置预览 拍照输出开始预览XComponent 显示画面一、Camera Kit 模块导入1.1 引入模块import{camera}fromkit.CameraKitimport{fileIoasfs}fromkit.CoreFileKitimport{common}fromkit.AbilityKit模块包名用途kit.CameraKitcamera相机管理器、输入输出设备kit.CoreFileKitfileIo文件读写保存照片kit.AbilityKitcommonUIAbility 上下文提示API 12 中推荐使用kit.*的模块化导入方式而非旧版的ohos.multimedia.camera。二、相机初始化流程2.1 获取相机管理器privatecameraManager:camera.CameraManager|nullnullprivateasyncinitCamera(){try{this.cameraManagercamera.getCameraManager(getContext(this)ascommon.Context)if(!this.cameraManager){hilog.error(0x0000,TAG,相机管理器不可用)return}// ...}catch(error){hilog.error(0x0000,TAG,相机初始化失败: %s,JSON.stringify(error))this.cameraInitializedfalse}}关键点getCameraManager(context)— 获取相机管理器实例传入getContext(this)— 获取当前组件的上下文检查返回值为null— 模拟器或权限不足时会返回 null2.2 获取可用相机列表constcameras:camera.CameraDevice[]this.cameraManager.getSupportedCameras()if(cameras.length0){hilog.error(0x0000,TAG,无可用相机)return}CameraDevice结构属性类型说明cameraIdstring相机唯一标识cameraPositionCameraPosition摄像头位置前置/后置cameraTypeCameraType摄像头类型广角/超广角2.3 初始化时机aboutToAppear(){constparamsthis.getUIContext().getRouter().getParams()asRecordstring,Object|undefinedif(paramstypeofparams[source]string){this.sourceparams[source]asstring}if(this.sourcegallery){this.pickFromAlbum()// 相册模式 → 不初始化相机}else{this.initCamera()// 拍照模式 → 初始化相机}}三、相机权限管理3.1 权限声明在module.json5中声明相机权限{ requestPermissions: [ { name: ohos.permission.CAMERA, reason: $string:camera_permission_reason, usedScene: { abilities: [EntryAbility], when: inuse } } ] }属性说明示例值name权限名称ohos.permission.CAMERAreason权限用途说明用户可见$string:camera_permission_reasonusedScene.abilities使用权限的 Ability[EntryAbility]usedScene.when使用时机inuse使用时3.2 权限动态申请privateasyncrequestCameraPermission(){// 使用 API 12 的权限申请能力// import { abilityAccessCtrl } from kit.AbilityKit// const atManager abilityAccessCtrl.createAtManager()// const granted await atManager.requestPermissionsFromUser(// getContext(this),// [ohos.permission.CAMERA]// )this.getUIContext().getPromptAction().showToast({message:请在系统设置中授予相机权限,duration:2000})}3.3 权限状态检查状态含义处理方式已授权用户已同意正常初始化相机未授权首次用户未选择弹出授权对话框已拒绝用户拒绝了引导前往系统设置已拒绝并勾选不再询问永久拒绝只能引导去系统设置四、相机资源管理4.1 资源释放aboutToDisappear(){this.releaseCamera()}privatereleaseCamera(){try{if(this.captureSession){this.captureSession.release()// 释放会话}if(this.cameraInput){this.cameraInput.close()// 关闭输入}}catch(error){hilog.error(0x0000,TAG,释放相机资源失败: %s,JSON.stringify(error))}}4.2 未释放的后果资源未释放的后果CaptureSession相机设备被占用其他应用无法使用CameraInput相机驱动不释放可能发热和耗电PreviewOutputSurface 资源泄漏黄金法则在aboutToAppear中初始化的相机资源必须在aboutToDisappear中释放。五、开发者调试模式5.1 开发阶段降级策略在实际 Camera Kit 尚未完成集成时项目使用异步延时模拟拍照privateasynctakePhoto(){this.isCapturingtruetry{// 真实 Camera Kit 调用 // const photoOutput this.captureSession.createPhotoOutput()// const photoFile fs.openSync(..., fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)// await photoOutput.capture(photoFile.fd)// this.previewPath photoFile.path// 开发调试模式 awaitnewPromisevoid(resolvesetTimeout(resolve,500))this.previewPath/data/storage/el2/base/cache/capture_${Date.now()}.jpgthis.hasPreviewtrue}finally{this.isCapturingfalse}}六、完整的相机初始化状态管理6.1 状态变量StateisCapturing:booleanfalse// 拍照中防止重复点击StatehasPreview:booleanfalse// 是否有预览图StatepreviewPath:string// 预览图片路径StatecameraInitialized:booleanfalse// 相机是否已初始化privatecameraManager:camera.CameraManager|nullnullprivatecameraInput:camera.CameraInput|nullnullprivatepreviewOutput:camera.PreviewOutput|nullnullprivatecaptureSession:camera.CaptureSession|nullnullprivatesurfaceId:string6.2 状态流转page loaded ↓ source camera ? source gallery ? ↓ ↓ initCamera() pickFromAlbum() ↓ ↓ cameraInitialized true PhotoViewPicker.select() ↓ ↓ 用户点击拍照按钮 photoUris[0] ↓ ↓ takePhoto() 预览 / 确认 ↓ hasPreview true ↓ 用户确认使用 / 重拍七、常见问题排查问题原因解决方案getCameraManager返回 null权限未授予检查 module.json5 权限声明getSupportedCameras为空数组模拟器无相机使用真机调试拍照后图片无法预览surfaceId 未设置确保创建 PreviewOutput切换页面后相机仍然占用未释放资源在aboutToDisappear中 release权限弹窗只显示一次用户选择了不再询问引导用户前往系统设置八、Camera Kit 架构概览8.1 层次结构应用层 ↓ Camera Kitkit.CameraKit ↓ CameraManager相机管理器 ↓ CameraDevice[]相机设备列表 ├── CameraInput相机输入 ├── PreviewOutput预览输出 └── PhotoOutput拍照输出→ CaptureSession会话管理8.2 各组件职责组件职责创建方式CameraManager管理相机设备camera.getCameraManager(context)CameraInput相机数据输入session.addInput(device)PreviewOutput实时取景session.addOutput(previewSurface)PhotoOutput拍照session.addOutput(photoOutput)CaptureSession会话管理camera.createCaptureSession(context)总结本文从 CapturePage 的 Camera Kit 集成代码出发解析了鸿蒙相机开发的基础知识模块导入kit.CameraKit提供相机核心能力相机初始化getCameraManager(context)→getSupportedCameras()权限管理module.json5声明 运行时申请 状态检查资源释放aboutToDisappear中释放 CaptureSession 和 CameraInput调试模式开发阶段使用异步延时模拟拍照状态管理State控制拍照流程的 UI 状态下一篇文章将深入拍照流程实现——CaptureSession 的完整管理和照片文件保存。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力参考资源Camera Kit 开发指南[CapturePage 项目源码](file:///Users/fiona/Downloads/bijixinli/harmony-app/entry/src/main/ets/pages/CapturePage.ets)camera.getCameraManager API权限申请指南module.json5 权限配置kit.CameraKit 包说明HarmonyOS 开发文档abilityAccessCtrl 权限控制XComponent 相机预览组件CameraDevice 相机设备属性相机预览最佳实践requestPermissionsFromUser API相机录像开发指南下一篇将介绍拍照流程与 CaptureSession 管理——如何配置相机输入输出并触发拍照。七、Camera Kit 常见问题与最佳实践7.1 多相机支持鸿蒙设备通常有多个摄像头前置/后置/超广角等需要根据需求选择合适的相机// 获取所有可用相机constcamerascameraManager.getSupportedCameras()// 按类型筛选constbackCameracameras.find(cc.cameraPositioncamera.CameraPosition.CAMERA_POSITION_BACK)constfrontCameracameras.find(cc.cameraPositioncamera.CameraPosition.CAMERA_POSITION_FRONT)// 相机类型枚举// CAMERA_POSITION_UNSPECIFIED 0 任意相机// CAMERA_POSITION_BACK 1 后置相机// CAMERA_POSITION_FRONT 2 前置相机7.2 相机权限最佳实践权限必要性声明方式ohos.permission.CAMERA✅ 必须module.json5 运行时申请ohos.permission.MICROPHONE仅录像需要module.json5 运行时申请ohos.permission.READ_MEDIA相册访问module.json5 运行时申请7.3 Camera 资源释放相机是独占资源必须在页面销毁时释放aboutToDisappear(){// 严格按顺序释放CaptureSession → CameraInput → CameraManagerif(this.captureSession){this.captureSession.stop()this.captureSession.release()this.captureSessionundefined}if(this.cameraInput){this.cameraInput.close()this.cameraInputundefined}}7.4 权限拒绝的处理privatehandlePermissionDenied():void{// 方式1直接提示this.getUIContext().showToast({message:需要相机权限才能拍摄})// 方式2引导用户去设置页面手动开启constsettingParam:openlink.OpenLinkOptions{appLinkingOnly:false}openlink.openLink(app_settings://camera,settingParam)}如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力