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- 配置相机的输入流和输出流。相机在拍摄前,必须完成输入输出流的配置。 14 配置输入流即添加设备输入,对用户而言,相当于选择设备的某一相机拍摄;配置输出流,即选择数据将以什么形式输出。当应用需要实现拍照时,输出流应配置为预览流和拍照流,预览流的数据将显示在XComponent组件上,拍照流的数据将通过ImageReceiver接口的能力保存到相册中。 15 16- 添加闪光灯、调整焦距等配置。具体支持的配置及接口说明请参考[Camera API参考](../../reference/apis-camera-kit/arkts-apis-camera.md)。 17 18- 会话切换控制。应用可以通过移除和添加输出流的方式,切换相机模式。如当前会话的输出流为拍照流,应用可以将拍照流移除,然后添加视频流作为输出流,即完成了拍照到录像的切换。 19 20完成会话配置后,应用提交和开启会话,可以开始调用相机相关功能。 21 22## 开发步骤 231. 导入相关接口,导入方法如下。 24 25 ```ts 26 import { camera } from '@kit.CameraKit'; 27 import { BusinessError } from '@kit.BasicServicesKit'; 28 ``` 29 302. 调用cameraManager中的[createSession](../../reference/apis-camera-kit/arkts-apis-camera-CameraManager.md#createsession11)方法创建一个会话。 31 32 ```ts 33 // 此处以videoSession为例。 34 function getSession(cameraManager: camera.CameraManager): camera.VideoSession | undefined { 35 let videoSession: camera.VideoSession | undefined = undefined; 36 try { 37 videoSession = cameraManager.createSession(camera.SceneMode.NORMAL_VIDEO) as camera.VideoSession; 38 } catch (error) { 39 let err = error as BusinessError; 40 console.error(`Failed to create the session instance. error: ${err.code}`); 41 } 42 return videoSession; 43 } 44 ``` 45 463. 调用VideoSession中的[beginConfig](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#beginconfig11)方法配置会话。 47 48 ```ts 49 function beginConfig(videoSession: camera.VideoSession): void { 50 try { 51 videoSession.beginConfig(); 52 } catch (error) { 53 let err = error as BusinessError; 54 console.error(`Failed to beginConfig. error: ${err.code}`); 55 } 56 } 57 ``` 58 594. 使能。向会话中添加相机的输入流和输出流,调用[addInput](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#addinput11)添加相机的输入流;调用[addOutput](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#addoutput11)添加相机的输出流。以下示例代码以添加预览流previewOutput和拍照流photoOutput为例,即当前模式支持拍照和预览。 60 调用VideoSession中的[commitConfig](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#commitconfig11)和[start](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#start11)方法提交相关配置,并启动会话。 61 62 > **说明:** 63 > 64 > 在调用[addOutput](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#addoutput11)添加相机的输出流前,可通过[canAddOutput](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#canaddoutput11)判断当前相机输出流是否可以添加到session中。 65 > 相机输入流cameraInput创建流程请参考[设备输入](camera-device-input.md),相机预览输出流previewOutput和拍照输出流photoOutput创建流程请分别参考[预览](camera-preview.md)和[拍照](camera-shooting.md)。 66 67 ```ts 68 async function startSession(videoSession: camera.VideoSession, cameraInput: camera.CameraInput, previewOutput: camera.PreviewOutput, photoOutput: camera.PhotoOutput): Promise<void> { 69 try { 70 videoSession.addInput(cameraInput); 71 } catch (error) { 72 let err = error as BusinessError; 73 console.error(`Failed to addInput. error: ${err.code}`); 74 } 75 let canAddPreviewOutput : boolean = false; 76 try { 77 canAddPreviewOutput = videoSession.canAddOutput(previewOutput); 78 } catch (error) { 79 let err = error as BusinessError; 80 console.error(`Failed to add previewOutput. error: ${err.code}`); 81 } 82 if (!canAddPreviewOutput) { 83 console.error(`Failed to add preview output.`); 84 return; 85 } 86 try { 87 videoSession.addOutput(previewOutput); 88 } catch (error) { 89 let err = error as BusinessError; 90 console.error(`Failed to add previewOutput. error: ${err.code}`); 91 } 92 let canAddPhotoOutput : boolean = false 93 try { 94 canAddPhotoOutput = videoSession.canAddOutput(photoOutput); 95 } catch (error) { 96 let err = error as BusinessError; 97 console.error(`Failed to add photoOutput error: ${err.code}`); 98 } 99 try { 100 videoSession.addOutput(photoOutput); 101 } catch (error) { 102 let err = error as BusinessError; 103 console.error(`Failed to add photoOutput. error: ${err.code}`); 104 } 105 try { 106 await videoSession.commitConfig(); 107 } catch (error) { 108 let err = error as BusinessError; 109 console.error(`Failed to commitConfig. error: ${err.code}`); 110 return; 111 } 112 113 try { 114 await videoSession.start(); 115 } catch (error) { 116 let err = error as BusinessError; 117 console.error(`Failed to start. error: ${err.code}`); 118 } 119 } 120 ``` 121 1225. 会话控制。调用VideoSession中的[stop](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#stop11)方法可以停止当前会话。调用[removeOutput](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#removeoutput11)和[addOutput](../../reference/apis-camera-kit/arkts-apis-camera-Session.md#addoutput11)方法可以完成会话切换控制。以下示例代码以移除拍照流photoOutput,添加视频流videoOutput为例,完成了拍照到录像的切换。 123 124 ```ts 125 async function switchOutput(videoSession: camera.VideoSession, videoOutput: camera.VideoOutput, photoOutput: camera.PhotoOutput): Promise<void> { 126 try { 127 await videoSession.stop(); 128 } catch (error) { 129 let err = error as BusinessError; 130 console.error(`Failed to stop. error: ${err.code}`); 131 } 132 133 try { 134 videoSession.beginConfig(); 135 } catch (error) { 136 let err = error as BusinessError; 137 console.error(`Failed to beginConfig. error: ${err.code}`); 138 } 139 // 从会话中移除拍照输出流。 140 try { 141 videoSession.removeOutput(photoOutput); 142 } catch (error) { 143 let err = error as BusinessError; 144 console.error(`Failed to remove photoOutput. error: ${err.code}`); 145 } 146 try { 147 videoSession.canAddOutput(videoOutput); 148 } catch (error) { 149 let err = error as BusinessError; 150 console.error(`Failed to add videoOutput error: ${err.code}`); 151 } 152 // 向会话中添加视频输出流。 153 try { 154 videoSession.addOutput(videoOutput); 155 } catch (error) { 156 let err = error as BusinessError; 157 console.error(`Failed to add videoOutput. error: ${err.code}`); 158 } 159 try { 160 await videoSession.commitConfig(); 161 } catch (error) { 162 let err = error as BusinessError; 163 console.error(`Failed to commitConfig. error: ${err.code}`); 164 } 165 166 try { 167 await videoSession.start(); 168 } catch (error) { 169 let err = error as BusinessError; 170 console.error(`Failed to start. error: ${err.code}`); 171 } 172 } 173 ``` 174