1# 动态照片拍摄(ArkTS) 2<!--Kit: Camera Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @qano--> 5<!--Designer: @leo_ysl--> 6<!--Tester: @xchaosioda--> 7<!--Adviser: @zengyawen--> 8 9相机框架提供动态照片拍摄能力,业务应用可以类似拍摄普通照片一样,一键式拍摄得到动态照片。 10 11应用开发动态照片主要分为以下步骤: 12 13- 应用开发动态照片前,请参考[申请相机开发的权限](camera-preparation.md)、[相机管理](camera-device-management.md)、[设备输入](camera-device-input.md)、[会话管理](camera-session-management.md)等流程完成相机应用开发必选能力配置。 14- 查询当前设备的当前模式是否支持拍摄动态照片。 15- 如果支持动态照片,可以调用相机框架提供的使能接口**使能**动态照片能力。 16- 监听照片回调,将照片存入媒体库。可参考[MediaLibrary Kit-访问和管理动态照片资源](../medialibrary/photoAccessHelper-movingphoto.md)。 17 18## 开发步骤 19 20详细的API说明请参考[Camera API参考](../../reference/apis-camera-kit/arkts-apis-camera.md)。 21 22> **说明:** 23> - 拍摄动态照片需要麦克风权限ohos.permission.MICROPHONE,权限申请和校验的方式请参考[开发准备](camera-preparation.md)。否则拍摄的照片没有声音。 24 251. 导入依赖,需要导入相机框架、媒体库、图片相关领域依赖。 26 27 ```ts 28 import { camera } from '@kit.CameraKit'; 29 import { photoAccessHelper } from '@kit.MediaLibraryKit'; 30 import { BusinessError } from '@kit.BasicServicesKit'; 31 ``` 32 332. 确定拍照输出流。 34 35 通过[CameraOutputCapability](../../reference/apis-camera-kit/arkts-apis-camera-i.md#cameraoutputcapability)中的photoProfiles属性,可获取当前设备支持的拍照输出流,通过[createPhotoOutput](../../reference/apis-camera-kit/arkts-apis-camera-CameraManager.md#createphotooutput11)方法创建拍照输出流。 36 37 ```ts 38 function getPhotoOutput(cameraManager: camera.CameraManager, 39 cameraOutputCapability: camera.CameraOutputCapability): camera.PhotoOutput | undefined { 40 let photoProfilesArray: Array<camera.Profile> = cameraOutputCapability.photoProfiles; 41 if (!photoProfilesArray) { 42 console.error("createOutput photoProfilesArray == null || undefined"); 43 } 44 let photoOutput: camera.PhotoOutput | undefined = undefined; 45 try { 46 photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0]); 47 } catch (error) { 48 let err = error as BusinessError; 49 console.error(`Failed to createPhotoOutput. error: ${err}`); 50 } 51 return photoOutput; 52 } 53 ``` 54 553. 查询当前设备当前模式是否支持动态照片能力。 56 57 > **说明:** 58 > 查询是否支持动态照片前需要先完成相机会话配置、提交和启动会话,详细开发步骤请参考[会话管理](camera-session-management.md)。 59 60 ```ts 61 function isMovingPhotoSupported(photoOutput: camera.PhotoOutput): boolean { 62 let isSupported: boolean = false; 63 try { 64 isSupported = photoOutput.isMovingPhotoSupported(); 65 } catch (error) { 66 // 失败返回错误码error.code并处理。 67 let err = error as BusinessError; 68 console.error(`The isMovingPhotoSupported call failed. error code: ${err.code}`); 69 } 70 return isSupported; 71 } 72 ``` 73 744. 使能动态照片拍照能力。 75 76 > **说明:** 77 > 78 > 使能动态照片前需要使能[分段式拍照](camera-deferred-capture.md)能力。 79 80 ```ts 81 function enableMovingPhoto(photoOutput: camera.PhotoOutput): void { 82 try { 83 photoOutput.enableMovingPhoto(true); 84 } catch (error) { 85 // 失败返回错误码error.code并处理。 86 let err = error as BusinessError; 87 console.error(`The enableMovingPhoto call failed. error code: ${err.code}`); 88 } 89 } 90 ``` 91 925. 触发拍照,与普通拍照方式相同,请参考[拍照](camera-shooting.md)。 93 94## 状态监听 95 96在相机应用开发过程中,可以随时监听动态照片拍照输出流状态。通过注册photoAsset的回调函数获取监听结果,photoOutput创建成功时即可监听。 97 98 ```ts 99 function getPhotoAccessHelper(context: Context): photoAccessHelper.PhotoAccessHelper { 100 let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 101 return phAccessHelper; 102 } 103 104 async function mediaLibSavePhoto(photoAsset: photoAccessHelper.PhotoAsset, 105 phAccessHelper: photoAccessHelper.PhotoAccessHelper): Promise<void> { 106 try { 107 let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(photoAsset); 108 assetChangeRequest.saveCameraPhoto(); 109 await phAccessHelper.applyChanges(assetChangeRequest); 110 console.info('apply saveCameraPhoto successfully'); 111 } catch (err) { 112 console.error(`apply saveCameraPhoto failed with error: ${err.code}, ${err.message}`); 113 } 114 } 115 116 function onPhotoOutputPhotoAssetAvailable(photoOutput: camera.PhotoOutput, context: Context): void { 117 photoOutput.on('photoAssetAvailable', (err: BusinessError, photoAsset: photoAccessHelper.PhotoAsset): void => { 118 if (err) { 119 console.error(`photoAssetAvailable error: ${err}.`); 120 return; 121 } 122 console.info('photoOutPutCallBack photoAssetAvailable'); 123 // 调用媒体库落盘接口保存一阶段图和动态照片视频。 124 mediaLibSavePhoto(photoAsset, getPhotoAccessHelper(context)); 125 }); 126 } 127 ``` 128