房间管理
房间是对音视频对话空间的抽象,用于隔离不同的通话过程,保障数据的安全及独立。同一房间内的用户可以互相接收对方的音视频数据。本部分介绍如何进行房间管理,获取房间信息、用户信息以及如何实现踢人等常见功能。
- 加入、离开房间代表一次音视频通话的开始和结束,一次会话仅需调用一次加入、离开的操作即可,无需重复调用。加入房间后对于音视频数据的发送和接收,可参考发布和订阅相关流程。
- 加入房间需要携带相应的 RoomToken,RoomToken 需通过您的服务端生成,签算方式可参考 RoomToken 签发服务。
房间的生命周期
- 当用户加入的房间不存在时,七牛后台服务会自动创建对应的房间。
- 若房间内的所有用户都已离开,那么房间维持空状态 10s 后将会自动关闭。
- 若房间为服务端创建,且创建后无用户进入,那么房间维持空状态 30s 后将会自动关闭。
- 若房间内的用户由于断网等原因,30s 未向七牛后台服务通信,则该用户将被视为退出房间。
加入房间
本地调用 QNRTCClient.join(String token) 通过 roomToken 加入房间。
public void join(String token);
public void join(String token, String userData);
示例代码如下:
mClient.join(token);
- 请确保在
QNConnectionState.DISCONNECTED
状态下调用该接口加入房间,否则接口调用无效- 加入房间时根据业务需求,每个用户可通过
userData
携带自定义数据
关于 roomToken 的签算规则,可查阅 RoomToken 的签算文档。
本地加入房间成功后,会触发如下回调:
本地用户收到的回调:
调用 QNRTCClient.join(String token) 接口后,会触发 QNClientEventListener.onConnectionStateChanged 监听回调房间状态改变的通知
public interface QNClientEventListener {
// 当房间状态改变时会触发此回调
void onConnectionStateChanged(QNConnectionState state, @Nullable QNConnectionDisconnectedInfo info);
}
- 若加入房间成功,会回调 QNConnectionState.CONNECTED 状态。
- 若加入房间失败,会回调 QNConnectionState.DISCONNECTED 状态,同时可以通过 QNConnectionDisconnectedInfo 获取失败的原因以及对应的错误码
远端用户收到的回调:
public interface QNClientEventListener {
// 当远端用户加入房间时会触发此回调
void onUserJoined(String remoteUserId, String userData);
}
离开房间
本地调用 QNRTCClient.leave() 退出房间。本地退出房间成功后,会触发如下回调:
本地用户收到的回调:
public interface QNClientEventListener {
// 当房间状态改变时会触发此回调,成功离开房间后,回调状态为 QNConnectionState.DISCONNECTED,QNConnectionDisconnectedInfo 回调 Reason 为 LEAVE
void onConnectionStateChanged(QNConnectionState state, @Nullable QNConnectionDisconnectedInfo info);
}
远端用户收到的回调:
public interface QNClientEventListener {
// 当远端用户离开房间时会触发此回调
void onUserLeft(String remoteUserID);
}
房间信息
获取房间内远端用户信息
本地可调用 QNRTCClient.getRemoteUser(String userID) 接口获取音视频通话房间中的指定用户。
public QNRemoteUser getRemoteUser(String userID);
本地可调用 QNRTCClient.getRemoteUsers() 接口获取音视频通话房间中的远端用户列表。
public List<QNRemoteUser> getRemoteUsers();
其中,QNRemoteUser 代表远端用户的信息,通过该对象可以获取指定 user 发布的音视频列表以及本地对其的订阅情况。
获取房间状态信息
本地可以调用 QNRTCClient.getConnectionState() 接口获取音视频通话的房间状态信息。
public QNConnectionState getConnectionState();
其中,QNConnectionState 包含如下状态:
public enum QNConnectionState {
// 未链接状态, SDK 出现无法恢复错误时也进入该状态
DISCONNECTED,
// 正在连接状态, 加入房间时首先进入该状态,表示开始连接房间服务
CONNECTING,
// 连接成功状态,在完成和房间服务连接后进入该状态
CONNECTED,
// 正在重连状态,当和房间的已有连接由于网络中断、网络异常等原因断开,SDK 进行周期性重连时进入该状态
RECONNECTING,
// 重连成功状态,当从 RECONNECTING 状态,重新和房间服务建立连接后进入该状态
RECONNECTED
}
踢人
客户端踢人
客户端 SDK 未提供踢人的接口,但是踢人操作可以通过自定义消息来实现。实现步骤可参考如下:
- 业务侧协商定义好踢人消息的格式规范
- 踢人方在执行踢人操作时,向指定用户发送协商好的踢人消息
- 被踢方接收到踢人消息后,主动离开当前房间
示例代码参考如下:
踢人方:
踢人方发送协商好的踢人消息:
mClient.sendMessage(Collections.singletonList("userID"), "messageID", "kickOut");
其中,自定义消息的使用方式可以参考 QNRTCClient.sendMessage。
被踢方:
被踢方监听 QNClientEventListener.onMessageReceived 回调接口来接收踢人消息,并在收到消息后主动离开房间:
public interface QNClientEventListener {
@Override
public void onMessageReceived(QNCustomMessage message) {
if ("kickOut".equals(message.getContent())) {
// 离开房间
}
}
}
服务端踢人
服务端提供了踢人的接口,详情可参考服务端文档,当服务端执行踢人操作后,会触发被踢方 QNClientEventListener.onConnectionStateChanged 回调:
public interface QNClientEventListener {
@Override
void onConnectionStateChanged(QNConnectionState state, @Nullable QNConnectionDisconnectedInfo info){
if (state == QNConnectionState.DISCONNECTED
&& info != null
&& info.getReason() == QNConnectionDisconnectedInfo.Reason.KICKED_OUT) {
// 您已被服务端踢出房间
}
}
}
其中,被服务端踢出房间的场景下 QNConnectionDisconnectedInfo 回调的状态为 QNConnectionState.DISCONNECTED
,同时 QNConnectionDisconnectedInfo.Reason
为 KICKED_OUT
。