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