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 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