1# 会话管理(ArkTS)
2
3相机使用预览、拍照、录像、元数据功能前,均需要创建相机会话。
4
5在会话中,可以完成以下功能:
6
7- 配置相机的输入流和输出流。相机在拍摄前,必须完成输入输出流的配置。
8  配置输入流即添加设备输入,对用户而言,相当于选择设备的某一摄像头拍摄;配置输出流,即选择数据将以什么形式输出。当应用需要实现拍照时,输出流应配置为预览流和拍照流,预览流的数据将显示在XComponent组件上,拍照流的数据将通过ImageReceiver接口的能力保存到相册中。
9
10- 添加闪光灯、调整焦距等配置。具体支持的配置及接口说明请参考[Camera API参考](../../reference/apis-camera-kit/js-apis-camera.md)。
11
12- 会话切换控制。应用可以通过移除和添加输出流的方式,切换相机模式。如当前会话的输出流为拍照流,应用可以将拍照流移除,然后添加视频流作为输出流,即完成了拍照到录像的切换。
13
14完成会话配置后,应用提交和开启会话,可以开始调用相机相关功能。
15
16## 开发步骤
171. 导入相关接口,导入方法如下。
18
19   ```ts
20   import { camera } from '@kit.CameraKit';
21   import { BusinessError } from '@kit.BasicServicesKit';
22   ```
23
242. 调用cameraManager类中的[createSession](../../reference/apis-camera-kit/js-apis-camera.md#createsession11)方法创建一个会话。
25
26   ```ts
27   function getSession(cameraManager: camera.CameraManager): camera.Session | undefined {
28     let session: camera.Session | undefined = undefined;
29     try {
30       session = cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO) as camera.PhotoSession;
31     } catch (error) {
32       let err = error as BusinessError;
33       console.error(`Failed to create the session instance. error: ${JSON.stringify(err)}`);
34     }
35     return session;
36   }
37   ```
38
393. 调用PhotoSession类中的[beginConfig](../../reference/apis-camera-kit/js-apis-camera.md#beginconfig11)方法配置会话。
40
41   ```ts
42   function beginConfig(photoSession: camera.PhotoSession): void {
43     try {
44       photoSession.beginConfig();
45     } catch (error) {
46       let err = error as BusinessError;
47       console.error(`Failed to beginConfig. error: ${JSON.stringify(err)}`);
48     }
49   }
50   ```
51
524. 使能。向会话中添加相机的输入流和输出流,调用[addInput](../../reference/apis-camera-kit/js-apis-camera.md#addinput11)添加相机的输入流;调用[addOutput](../../reference/apis-camera-kit/js-apis-camera.md#addoutput11)添加相机的输出流。以下示例代码以添加预览流previewOutput和拍照流photoOutput为例,即当前模式支持拍照和预览。
53     调用PhotoSession类中的[commitConfig](../../reference/apis-camera-kit/js-apis-camera.md#commitconfig11)和[start](../../reference/apis-camera-kit/js-apis-camera.md#start11)方法提交相关配置,并启动会话。
54   ```ts
55   async function startSession(photoSession: camera.PhotoSession, cameraInput: camera.CameraInput, previewOutput: camera.PreviewOutput, photoOutput: camera.PhotoOutput): Promise<void> {
56     try {
57       photoSession.addInput(cameraInput);
58     } catch (error) {
59       let err = error as BusinessError;
60       console.error(`Failed to addInput. error: ${JSON.stringify(err)}`);
61     }
62     try {
63       photoSession.addOutput(previewOutput);
64     } catch (error) {
65       let err = error as BusinessError;
66       console.error(`Failed to add previewOutput. error: ${JSON.stringify(err)}`);
67     }
68     try {
69       photoSession.addOutput(photoOutput);
70     } catch (error) {
71       let err = error as BusinessError;
72       console.error(`Failed to add photoOutput. error: ${JSON.stringify(err)}`);
73     }
74     try {
75       await photoSession.commitConfig();
76     } catch (error) {
77       let err = error as BusinessError;
78       console.error(`Failed to commitConfig. error: ${JSON.stringify(err)}`);
79     }
80
81     try {
82       await photoSession.start();
83     } catch (error) {
84       let err = error as BusinessError;
85       console.error(`Failed to start. error: ${JSON.stringify(err)}`);
86     }
87   }
88   ```
89
905. 会话控制。调用PhotoSession类中的[stop](../../reference/apis-camera-kit/js-apis-camera.md#stop11)方法可以停止当前会话。调用[removeOutput](../../reference/apis-camera-kit/js-apis-camera.md#removeoutput11)和[addOutput](../../reference/apis-camera-kit/js-apis-camera.md#addoutput11)方法可以完成会话切换控制。以下示例代码以移除拍照流photoOutput,添加视频流videoOutput为例,完成了拍照到录像的切换。
91
92   ```ts
93   async function switchOutput(photoSession: camera.PhotoSession, videoOutput: camera.VideoOutput, photoOutput: camera.PhotoOutput): Promise<void> {
94     try {
95       await photoSession.stop();
96     } catch (error) {
97       let err = error as BusinessError;
98       console.error(`Failed to stop. error: ${JSON.stringify(err)}`);
99     }
100
101     try {
102       photoSession.beginConfig();
103     } catch (error) {
104       let err = error as BusinessError;
105       console.error(`Failed to beginConfig. error: ${JSON.stringify(err)}`);
106     }
107     // 从会话中移除拍照输出流
108     try {
109       photoSession.removeOutput(photoOutput);
110     } catch (error) {
111       let err = error as BusinessError;
112       console.error(`Failed to remove photoOutput. error: ${JSON.stringify(err)}`);
113     }
114     // 向会话中添加视频输出流
115     try {
116       photoSession.addOutput(videoOutput);
117     } catch (error) {
118       let err = error as BusinessError;
119       console.error(`Failed to add videoOutput. error: ${JSON.stringify(err)}`);
120     }
121   }
122   ```
123