我已经使用 Twilio SDK 实现了 Android 客户端来进行视频通话。它按预期工作,但我发现了一个我无法弄清楚如何修复的边缘情况。这是视频通话代码的本质:
val connectionOptions = ConnectOptions.Builder(accessToken)
.audioTracks(listOf(audioManager.getLocalAudioTrack()))
.roomName(roomId)
.build()
val roomListener = RoomListener()
Video.connect(androidContext, connectOptions, roomListener)
class RoomEventListener : Room.Listener {
override fun onParticipantDisconnected(room: Room, remoteParticipant: RemoteParticipant) {
// remove participant from the screen, unsubscribe from events
}
override fun onConnectFailure(room: Room, twilioException: TwilioException) {
exitScreenWithErrorMessage(R.string.video_consult_room_connection_error)
}
override fun onReconnected(room: Room) {
_shouldShowReconnectionActivity.value = false
}
override fun onParticipantConnected(room: Room, remoteParticipant: RemoteParticipant) {
onRemoteParticipantConnected(remoteParticipant)
}
override fun onConnected(room: Room) {
_shouldShowConnectionActivity.value = false
this@VideoCallViewModel.room = room
room.remoteParticipants.forEach { onRemoteParticipantConnected(it) }
determineMainParticipant()
onLocalParticipantConnected(room)
}
override fun onDisconnected(room: Room, twilioException: TwilioException?) {
exitVideoConsultScreen()
}
override fun onReconnecting(room: Room, twilioException: TwilioException) {
_shouldShowReconnectionActivity.value = true
}
}
测试用例:
- Bob 使用 Android 手机加入视频通话
- Jane 从任何设备(iOS、网络、Android)加入同一个视频通话
当简失去连接时(即关闭互联网)
- 然后 Bob 看到 1-2 分钟重新连接(以编程方式触发了“onReconnecting”回调)
- [实际] Bob 与房间断开连接(在日志中我看到媒体连接失败或媒体活动停止,错误代码为 53405)
- [预期] Bob 留在房间里。
我不确定为什么在这种情况下 Android 客户端已断开连接(我们在具有 Android 8/9 的不同设备上对其进行了测试)。
更多细节:
- 如果 Jane 使用“结束通话”按钮退出房间(因此
room.disconnect()
已调用 Twilio SDK 中的代码),则 Bob 将留在房间中。 - 当 Bob 使用 iOS 设备时(iOS 和 Android 的实现完全一样)然后描述用例通过。
- 我们尝试了 5.0.1 和 5.1.0 版本的
com.twilio:video-android
库。 - 我在发行说明中注意到Android Twilio 视频库的已知问题,我不确定它是否会影响所描述的用例:
取消发布和重新发布
LocalAudioTrack
或LocalVideoTrack
可能不会被参与者看到。因此,在Room.State.RECONNECTED
事件之后发布的曲目可能不会被RemoteParticipant
.