1e41f4b71Sopenharmony_ci# High-Performance Camera Photographing Sample (for System Applications Only) (ArkTS)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ciThis topic provides sample code that covers the complete high-performance 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 [High-Performance Camera Photographing (for System Applications Only) (ArkTS)](camera-deferred-photo.md), [Device Input Management](camera-device-input.md), [Camera Session Management](camera-session-management.md), and [Camera Photographing](camera-shooting.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![deferred-photo-development-process](figures/deferred-photo-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_ci// Flush the original image in write-file mode.
28e41f4b71Sopenharmony_ciasync function savePicture(photoObj: camera.Photo): Promise<void> {
29e41f4b71Sopenharmony_ci  let accessHelper = photoAccessHelper.getPhotoAccessHelper(context);
30e41f4b71Sopenharmony_ci  let testFileName = 'testFile' + Date.now() + '.jpg';
31e41f4b71Sopenharmony_ci  // To call createAsset(), the application must have the ohos.permission.READ_IMAGEVIDEO and ohos.permission.WRITE_IMAGEVIDEO permissions.
32e41f4b71Sopenharmony_ci  let photoAsset = await accessHelper.createAsset(testFileName);
33e41f4b71Sopenharmony_ci  const fd = await photoAsset.open('rw');
34e41f4b71Sopenharmony_ci  let buffer: ArrayBuffer | undefined = undefined;
35e41f4b71Sopenharmony_ci  photoObj.main.getComponent(image.ComponentType.JPEG, (errCode: BusinessError, component: image.Component): void => {
36e41f4b71Sopenharmony_ci    if (errCode || component === undefined) {
37e41f4b71Sopenharmony_ci      console.error('getComponent failed');
38e41f4b71Sopenharmony_ci      return;
39e41f4b71Sopenharmony_ci    }
40e41f4b71Sopenharmony_ci    if (component.byteBuffer) {
41e41f4b71Sopenharmony_ci      buffer = component.byteBuffer;
42e41f4b71Sopenharmony_ci    } else {
43e41f4b71Sopenharmony_ci      console.error('byteBuffer is null');
44e41f4b71Sopenharmony_ci      return;
45e41f4b71Sopenharmony_ci    }
46e41f4b71Sopenharmony_ci  });
47e41f4b71Sopenharmony_ci  if (buffer) {
48e41f4b71Sopenharmony_ci    await fs.write(fd, buffer);
49e41f4b71Sopenharmony_ci  }
50e41f4b71Sopenharmony_ci  await photoAsset.close(fd);
51e41f4b71Sopenharmony_ci  await photoObj.release(); 
52e41f4b71Sopenharmony_ci}
53e41f4b71Sopenharmony_ci
54e41f4b71Sopenharmony_ci// Flush the thumbnail by calling the mediaLibrary API.
55e41f4b71Sopenharmony_ciasync function saveDeferredPhoto(proxyObj: camera.DeferredPhotoProxy): Promise<void> {    
56e41f4b71Sopenharmony_ci  try {
57e41f4b71Sopenharmony_ci    // Create a photoAsset.
58e41f4b71Sopenharmony_ci    let accessHelper = photoAccessHelper.getPhotoAccessHelper(context);
59e41f4b71Sopenharmony_ci    let testFileName = 'testFile' + Date.now() + '.jpg';
60e41f4b71Sopenharmony_ci    let photoAsset = await accessHelper.createAsset(testFileName);
61e41f4b71Sopenharmony_ci    // Pass the thumbnail proxy class object to the mediaLibrary.
62e41f4b71Sopenharmony_ci    let mediaRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(photoAsset);
63e41f4b71Sopenharmony_ci    mediaRequest.addResource(photoAccessHelper.ResourceType.PHOTO_PROXY, proxyObj);
64e41f4b71Sopenharmony_ci    let res = await accessHelper.applyChanges(mediaRequest);
65e41f4b71Sopenharmony_ci    console.info('saveDeferredPhoto success.');
66e41f4b71Sopenharmony_ci  } catch (err) {
67e41f4b71Sopenharmony_ci    console.error(`Failed to saveDeferredPhoto. error: ${JSON.stringify(err)}`);
68e41f4b71Sopenharmony_ci  }
69e41f4b71Sopenharmony_ci}
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ciasync function deferredPhotoCase(baseContext: common.BaseContext, surfaceId: string): Promise<void> {
72e41f4b71Sopenharmony_ci  // Create a CameraManager object.
73e41f4b71Sopenharmony_ci  let cameraManager: camera.CameraManager = camera.getCameraManager(baseContext);
74e41f4b71Sopenharmony_ci  if (!cameraManager) {
75e41f4b71Sopenharmony_ci    console.error("camera.getCameraManager error");
76e41f4b71Sopenharmony_ci    return;
77e41f4b71Sopenharmony_ci  }
78e41f4b71Sopenharmony_ci  // Listen for camera status changes.
79e41f4b71Sopenharmony_ci  cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => {
80e41f4b71Sopenharmony_ci    if (err !== undefined && err.code !== 0) {
81e41f4b71Sopenharmony_ci      console.error(`cameraStatus with errorCode: ${err.code}`);
82e41f4b71Sopenharmony_ci      return;
83e41f4b71Sopenharmony_ci    }
84e41f4b71Sopenharmony_ci    console.info(`camera : ${cameraStatusInfo.camera.cameraId}`);
85e41f4b71Sopenharmony_ci    console.info(`status: ${cameraStatusInfo.status}`);
86e41f4b71Sopenharmony_ci  });
87e41f4b71Sopenharmony_ci
88e41f4b71Sopenharmony_ci  // Obtain the camera list.
89e41f4b71Sopenharmony_ci  let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras();
90e41f4b71Sopenharmony_ci  if (cameraArray.length <= 0) {
91e41f4b71Sopenharmony_ci    console.error("cameraManager.getSupportedCameras error");
92e41f4b71Sopenharmony_ci    return;
93e41f4b71Sopenharmony_ci  }
94e41f4b71Sopenharmony_ci
95e41f4b71Sopenharmony_ci  for (let index = 0; index < cameraArray.length; index++) {
96e41f4b71Sopenharmony_ci    console.info('cameraId : ' + cameraArray[index].cameraId);                          // Obtain the camera ID.
97e41f4b71Sopenharmony_ci    console.info('cameraPosition : ' + cameraArray[index].cameraPosition);              // Obtain the camera position.
98e41f4b71Sopenharmony_ci    console.info('cameraType : ' + cameraArray[index].cameraType);                      // Obtain the camera type.
99e41f4b71Sopenharmony_ci    console.info('connectionType : ' + cameraArray[index].connectionType);              // Obtain the camera connection type.
100e41f4b71Sopenharmony_ci  }
101e41f4b71Sopenharmony_ci
102e41f4b71Sopenharmony_ci  // Create a camera input stream.
103e41f4b71Sopenharmony_ci  let cameraInput: camera.CameraInput | undefined = undefined;
104e41f4b71Sopenharmony_ci  try {
105e41f4b71Sopenharmony_ci    cameraInput = cameraManager.createCameraInput(cameraArray[0]);
106e41f4b71Sopenharmony_ci  } catch (error) {
107e41f4b71Sopenharmony_ci    let err = error as BusinessError;
108e41f4b71Sopenharmony_ci    console.error('Failed to createCameraInput errorCode = ' + err.code);
109e41f4b71Sopenharmony_ci  }
110e41f4b71Sopenharmony_ci  if (cameraInput === undefined) {
111e41f4b71Sopenharmony_ci    return;
112e41f4b71Sopenharmony_ci  }
113e41f4b71Sopenharmony_ci
114e41f4b71Sopenharmony_ci  // Listen for camera input errors.
115e41f4b71Sopenharmony_ci  let cameraDevice: camera.CameraDevice = cameraArray[0];
116e41f4b71Sopenharmony_ci  cameraInput.on('error', cameraDevice, (error: BusinessError) => {
117e41f4b71Sopenharmony_ci    console.error(`Camera input error code: ${error.code}`);
118e41f4b71Sopenharmony_ci  })
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ci  // Open a camera.
121e41f4b71Sopenharmony_ci  await cameraInput.open();
122e41f4b71Sopenharmony_ci
123e41f4b71Sopenharmony_ci  // Obtain the supported modes.
124e41f4b71Sopenharmony_ci  let sceneModes: Array<camera.SceneMode> = cameraManager.getSupportedSceneModes(cameraArray[0]);
125e41f4b71Sopenharmony_ci  let isSupportPhotoMode: boolean = sceneModes.indexOf(camera.SceneMode.NORMAL_PHOTO) >= 0;
126e41f4b71Sopenharmony_ci  if (!isSupportPhotoMode) {
127e41f4b71Sopenharmony_ci    console.error('photo mode not support');
128e41f4b71Sopenharmony_ci    return;
129e41f4b71Sopenharmony_ci  }
130e41f4b71Sopenharmony_ci  // Obtain the output streams supported by the camera.
131e41f4b71Sopenharmony_ci  let cameraOutputCap: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0], camera.SceneMode.NORMAL_PHOTO);
132e41f4b71Sopenharmony_ci  if (!cameraOutputCap) {
133e41f4b71Sopenharmony_ci    console.error("cameraManager.getSupportedOutputCapability error");
134e41f4b71Sopenharmony_ci    return;
135e41f4b71Sopenharmony_ci  }
136e41f4b71Sopenharmony_ci  console.info("outputCapability: " + JSON.stringify(cameraOutputCap));
137e41f4b71Sopenharmony_ci
138e41f4b71Sopenharmony_ci  let previewProfilesArray: Array<camera.Profile> = cameraOutputCap.previewProfiles;
139e41f4b71Sopenharmony_ci  if (!previewProfilesArray) {
140e41f4b71Sopenharmony_ci    console.error("createOutput previewProfilesArray == null || undefined");
141e41f4b71Sopenharmony_ci  }
142e41f4b71Sopenharmony_ci
143e41f4b71Sopenharmony_ci  let photoProfilesArray: Array<camera.Profile> = cameraOutputCap.photoProfiles;
144e41f4b71Sopenharmony_ci  if (!photoProfilesArray) {
145e41f4b71Sopenharmony_ci    console.error("createOutput photoProfilesArray == null || undefined");
146e41f4b71Sopenharmony_ci  }
147e41f4b71Sopenharmony_ci
148e41f4b71Sopenharmony_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.
149e41f4b71Sopenharmony_ci  let previewOutput: camera.PreviewOutput | undefined = undefined;
150e41f4b71Sopenharmony_ci  try {
151e41f4b71Sopenharmony_ci    previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId);
152e41f4b71Sopenharmony_ci  } catch (error) {
153e41f4b71Sopenharmony_ci    let err = error as BusinessError;
154e41f4b71Sopenharmony_ci    console.error(`Failed to create the PreviewOutput instance. error code: ${err.code}`);
155e41f4b71Sopenharmony_ci  }
156e41f4b71Sopenharmony_ci  if (previewOutput === undefined) {
157e41f4b71Sopenharmony_ci    return;
158e41f4b71Sopenharmony_ci  }
159e41f4b71Sopenharmony_ci  // Listen for preview output errors.
160e41f4b71Sopenharmony_ci  previewOutput.on('error', (error: BusinessError) => {
161e41f4b71Sopenharmony_ci    console.error(`Preview output error code: ${error.code}`);
162e41f4b71Sopenharmony_ci  });
163e41f4b71Sopenharmony_ci  // Create a photo output stream.
164e41f4b71Sopenharmony_ci  let photoOutput: camera.PhotoOutput | undefined = undefined;
165e41f4b71Sopenharmony_ci  try {
166e41f4b71Sopenharmony_ci    photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0]);
167e41f4b71Sopenharmony_ci  } catch (error) {
168e41f4b71Sopenharmony_ci    let err = error as BusinessError;
169e41f4b71Sopenharmony_ci    console.error('Failed to createPhotoOutput errorCode = ' + err.code);
170e41f4b71Sopenharmony_ci  }
171e41f4b71Sopenharmony_ci  if (photoOutput === undefined) {
172e41f4b71Sopenharmony_ci    return;
173e41f4b71Sopenharmony_ci  }
174e41f4b71Sopenharmony_ci  // Create a session.
175e41f4b71Sopenharmony_ci  let photoSession: camera.PhotoSession | undefined = undefined;
176e41f4b71Sopenharmony_ci  try {
177e41f4b71Sopenharmony_ci    photoSession = cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO) as camera.PhotoSession;
178e41f4b71Sopenharmony_ci  } catch (error) {
179e41f4b71Sopenharmony_ci    let err = error as BusinessError;
180e41f4b71Sopenharmony_ci    console.error('Failed to create the photoSession instance. errorCode = ' + err.code);
181e41f4b71Sopenharmony_ci  }
182e41f4b71Sopenharmony_ci  if (photoSession === undefined) {
183e41f4b71Sopenharmony_ci    return;
184e41f4b71Sopenharmony_ci  }
185e41f4b71Sopenharmony_ci  // Listen for session errors.
186e41f4b71Sopenharmony_ci  photoSession.on('error', (error: BusinessError) => {
187e41f4b71Sopenharmony_ci    console.error(`Capture session error code: ${error.code}`);
188e41f4b71Sopenharmony_ci  });
189e41f4b71Sopenharmony_ci
190e41f4b71Sopenharmony_ci  // Start configuration for the session.
191e41f4b71Sopenharmony_ci  try {
192e41f4b71Sopenharmony_ci    photoSession.beginConfig();
193e41f4b71Sopenharmony_ci  } catch (error) {
194e41f4b71Sopenharmony_ci    let err = error as BusinessError;
195e41f4b71Sopenharmony_ci    console.error('Failed to beginConfig. errorCode = ' + err.code);
196e41f4b71Sopenharmony_ci  }
197e41f4b71Sopenharmony_ci
198e41f4b71Sopenharmony_ci  // Add the camera input stream to the session.
199e41f4b71Sopenharmony_ci  try {
200e41f4b71Sopenharmony_ci    photoSession.addInput(cameraInput);
201e41f4b71Sopenharmony_ci  } catch (error) {
202e41f4b71Sopenharmony_ci    let err = error as BusinessError;
203e41f4b71Sopenharmony_ci    console.error('Failed to addInput. errorCode = ' + err.code);
204e41f4b71Sopenharmony_ci  }
205e41f4b71Sopenharmony_ci
206e41f4b71Sopenharmony_ci  // Add the preview output stream to the session.
207e41f4b71Sopenharmony_ci  try {
208e41f4b71Sopenharmony_ci    photoSession.addOutput(previewOutput);
209e41f4b71Sopenharmony_ci  } catch (error) {
210e41f4b71Sopenharmony_ci    let err = error as BusinessError;
211e41f4b71Sopenharmony_ci    console.error('Failed to addOutput(previewOutput). errorCode = ' + err.code);
212e41f4b71Sopenharmony_ci  }
213e41f4b71Sopenharmony_ci
214e41f4b71Sopenharmony_ci  // Add the photo output stream to the session.
215e41f4b71Sopenharmony_ci  try {
216e41f4b71Sopenharmony_ci    photoSession.addOutput(photoOutput);
217e41f4b71Sopenharmony_ci  } catch (error) {
218e41f4b71Sopenharmony_ci    let err = error as BusinessError;
219e41f4b71Sopenharmony_ci    console.error('Failed to addOutput(photoOutput). errorCode = ' + err.code);
220e41f4b71Sopenharmony_ci  }
221e41f4b71Sopenharmony_ci
222e41f4b71Sopenharmony_ci  // Register a callback to listen for original images.
223e41f4b71Sopenharmony_ci  photoOutput.on('photoAvailable', (err: BusinessError, photoObj: camera.Photo): void => {
224e41f4b71Sopenharmony_ci    if (err) {
225e41f4b71Sopenharmony_ci      console.info(`photoAvailable error: ${JSON.stringify(err)}.`);
226e41f4b71Sopenharmony_ci      return;
227e41f4b71Sopenharmony_ci    }
228e41f4b71Sopenharmony_ci    savePicture(photoObj).then(() => {
229e41f4b71Sopenharmony_ci      // Release the photo object after the flushing is complete.
230e41f4b71Sopenharmony_ci      photoObj.release();
231e41f4b71Sopenharmony_ci    });
232e41f4b71Sopenharmony_ci  });
233e41f4b71Sopenharmony_ci
234e41f4b71Sopenharmony_ci  // Register a callback to listen for thumbnail proxies.
235e41f4b71Sopenharmony_ci  photoOutput.on('deferredPhotoProxyAvailable', (err: BusinessError, proxyObj: camera.DeferredPhotoProxy): void => {
236e41f4b71Sopenharmony_ci    if (err) {
237e41f4b71Sopenharmony_ci      console.info(`deferredPhotoProxyAvailable error: ${JSON.stringify(err)}.`);
238e41f4b71Sopenharmony_ci      return;
239e41f4b71Sopenharmony_ci    }
240e41f4b71Sopenharmony_ci    console.info('photoOutPutCallBack deferredPhotoProxyAvailable');
241e41f4b71Sopenharmony_ci    // Obtain the pixel map of a thumbnail.
242e41f4b71Sopenharmony_ci    proxyObj.getThumbnail().then((thumbnail: image.PixelMap) => {
243e41f4b71Sopenharmony_ci      AppStorage.setOrCreate('proxyThumbnail', thumbnail); 
244e41f4b71Sopenharmony_ci    });
245e41f4b71Sopenharmony_ci    // Call the mediaLibrary API to flush the thumbnail.
246e41f4b71Sopenharmony_ci    saveDeferredPhoto(proxyObj).then(() => {
247e41f4b71Sopenharmony_ci      // Release the thumbnail proxy class object after the flushing is complete.
248e41f4b71Sopenharmony_ci      proxyObj.release();
249e41f4b71Sopenharmony_ci    });
250e41f4b71Sopenharmony_ci  });
251e41f4b71Sopenharmony_ci    
252e41f4b71Sopenharmony_ci  // Check whether deferred photo delivery is supported.
253e41f4b71Sopenharmony_ci  let isSupportDeferred: boolean = photoOutput.isDeferredImageDeliverySupported(camera.DeferredDeliveryImageType.PHOTO);
254e41f4b71Sopenharmony_ci  console.info('isDeferredImageDeliverySupported res:' + isSupportDeferred);
255e41f4b71Sopenharmony_ci  if (isSupportDeferred) {
256e41f4b71Sopenharmony_ci    // Enable deferred photo delivery.
257e41f4b71Sopenharmony_ci	photoOutput.deferImageDelivery(camera.DeferredDeliveryImageType.PHOTO);
258e41f4b71Sopenharmony_ci    // Check whether deferred photo delivery is enabled.
259e41f4b71Sopenharmony_ci    let isSupportEnabled: boolean = photoOutput.isDeferredImageDeliveryEnabled(camera.DeferredDeliveryImageType.PHOTO);
260e41f4b71Sopenharmony_ci    console.info('isDeferredImageDeliveryEnabled res:' + isSupportEnabled);
261e41f4b71Sopenharmony_ci  }
262e41f4b71Sopenharmony_ci
263e41f4b71Sopenharmony_ci  // Commit the session configuration.
264e41f4b71Sopenharmony_ci  await photoSession.commitConfig();
265e41f4b71Sopenharmony_ci
266e41f4b71Sopenharmony_ci  // Start the session.
267e41f4b71Sopenharmony_ci  await photoSession.start().then(() => {
268e41f4b71Sopenharmony_ci    console.info('Promise returned to indicate the session start success.');
269e41f4b71Sopenharmony_ci  });
270e41f4b71Sopenharmony_ci  // Check whether the camera has flash.
271e41f4b71Sopenharmony_ci  let flashStatus: boolean = false;
272e41f4b71Sopenharmony_ci  try {
273e41f4b71Sopenharmony_ci    flashStatus = photoSession.hasFlash();
274e41f4b71Sopenharmony_ci  } catch (error) {
275e41f4b71Sopenharmony_ci    let err = error as BusinessError;
276e41f4b71Sopenharmony_ci    console.error('Failed to hasFlash. errorCode = ' + err.code);
277e41f4b71Sopenharmony_ci  }
278e41f4b71Sopenharmony_ci  console.info('Returned with the flash light support status:' + flashStatus);
279e41f4b71Sopenharmony_ci
280e41f4b71Sopenharmony_ci  if (flashStatus) {
281e41f4b71Sopenharmony_ci    // Check whether the auto flash mode is supported.
282e41f4b71Sopenharmony_ci    let flashModeStatus: boolean = false;
283e41f4b71Sopenharmony_ci    try {
284e41f4b71Sopenharmony_ci      let status: boolean = photoSession.isFlashModeSupported(camera.FlashMode.FLASH_MODE_AUTO);
285e41f4b71Sopenharmony_ci      flashModeStatus = status;
286e41f4b71Sopenharmony_ci    } catch (error) {
287e41f4b71Sopenharmony_ci      let err = error as BusinessError;
288e41f4b71Sopenharmony_ci      console.error('Failed to check whether the flash mode is supported. errorCode = ' + err.code);
289e41f4b71Sopenharmony_ci    }
290e41f4b71Sopenharmony_ci    if(flashModeStatus) {
291e41f4b71Sopenharmony_ci      // Set the flash mode to auto.
292e41f4b71Sopenharmony_ci      try {
293e41f4b71Sopenharmony_ci        photoSession.setFlashMode(camera.FlashMode.FLASH_MODE_AUTO);
294e41f4b71Sopenharmony_ci      } catch (error) {
295e41f4b71Sopenharmony_ci        let err = error as BusinessError;
296e41f4b71Sopenharmony_ci        console.error('Failed to set the flash mode. errorCode = ' + err.code);
297e41f4b71Sopenharmony_ci      }
298e41f4b71Sopenharmony_ci    }
299e41f4b71Sopenharmony_ci  }
300e41f4b71Sopenharmony_ci
301e41f4b71Sopenharmony_ci  // Check whether the continuous auto focus is supported.
302e41f4b71Sopenharmony_ci  let focusModeStatus: boolean = false;
303e41f4b71Sopenharmony_ci  try {
304e41f4b71Sopenharmony_ci    let status: boolean = photoSession.isFocusModeSupported(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO);
305e41f4b71Sopenharmony_ci    focusModeStatus = status;
306e41f4b71Sopenharmony_ci  } catch (error) {
307e41f4b71Sopenharmony_ci    let err = error as BusinessError;
308e41f4b71Sopenharmony_ci    console.error('Failed to check whether the focus mode is supported. errorCode = ' + err.code);
309e41f4b71Sopenharmony_ci  }
310e41f4b71Sopenharmony_ci
311e41f4b71Sopenharmony_ci  if (focusModeStatus) {
312e41f4b71Sopenharmony_ci    // Set the focus mode to continuous auto focus.
313e41f4b71Sopenharmony_ci    try {
314e41f4b71Sopenharmony_ci      photoSession.setFocusMode(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO);
315e41f4b71Sopenharmony_ci    } catch (error) {
316e41f4b71Sopenharmony_ci      let err = error as BusinessError;
317e41f4b71Sopenharmony_ci      console.error('Failed to set the focus mode. errorCode = ' + err.code);
318e41f4b71Sopenharmony_ci    }
319e41f4b71Sopenharmony_ci  }
320e41f4b71Sopenharmony_ci
321e41f4b71Sopenharmony_ci  // Obtain the zoom ratio range supported by the camera.
322e41f4b71Sopenharmony_ci  let zoomRatioRange: Array<number> = [];
323e41f4b71Sopenharmony_ci  try {
324e41f4b71Sopenharmony_ci    zoomRatioRange = photoSession.getZoomRatioRange();
325e41f4b71Sopenharmony_ci  } catch (error) {
326e41f4b71Sopenharmony_ci    let err = error as BusinessError;
327e41f4b71Sopenharmony_ci    console.error('Failed to get the zoom ratio range. errorCode = ' + err.code);
328e41f4b71Sopenharmony_ci  }
329e41f4b71Sopenharmony_ci  if (zoomRatioRange.length <= 0) {
330e41f4b71Sopenharmony_ci    return;
331e41f4b71Sopenharmony_ci  }
332e41f4b71Sopenharmony_ci  // Set a zoom ratio.
333e41f4b71Sopenharmony_ci  try {
334e41f4b71Sopenharmony_ci    photoSession.setZoomRatio(zoomRatioRange[0]);
335e41f4b71Sopenharmony_ci  } catch (error) {
336e41f4b71Sopenharmony_ci    let err = error as BusinessError;
337e41f4b71Sopenharmony_ci    console.error('Failed to set the zoom ratio value. errorCode = ' + err.code);
338e41f4b71Sopenharmony_ci  }
339e41f4b71Sopenharmony_ci  let photoCaptureSetting: camera.PhotoCaptureSetting = {
340e41f4b71Sopenharmony_ci    quality: camera.QualityLevel.QUALITY_LEVEL_HIGH, // Set the photo quality to high.
341e41f4b71Sopenharmony_ci    rotation: camera.ImageRotation.ROTATION_0 // Set the rotation angle of the photo to 0.
342e41f4b71Sopenharmony_ci  }
343e41f4b71Sopenharmony_ci  // Use the current photographing settings to take photos.
344e41f4b71Sopenharmony_ci  photoOutput.capture(photoCaptureSetting, (err: BusinessError) => {
345e41f4b71Sopenharmony_ci    if (err) {
346e41f4b71Sopenharmony_ci      console.error(`Failed to capture the photo ${err.message}`);
347e41f4b71Sopenharmony_ci      return;
348e41f4b71Sopenharmony_ci    }
349e41f4b71Sopenharmony_ci    console.info('Callback invoked to indicate the photo capture request success.');
350e41f4b71Sopenharmony_ci  });
351e41f4b71Sopenharmony_ci  // Stop the session.
352e41f4b71Sopenharmony_ci  photoSession.stop();
353e41f4b71Sopenharmony_ci
354e41f4b71Sopenharmony_ci  // Release the camera input stream.
355e41f4b71Sopenharmony_ci  cameraInput.close();
356e41f4b71Sopenharmony_ci
357e41f4b71Sopenharmony_ci  // Release the preview output stream.
358e41f4b71Sopenharmony_ci  previewOutput.release();
359e41f4b71Sopenharmony_ci
360e41f4b71Sopenharmony_ci  // Release the photo output stream.
361e41f4b71Sopenharmony_ci  photoOutput.release();
362e41f4b71Sopenharmony_ci
363e41f4b71Sopenharmony_ci  // Release the session.
364e41f4b71Sopenharmony_ci  photoSession.release();
365e41f4b71Sopenharmony_ci
366e41f4b71Sopenharmony_ci  // Set the session to null.
367e41f4b71Sopenharmony_ci  photoSession = undefined;
368e41f4b71Sopenharmony_ci}
369e41f4b71Sopenharmony_ci```
370