• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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