• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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