

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将应用内通话、Web 通话、视频通话和屏幕共享原生集成到您的应用程序中
<a name="config-com-widget2"></a>

将 Amazon Connect 应用内通话、Web 通话、视频通话和屏幕共享原生集成到您的应用程序中

1. 使用 Amazon Connect [StartWebRTCContact](https://docs.aws.amazon.com/connect/latest/APIReference/API_StartWebRTCContact.html)API 创建联系人。

1. 然后使用 API 调用返回的详细信息使用[适用于 iOS](https://github.com/aws/amazon-chime-sdk-ios)、[Andro](https://github.com/aws/amazon-chime-sdk-android) id 或的 Amazon Chime 客户端库加入通话[JavaScript](https://github.com/aws/amazon-chime-sdk-js)。

有关创建额外参与者的信息，请参阅[启用多用户应用内通话、Web 通话和视频通话](enable-multiuser-inapp.md)。

有关示例应用程序，请参阅以下 Github 存储库：[amazon-connect-in-app-调用](https://github.com/amazon-connect/amazon-connect-in-app-calling-examples)示例。

**Topics**
+ [客户端设备如何发起应用内通话或网络通话](#diagram-option2)
+ [开始使用](#diagram-option2-gs)
+ [选项步骤](#optional-steps)

## 客户端设备如何发起应用内通话或网络通话
<a name="diagram-option2"></a>

下图显示了客户端设备（移动应用程序或浏览器）发起应用内通话或网络通话的事件顺序。

![\[显示客户端设备如何发起通话的概念图。\]](http://docs.aws.amazon.com/zh_cn/connect/latest/adminguide/images/netra-gs-diagram.png)


1. 客户使用客户端应用程序（网站或应用程序）发起应用内通话或网络通话。

1. 客户端应用程序（网站或移动应用程序）或 Web 服务器使用 Amazon Connect [StartWebRTCContact](https://docs.aws.amazon.com/connect/latest/APIReference/API_StartWebRTCContact.html)API 启动联系人，向其传递任何属性或上下文 Amazon Connect。

1. 客户端应用程序使用步骤 2 [StartWebRTCContact](https://docs.aws.amazon.com/connect/latest/APIReference/API_StartWebRTCContact.html)中返回的详细信息加入呼叫。

1. （可选）客户端使用 [CreateParticipantConnection](https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_CreateParticipantConnection.html)API 接收用于通过 API 发送 DTMF 的[SendMessage](https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_SendMessage.html)。`ConnectionToken`

1. 联系到达流，再根据流进行路由，然后进入队列。

1. 座席接受该联系。

1. （可选）如果为客户和座席启用了视频，他们就可以开始播放视频了。

1. （可选-未显示在图表中）可以使用[CreateParticipant](https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_CreateParticipant.html)和添加其他参与者[CreateParticipantConnection](https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_CreateParticipantConnection.html) APIs。

## 开始使用
<a name="diagram-option2-gs"></a>

以下是入门的高级步骤：

1. 使用 [StartWebRTCContact](https://docs.aws.amazon.com/connect/latest/APIReference/API_StartWebRTCContact.html)API 创建联系人。该 API 会返回 Amazon Chime SDK 客户端加入通话所需的全部详细信息。

1. 使用返回的配置来实例化 Amazon Chime 软件开发工具包`MeetingSessionConfiguration`客户端对象。[StartWebRTCContact](https://docs.aws.amazon.com/connect/latest/APIReference/API_StartWebRTCContact.html)

1. 使用在步骤 2 中创建的 `MeetingSessionConfiguration`，来初始化 Amazon Chime SDK 客户端 `DefaultMeetingSession`，从而创建一个客户端会议会话。
   + iOS

     ```
     let logger = ConsoleLogger(name: "logger") 
     let meetingSession = DefaultMeetingSession(
         configuration: meetingSessionConfig, 
         logger: logger
     )
     ```
   + Android

     ```
     val logger = ConsoleLogger()
     val meetingSession = DefaultMeetingSession(
         configuration = meetingSessionConfig,
         logger = logger,
         context = applicationContext
     )
     ```
   + JavaScript

     ```
     const logger = new ConsoleLogger('MeetingLogs', LogLevel.INFO);
     const deviceController = new DefaultDeviceController(logger);
     const configuration = new MeetingSessionConfiguration(
         meetingResponse, 
         attendeeResponse
     );
     const meetingSession = new DefaultMeetingSession(
         configuration, 
         logger, 
         deviceController
     );
     ```

1. 使用 `meetingSession.audioVideo.start()` 方法加入有音频的 WebRTC 联系。
   + iOS/Android

     ```
     meetingSession.audioVideo.start()
     ```
   + JavaScript

     ```
     await meetingSession.audioVideo.start();
     ```

1. 使用 `meetingSession.audioVideo.stop()` 方法挂断 WebRTC 联系。
   + iOS/Android

     ```
     meetingSession.audioVideo.stop()
     ```
   + JavaScript

     ```
     meetingSession.audioVideo.stop();
     ```

## 选项步骤
<a name="optional-steps"></a>

有关其他操作和全面的 API 文档，请参阅特定于平台的 API 概述指南：
+ **iOS**：[API 概述](https://aws.github.io/amazon-chime-sdk-ios/guides/api_overview.html)
+ **Android**：[API 概述](https://aws.github.io/amazon-chime-sdk-android/guides/api_overview.html)
+ **JavaScript**: [API 概述](https://github.com/aws/amazon-chime-sdk-js/blob/main/guides/03_API_Overview.md)

### 发送 DTMF 音
<a name="send-dtmf-tones"></a>

要向通话发送 DTMF，需要两个 Amazon Connect 参与 APIs 者服务：[CreateParticipantConnection](https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_CreateParticipantConnection.html)和。[SendMessage](https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_SendMessage.html)

**注意**  
`contentType`因为 SendMessage API 必须是`audio/dtmf`。

1. 调用[CreateParticipantConnection](https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_CreateParticipantConnection.html)以检索`ConnectionToken`。 (`ParticipantToken`是调用此 API 所必需的。 你可以在[StartWebRTCContact](https://docs.aws.amazon.com/connect/latest/APIReference/API_StartWebRTCContact.html)回复中找到它。）

1. 使用`ConnectionToken`，调[SendMessage](https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_SendMessage.html)用发送 DTMF 数字。

### 选择音频设备
<a name="select-audio-devices"></a>

要选择音频 input/output 设备，您可以使用适用于安卓和 iOS 的 Amazon Chime SDK 客户端中的方法或适用于 iOS 的本机 [iOS 功能](https://developer.apple.com/documentation/avkit/avroutepickerview)。

**iOS/安卓**

```
meetingSession.audioVideo.listAudioDevices()
meetingSession.audioVideo.chooseAudioDevice(mediaDevice)
```

**JavaScript**

```
await meetingSession.audioVideo.listAudioInputDevices();
await meetingSession.audioVideo.listAudioOutputDevices();
await meetingSession.audioVideo.startAudioInput(device);
await meetingSession.audioVideo.chooseAudioOutput(deviceId);
```

### 将音频静音和取消静音
<a name="mute-unmute-audio"></a>

对于静音和取消静音，请使用 `meetingSession.audioVideo.realtimeLocalMute()` 和 `meetingSession.audioVideo.realtimeLocalUnmute()`。

**iOS/安卓**

```
meetingSession.audioVideo.realtimeLocalMute()
meetingSession.audioVideo.realtimeLocalUnmute()
```

**JavaScript**

```
meetingSession.audioVideo.realtimeMuteLocalAudio();
meetingSession.audioVideo.realtimeUnmuteLocalAudio();
```

### 开始自拍视频
<a name="start-self-video"></a>

要开始自拍视频，请使用 `meetingSession.audioVideo.startLocalVideo()`。有关如何枚举和选择特定设备的更多信息，请参阅客户端库 API 指南。

**iOS/安卓**

```
meetingSession.audioVideo.startLocalVideo()
```

**JavaScript**

```
meetingSession.audioVideo.startLocalVideoTile();
```

### 停止自拍视频
<a name="stop-self-video"></a>

要停止自拍视频，请使用 `meetingSession.audioVideo.stopLocalVideo()`。

**iOS/安卓**

```
meetingSession.audioVideo.stopLocalVideo()
```

**JavaScript**

```
meetingSession.audioVideo.stopLocalVideoTile();
```

### 启用座席视频
<a name="enable-agent-video"></a>

要允许在应用程序中接收和加载座席的视频，请使用 `meetingSession.audioVideo.startRemoteVideo()`。您还需要实现视频图块观察器，并将视频图块绑定到显示视图。

**iOS/安卓**

```
meetingSession.audioVideo.startRemoteVideo()
// Implement VideoTileObserver to handle video tiles
meetingSession.audioVideo.addVideoTileObserver(observer)
// In videoTileDidAdd callback:
meetingSession.audioVideo.bindVideoView(videoView, tileId: tileState.tileId)
```

**JavaScript**

```
// Remote video is received automatically when available
// Implement AudioVideoObserver to handle video tiles
meetingSession.audioVideo.addObserver(observer);
// In videoTileDidUpdate callback:
meetingSession.audioVideo.bindVideoElement(tileId, videoElement);
```

请参考针对特定平台的 SDK 指南，获取关于实现视频图块的完整详细信息。

### 禁用座席视频
<a name="disable-agent-video"></a>

要禁止在应用程序中接收和加载座席的视频，请使用 `meetingSession.audioVideo.stopRemoteVideo()`。

**iOS/安卓**

```
meetingSession.audioVideo.stopRemoteVideo()
meetingSession.audioVideo.unbindVideoView(tileId)
```

**JavaScript**

```
meetingSession.audioVideo.unbindVideoElement(tileId);
```

### 使用数据消息
<a name="use-data-messages"></a>

如果您需要将任何状态从座席端发送给最终用户，则可以使用[数据消息](https://github.com/aws/amazon-chime-sdk-js/blob/main/guides/03_API_Overview.md#9-send-and-receive-data-messages-optional)。例如，当客户处于暂停状态时，您可以向客户的应用程序发送一条数据消息以显示一条消息，让他们知道他们处于暂停状态，并且他们的 video/screen 共享仍在发送中，或者您可以关闭共 video/screen 享。

**iOS/安卓**

```
meetingSession.audioVideo.realtimeSendDataMessage(topic, data, lifetimeMs)
meetingSession.audioVideo.addRealtimeDataMessageObserver(topic, observer)
```

**JavaScript**

```
meetingSession.audioVideo.realtimeSendDataMessage(topic, data, lifetimeMs);
meetingSession.audioVideo.realtimeSubscribeToReceiveDataMessage(topic, callback);
```

### 监听停止事件
<a name="listen-for-stop-events"></a>

您可以通过 `audioVideoDidStop` 观察器来监听某个联系的参与结束所触发的事件。具体的状态码可能因平台而异。

#### 呼叫已达到容量
<a name="call-reaches-capacity"></a>

当超过 6 人尝试加入通话时，超出的人员将收到以下错误消息，并且在其他人离开之前无法加入。
+ **iOS：**`MeetingSessionStatusCode.audioCallAtCapacity` 或 `MeetingSessionStatusCode.audioAuthenticationRejected`
+ **Android：**`MeetingSessionStatusCode.AudioCallAtCapacity` 或 `MeetingSessionStatusCode.AudioAuthenticationRejected`
+ **JavaScript:** `MeetingSessionStatusCode.AudioCallAtCapacity` 或 `MeetingSessionStatusCode.AudioAuthenticationRejected`

#### 参与者已从通话中被移除
<a name="participant-removed-from-call"></a>

当座席将某位参与者从通话中移除，但其他参与者的联系仍在继续，他们将收到以下状态码。请注意，如果移除参与者导致联系结束，则他们将收到此状态或联系结束状态。
+ **iOS：**`MeetingSessionStatusCode.audioServerHungup` 或 `MeetingSessionStatusCode.audioAuthenticationRejected`
+ **Android：**`MeetingSessionStatusCode.AudioServerHungup` 或 `MeetingSessionStatusCode.AudioAuthenticationRejected`
+ **JavaScript:** `MeetingSessionStatusCode.AudioAttendeeRemoved` 或 `MeetingSessionStatusCode.AudioAuthenticationRejected`

#### 联系结束
<a name="contact-ends"></a>

当所有参与者的实际联系完全结束时，他们将收到以下状态码。
+ **iOS：**`MeetingSessionStatusCode.audioCallEnded`
+ **Android：**`MeetingSessionStatusCode.AudioCallEnded`
+ **JavaScript:** `MeetingSessionStatusCode.AudioCallEnded`