1e41f4b71Sopenharmony_ci# Camera Photographing Sample (ArkTS)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ciThis topic provides sample code that covers the complete photographing process to help you understand the complete API calling sequence.
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ciBefore referring to the sample code, you are advised to read [Device Input Management](camera-device-input.md), [Camera Session Management](camera-session-management.md), [Camera Photographing](camera-shooting.md), and other related topics in [Camera Development (ArkTS)](camera-preparation.md).
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci## Development Process
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ciAfter obtaining the output stream capabilities supported by the camera, create a photo stream. The development process is as follows:
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci![Photographing Development Process](figures/photographing-development-process.png)
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci## Sample Code
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ciFor details about how to obtain the context, see [Obtaining the Context of UIAbility](../../application-models/uiability-usage.md#obtaining-the-context-of-uiability).
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci```ts
18e41f4b71Sopenharmony_ciimport { camera } from '@kit.CameraKit';
19e41f4b71Sopenharmony_ciimport { image } from '@kit.ImageKit';
20e41f4b71Sopenharmony_ciimport { BusinessError } from '@kit.BasicServicesKit';
21e41f4b71Sopenharmony_ciimport { common } from '@kit.AbilityKit';
22e41f4b71Sopenharmony_ciimport { fileIo as fs } from '@kit.CoreFileKit';
23e41f4b71Sopenharmony_ciimport { photoAccessHelper } from '@kit.MediaLibraryKit';
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_cilet context = getContext(this);
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ciasync function savePicture(buffer: ArrayBuffer, img: image.Image): Promise<void> {
28e41f4b71Sopenharmony_ci  let accessHelper: photoAccessHelper.PhotoAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
29e41f4b71Sopenharmony_ci  let options: photoAccessHelper.CreateOptions = {
30e41f4b71Sopenharmony_ci    title: Date.now().toString()
31e41f4b71Sopenharmony_ci  };
32e41f4b71Sopenharmony_ci  let photoUri: string = await accessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg', options);
33e41f4b71Sopenharmony_ci  // To call createAsset(), the application must have the ohos.permission.READ_IMAGEVIDEO and ohos.permission.WRITE_IMAGEVIDEO permissions.
34e41f4b71Sopenharmony_ci  let file: fs.File = fs.openSync(photoUri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
35e41f4b71Sopenharmony_ci  await fs.write(file.fd, buffer);
36e41f4b71Sopenharmony_ci  fs.closeSync(file);
37e41f4b71Sopenharmony_ci  img.release(); 
38e41f4b71Sopenharmony_ci}
39e41f4b71Sopenharmony_ci
40e41f4b71Sopenharmony_cifunction setPhotoOutputCb(photoOutput: camera.PhotoOutput): void {
41e41f4b71Sopenharmony_ci  // After the callback is set, call capture() of photoOutput to transfer the photo buffer back to the callback.
42e41f4b71Sopenharmony_ci  photoOutput.on('photoAvailable', (errCode: BusinessError, photo: camera.Photo): void => {
43e41f4b71Sopenharmony_ci    console.info('getPhoto start');
44e41f4b71Sopenharmony_ci    console.info(`err: ${JSON.stringify(errCode)}`);
45e41f4b71Sopenharmony_ci    if (errCode || photo === undefined) {
46e41f4b71Sopenharmony_ci      console.error('getPhoto failed');
47e41f4b71Sopenharmony_ci      return;
48e41f4b71Sopenharmony_ci    }
49e41f4b71Sopenharmony_ci    let imageObj = photo.main;
50e41f4b71Sopenharmony_ci    imageObj.getComponent(image.ComponentType.JPEG, (errCode: BusinessError, component: image.Component): void => {
51e41f4b71Sopenharmony_ci      console.info('getComponent start');
52e41f4b71Sopenharmony_ci      if (errCode || component === undefined) {
53e41f4b71Sopenharmony_ci        console.error('getComponent failed');
54e41f4b71Sopenharmony_ci        return;
55e41f4b71Sopenharmony_ci      }
56e41f4b71Sopenharmony_ci      let buffer: ArrayBuffer;
57e41f4b71Sopenharmony_ci      if (component.byteBuffer) {
58e41f4b71Sopenharmony_ci        buffer = component.byteBuffer;
59e41f4b71Sopenharmony_ci      } else {
60e41f4b71Sopenharmony_ci        console.error('byteBuffer is null');
61e41f4b71Sopenharmony_ci        return;
62e41f4b71Sopenharmony_ci      }
63e41f4b71Sopenharmony_ci      savePicture(buffer, imageObj);
64e41f4b71Sopenharmony_ci    });
65e41f4b71Sopenharmony_ci  });
66e41f4b71Sopenharmony_ci}
67e41f4b71Sopenharmony_ci
68e41f4b71Sopenharmony_ciasync function cameraShootingCase(baseContext: common.BaseContext, surfaceId: string): Promise<void> {
69e41f4b71Sopenharmony_ci  // Create a CameraManager instance.
70e41f4b71Sopenharmony_ci  let cameraManager: camera.CameraManager = camera.getCameraManager(baseContext);
71e41f4b71Sopenharmony_ci  if (!cameraManager) {
72e41f4b71Sopenharmony_ci    console.error("camera.getCameraManager error");
73e41f4b71Sopenharmony_ci    return;
74e41f4b71Sopenharmony_ci  }
75e41f4b71Sopenharmony_ci  // Listen for camera status changes.
76e41f4b71Sopenharmony_ci  cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => {
77e41f4b71Sopenharmony_ci    if (err !== undefined && err.code !== 0) {
78e41f4b71Sopenharmony_ci      console.error('cameraStatus with errorCode = ' + err.code);
79e41f4b71Sopenharmony_ci      return;
80e41f4b71Sopenharmony_ci    }
81e41f4b71Sopenharmony_ci    console.info(`camera : ${cameraStatusInfo.camera.cameraId}`);
82e41f4b71Sopenharmony_ci    console.info(`status: ${cameraStatusInfo.status}`);
83e41f4b71Sopenharmony_ci  });
84e41f4b71Sopenharmony_ci
85e41f4b71Sopenharmony_ci  // Obtain the camera list.
86e41f4b71Sopenharmony_ci  let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras();
87e41f4b71Sopenharmony_ci  if (cameraArray.length <= 0) {
88e41f4b71Sopenharmony_ci    console.error("cameraManager.getSupportedCameras error");
89e41f4b71Sopenharmony_ci    return;
90e41f4b71Sopenharmony_ci  }
91e41f4b71Sopenharmony_ci
92e41f4b71Sopenharmony_ci  for (let index = 0; index < cameraArray.length; index++) {
93e41f4b71Sopenharmony_ci    console.info('cameraId : ' + cameraArray[index].cameraId);                          // Obtain the camera ID.
94e41f4b71Sopenharmony_ci    console.info('cameraPosition : ' + cameraArray[index].cameraPosition);              // Obtain the camera position.
95e41f4b71Sopenharmony_ci    console.info('cameraType : ' + cameraArray[index].cameraType);                      // Obtain the camera type.
96e41f4b71Sopenharmony_ci    console.info('connectionType : ' + cameraArray[index].connectionType);              // Obtain the camera connection type.
97e41f4b71Sopenharmony_ci  }
98e41f4b71Sopenharmony_ci
99e41f4b71Sopenharmony_ci  // Create a camera input stream.
100e41f4b71Sopenharmony_ci  let cameraInput: camera.CameraInput | undefined = undefined;
101e41f4b71Sopenharmony_ci  try {
102e41f4b71Sopenharmony_ci    cameraInput = cameraManager.createCameraInput(cameraArray[0]);
103e41f4b71Sopenharmony_ci  } catch (error) {
104e41f4b71Sopenharmony_ci    let err = error as BusinessError;
105e41f4b71Sopenharmony_ci    console.error('Failed to createCameraInput errorCode = ' + err.code);
106e41f4b71Sopenharmony_ci  }
107e41f4b71Sopenharmony_ci  if (cameraInput === undefined) {
108e41f4b71Sopenharmony_ci    return;
109e41f4b71Sopenharmony_ci  }
110e41f4b71Sopenharmony_ci
111e41f4b71Sopenharmony_ci  // Listen for camera input errors.
112e41f4b71Sopenharmony_ci  let cameraDevice: camera.CameraDevice = cameraArray[0];
113e41f4b71Sopenharmony_ci  cameraInput.on('error', cameraDevice, (error: BusinessError) => {
114e41f4b71Sopenharmony_ci    console.error(`Camera input error code: ${error.code}`);
115e41f4b71Sopenharmony_ci  })
116e41f4b71Sopenharmony_ci
117e41f4b71Sopenharmony_ci  // Open the camera.
118e41f4b71Sopenharmony_ci  await cameraInput.open();
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ci  // Obtain the supported modes.
121e41f4b71Sopenharmony_ci  let sceneModes: Array<camera.SceneMode> = cameraManager.getSupportedSceneModes(cameraArray[0]);
122e41f4b71Sopenharmony_ci  let isSupportPhotoMode: boolean = sceneModes.indexOf(camera.SceneMode.NORMAL_PHOTO) >= 0;
123e41f4b71Sopenharmony_ci  if (!isSupportPhotoMode) {
124e41f4b71Sopenharmony_ci    console.error('photo mode not support');
125e41f4b71Sopenharmony_ci    return;
126e41f4b71Sopenharmony_ci  }
127e41f4b71Sopenharmony_ci  // Obtain the output stream capabilities supported by the camera.
128e41f4b71Sopenharmony_ci  let cameraOutputCap: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0], camera.SceneMode.NORMAL_PHOTO);
129e41f4b71Sopenharmony_ci  if (!cameraOutputCap) {
130e41f4b71Sopenharmony_ci    console.error("cameraManager.getSupportedOutputCapability error");
131e41f4b71Sopenharmony_ci    return;
132e41f4b71Sopenharmony_ci  }
133e41f4b71Sopenharmony_ci  console.info("outputCapability: " + JSON.stringify(cameraOutputCap));
134e41f4b71Sopenharmony_ci
135e41f4b71Sopenharmony_ci  let previewProfilesArray: Array<camera.Profile> = cameraOutputCap.previewProfiles;
136e41f4b71Sopenharmony_ci  if (!previewProfilesArray) {
137e41f4b71Sopenharmony_ci    console.error("createOutput previewProfilesArray == null || undefined");
138e41f4b71Sopenharmony_ci  }
139e41f4b71Sopenharmony_ci
140e41f4b71Sopenharmony_ci  let photoProfilesArray: Array<camera.Profile> = cameraOutputCap.photoProfiles;
141e41f4b71Sopenharmony_ci  if (!photoProfilesArray) {
142e41f4b71Sopenharmony_ci    console.error("createOutput photoProfilesArray == null || undefined");
143e41f4b71Sopenharmony_ci  }
144e41f4b71Sopenharmony_ci
145e41f4b71Sopenharmony_ci  // Create a preview output stream. For details about the surfaceId parameter, see the XComponent. The preview stream uses the surface provided by the XComponent.
146e41f4b71Sopenharmony_ci  let previewOutput: camera.PreviewOutput | undefined = undefined;
147e41f4b71Sopenharmony_ci  try {
148e41f4b71Sopenharmony_ci    previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId);
149e41f4b71Sopenharmony_ci  } catch (error) {
150e41f4b71Sopenharmony_ci    let err = error as BusinessError;
151e41f4b71Sopenharmony_ci    console.error(`Failed to create the PreviewOutput instance. error code: ${err.code}`);
152e41f4b71Sopenharmony_ci  }
153e41f4b71Sopenharmony_ci  if (previewOutput === undefined) {
154e41f4b71Sopenharmony_ci    return;
155e41f4b71Sopenharmony_ci  }
156e41f4b71Sopenharmony_ci  // Listen for preview output errors.
157e41f4b71Sopenharmony_ci  previewOutput.on('error', (error: BusinessError) => {
158e41f4b71Sopenharmony_ci    console.error(`Preview output error code: ${error.code}`);
159e41f4b71Sopenharmony_ci  });
160e41f4b71Sopenharmony_ci
161e41f4b71Sopenharmony_ci  // Create a photo output stream.
162e41f4b71Sopenharmony_ci  let photoOutput: camera.PhotoOutput | undefined = undefined;
163e41f4b71Sopenharmony_ci  try {
164e41f4b71Sopenharmony_ci    photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0]);
165e41f4b71Sopenharmony_ci  } catch (error) {
166e41f4b71Sopenharmony_ci    let err = error as BusinessError;
167e41f4b71Sopenharmony_ci    console.error('Failed to createPhotoOutput errorCode = ' + err.code);
168e41f4b71Sopenharmony_ci  }
169e41f4b71Sopenharmony_ci  if (photoOutput === undefined) {
170e41f4b71Sopenharmony_ci    return;
171e41f4b71Sopenharmony_ci  }
172e41f4b71Sopenharmony_ci
173e41f4b71Sopenharmony_ci    // Call the preceding callback to save the image.
174e41f4b71Sopenharmony_ci  setPhotoOutputCb(photoOutput);
175e41f4b71Sopenharmony_ci
176e41f4b71Sopenharmony_ci  // Create a session.
177e41f4b71Sopenharmony_ci  let photoSession: camera.PhotoSession | undefined = undefined;
178e41f4b71Sopenharmony_ci  try {
179e41f4b71Sopenharmony_ci    photoSession = cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO) as camera.PhotoSession;
180e41f4b71Sopenharmony_ci  } catch (error) {
181e41f4b71Sopenharmony_ci    let err = error as BusinessError;
182e41f4b71Sopenharmony_ci    console.error('Failed to create the session instance. errorCode = ' + err.code);
183e41f4b71Sopenharmony_ci  }
184e41f4b71Sopenharmony_ci  if (photoSession === undefined) {
185e41f4b71Sopenharmony_ci    return;
186e41f4b71Sopenharmony_ci  }
187e41f4b71Sopenharmony_ci  // Listen for session errors.
188e41f4b71Sopenharmony_ci  photoSession.on('error', (error: BusinessError) => {
189e41f4b71Sopenharmony_ci    console.error(`Capture session error code: ${error.code}`);
190e41f4b71Sopenharmony_ci  });
191e41f4b71Sopenharmony_ci
192e41f4b71Sopenharmony_ci  // Start configuration for the session.
193e41f4b71Sopenharmony_ci  try {
194e41f4b71Sopenharmony_ci    photoSession.beginConfig();
195e41f4b71Sopenharmony_ci  } catch (error) {
196e41f4b71Sopenharmony_ci    let err = error as BusinessError;
197e41f4b71Sopenharmony_ci    console.error('Failed to beginConfig. errorCode = ' + err.code);
198e41f4b71Sopenharmony_ci  }
199e41f4b71Sopenharmony_ci
200e41f4b71Sopenharmony_ci  // Add the camera input stream to the session.
201e41f4b71Sopenharmony_ci  try {
202e41f4b71Sopenharmony_ci    photoSession.addInput(cameraInput);
203e41f4b71Sopenharmony_ci  } catch (error) {
204e41f4b71Sopenharmony_ci    let err = error as BusinessError;
205e41f4b71Sopenharmony_ci    console.error('Failed to addInput. errorCode = ' + err.code);
206e41f4b71Sopenharmony_ci  }
207e41f4b71Sopenharmony_ci
208e41f4b71Sopenharmony_ci  // Add the preview output stream to the session.
209e41f4b71Sopenharmony_ci  try {
210e41f4b71Sopenharmony_ci    photoSession.addOutput(previewOutput);
211e41f4b71Sopenharmony_ci  } catch (error) {
212e41f4b71Sopenharmony_ci    let err = error as BusinessError;
213e41f4b71Sopenharmony_ci    console.error('Failed to addOutput(previewOutput). errorCode = ' + err.code);
214e41f4b71Sopenharmony_ci  }
215e41f4b71Sopenharmony_ci
216e41f4b71Sopenharmony_ci  // Add the photo output stream to the session.
217e41f4b71Sopenharmony_ci  try {
218e41f4b71Sopenharmony_ci    photoSession.addOutput(photoOutput);
219e41f4b71Sopenharmony_ci  } catch (error) {
220e41f4b71Sopenharmony_ci    let err = error as BusinessError;
221e41f4b71Sopenharmony_ci    console.error('Failed to addOutput(photoOutput). errorCode = ' + err.code);
222e41f4b71Sopenharmony_ci  }
223e41f4b71Sopenharmony_ci
224e41f4b71Sopenharmony_ci  // Commit the session configuration.
225e41f4b71Sopenharmony_ci  await photoSession.commitConfig();
226e41f4b71Sopenharmony_ci
227e41f4b71Sopenharmony_ci  // Start the session.
228e41f4b71Sopenharmony_ci  await photoSession.start().then(() => {
229e41f4b71Sopenharmony_ci    console.info('Promise returned to indicate the session start success.');
230e41f4b71Sopenharmony_ci  });
231e41f4b71Sopenharmony_ci  // Check whether the camera has flash.
232e41f4b71Sopenharmony_ci  let flashStatus: boolean = false;
233e41f4b71Sopenharmony_ci  try {
234e41f4b71Sopenharmony_ci    flashStatus = photoSession.hasFlash();
235e41f4b71Sopenharmony_ci  } catch (error) {
236e41f4b71Sopenharmony_ci    let err = error as BusinessError;
237e41f4b71Sopenharmony_ci    console.error('Failed to hasFlash. errorCode = ' + err.code);
238e41f4b71Sopenharmony_ci  }
239e41f4b71Sopenharmony_ci  console.info('Returned with the flash light support status:' + flashStatus);
240e41f4b71Sopenharmony_ci
241e41f4b71Sopenharmony_ci  if (flashStatus) {
242e41f4b71Sopenharmony_ci    // Check whether the auto flash mode is supported.
243e41f4b71Sopenharmony_ci    let flashModeStatus: boolean = false;
244e41f4b71Sopenharmony_ci    try {
245e41f4b71Sopenharmony_ci      let status: boolean = photoSession.isFlashModeSupported(camera.FlashMode.FLASH_MODE_AUTO);
246e41f4b71Sopenharmony_ci      flashModeStatus = status;
247e41f4b71Sopenharmony_ci    } catch (error) {
248e41f4b71Sopenharmony_ci      let err = error as BusinessError;
249e41f4b71Sopenharmony_ci      console.error('Failed to check whether the flash mode is supported. errorCode = ' + err.code);
250e41f4b71Sopenharmony_ci    }
251e41f4b71Sopenharmony_ci    if(flashModeStatus) {
252e41f4b71Sopenharmony_ci      // Set the flash mode to auto.
253e41f4b71Sopenharmony_ci      try {
254e41f4b71Sopenharmony_ci        photoSession.setFlashMode(camera.FlashMode.FLASH_MODE_AUTO);
255e41f4b71Sopenharmony_ci      } catch (error) {
256e41f4b71Sopenharmony_ci        let err = error as BusinessError;
257e41f4b71Sopenharmony_ci        console.error('Failed to set the flash mode. errorCode = ' + err.code);
258e41f4b71Sopenharmony_ci      }
259e41f4b71Sopenharmony_ci    }
260e41f4b71Sopenharmony_ci  }
261e41f4b71Sopenharmony_ci
262e41f4b71Sopenharmony_ci  // Check whether the continuous auto focus is supported.
263e41f4b71Sopenharmony_ci  let focusModeStatus: boolean = false;
264e41f4b71Sopenharmony_ci  try {
265e41f4b71Sopenharmony_ci    let status: boolean = photoSession.isFocusModeSupported(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO);
266e41f4b71Sopenharmony_ci    focusModeStatus = status;
267e41f4b71Sopenharmony_ci  } catch (error) {
268e41f4b71Sopenharmony_ci    let err = error as BusinessError;
269e41f4b71Sopenharmony_ci    console.error('Failed to check whether the focus mode is supported. errorCode = ' + err.code);
270e41f4b71Sopenharmony_ci  }
271e41f4b71Sopenharmony_ci
272e41f4b71Sopenharmony_ci  if (focusModeStatus) {
273e41f4b71Sopenharmony_ci    // Set the focus mode to continuous auto focus.
274e41f4b71Sopenharmony_ci    try {
275e41f4b71Sopenharmony_ci      photoSession.setFocusMode(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO);
276e41f4b71Sopenharmony_ci    } catch (error) {
277e41f4b71Sopenharmony_ci      let err = error as BusinessError;
278e41f4b71Sopenharmony_ci      console.error('Failed to set the focus mode. errorCode = ' + err.code);
279e41f4b71Sopenharmony_ci    }
280e41f4b71Sopenharmony_ci  }
281e41f4b71Sopenharmony_ci
282e41f4b71Sopenharmony_ci  // Obtain the zoom ratio range supported by the camera.
283e41f4b71Sopenharmony_ci  let zoomRatioRange: Array<number> = [];
284e41f4b71Sopenharmony_ci  try {
285e41f4b71Sopenharmony_ci    zoomRatioRange = photoSession.getZoomRatioRange();
286e41f4b71Sopenharmony_ci  } catch (error) {
287e41f4b71Sopenharmony_ci    let err = error as BusinessError;
288e41f4b71Sopenharmony_ci    console.error('Failed to get the zoom ratio range. errorCode = ' + err.code);
289e41f4b71Sopenharmony_ci  }
290e41f4b71Sopenharmony_ci  if (zoomRatioRange.length <= 0) {
291e41f4b71Sopenharmony_ci    return;
292e41f4b71Sopenharmony_ci  }
293e41f4b71Sopenharmony_ci  // Set a zoom ratio.
294e41f4b71Sopenharmony_ci  try {
295e41f4b71Sopenharmony_ci    photoSession.setZoomRatio(zoomRatioRange[0]);
296e41f4b71Sopenharmony_ci  } catch (error) {
297e41f4b71Sopenharmony_ci    let err = error as BusinessError;
298e41f4b71Sopenharmony_ci    console.error('Failed to set the zoom ratio value. errorCode = ' + err.code);
299e41f4b71Sopenharmony_ci  }
300e41f4b71Sopenharmony_ci  let photoCaptureSetting: camera.PhotoCaptureSetting = {
301e41f4b71Sopenharmony_ci    quality: camera.QualityLevel.QUALITY_LEVEL_HIGH, // Set the photo quality to high.
302e41f4b71Sopenharmony_ci    rotation: camera.ImageRotation.ROTATION_0 // Set the rotation angle of the photo to 0.
303e41f4b71Sopenharmony_ci  }
304e41f4b71Sopenharmony_ci  // Use the current photographing settings to take photos.
305e41f4b71Sopenharmony_ci  photoOutput.capture(photoCaptureSetting, (err: BusinessError) => {
306e41f4b71Sopenharmony_ci    if (err) {
307e41f4b71Sopenharmony_ci      console.error(`Failed to capture the photo ${err.message}`);
308e41f4b71Sopenharmony_ci      return;
309e41f4b71Sopenharmony_ci    }
310e41f4b71Sopenharmony_ci    console.info('Callback invoked to indicate the photo capture request success.');
311e41f4b71Sopenharmony_ci  });
312e41f4b71Sopenharmony_ci  // Stop the session.
313e41f4b71Sopenharmony_ci  photoSession.stop();
314e41f4b71Sopenharmony_ci
315e41f4b71Sopenharmony_ci  // Release the camera input stream.
316e41f4b71Sopenharmony_ci  cameraInput.close();
317e41f4b71Sopenharmony_ci
318e41f4b71Sopenharmony_ci  // Release the preview output stream.
319e41f4b71Sopenharmony_ci  previewOutput.release();
320e41f4b71Sopenharmony_ci
321e41f4b71Sopenharmony_ci  // Release the photo output stream.
322e41f4b71Sopenharmony_ci  photoOutput.release();
323e41f4b71Sopenharmony_ci
324e41f4b71Sopenharmony_ci  // Release the session.
325e41f4b71Sopenharmony_ci  photoSession.release();
326e41f4b71Sopenharmony_ci
327e41f4b71Sopenharmony_ci  // Set the session to null.
328e41f4b71Sopenharmony_ci  photoSession = undefined;
329e41f4b71Sopenharmony_ci}
330e41f4b71Sopenharmony_ci```
331