Seat Management
功能介绍
麦位管理是一种实时互动交流方式,主播可以麦位上的观众进行实时互动,无论是解答问题、分享经验还是进行娱乐互动,都能极大地提升观众的参与感和满意度。这种直接的互动和交流为商业化运营提供了更加便捷和高效的渠道,使用此功能,可以实现申请上麦,邀请上麦,移动麦位,踢人下麦,锁定麦位能功能,极大的丰富了语音聊天室的可玩性。
麦位列表 | 观众申请上麦 | 主播处理上麦 |
| | |
接入流程
观众申请上麦流程
TUILiveKit 观众申请上麦功能 主要是通过 SeatGridView 实现,您可以调用如下 API 函数,实现观众申请上麦功能。以观众 B 申请上麦为例实现如下。
观众发送申请上麦请求
观众 B 给主播 A 发送申请上麦请求,主播 A 会在 onSeatRequestReceived 回调中收到观众 B 的上麦请求。
val seatIndex = 1;val timeout = 60;seatGridView.takeSeat(seatIndex, timeout, object : VoiceRoomDefine.RequestCallback {override fun onAccepted(userInfo: TUIRoomDefine.UserInfo) {Log.i(TAG, "申请上麦被同意")}override fun onRejected(userInfo: TUIRoomDefine.UserInfo) {Log.i(TAG, "申请上麦被拒绝")}override fun onCancelled(userInfo: TUIRoomDefine.UserInfo) {Log.i(TAG, "申请上麦被取消")}override fun onTimeout(userInfo: TUIRoomDefine.UserInfo) {Log.i(TAG, "申请上麦超时")}override fun onError(userInfo: TUIRoomDefine.UserInfo, error: TUICommonDefine.Error, message: String) {Log.i(TAG, "申请上麦错误")}})
int seatIndex = 1;int timeout = 60;seatGridView.takeSeat(seatIndex, timeout, new VoiceRoomDefine.RequestCallback() {@Overridepublic void onAccepted(TUIRoomDefine.UserInfo userInfo) {Log.i(TAG, "申请上麦被同意");}@Overridepublic void onRejected(TUIRoomDefine.UserInfo userInfo) {Log.i(TAG, "申请上麦被拒绝");}@Overridepublic void onCancelled(TUIRoomDefine.UserInfo userInfo) {Log.i(TAG, "申请上麦被取消");}@Overridepublic void onTimeout(TUIRoomDefine.UserInfo userInfo) {Log.i(TAG, "申请上麦超时");}@Overridepublic void onError(TUIRoomDefine.UserInfo userInfo, TUICommonDefine.Error error, String message) {Log.i(TAG, "申请上麦错误");}});
let seatIndex = 1let timeout = 60seatGridView.takeSeat(index: index, timeout: timeout) { userInfo inprint("申请上麦被同意")} onRejected: { userInfo inprint("申请上麦被拒绝")} onCancelled: { userInfo inprint("申请上麦被取消")} onTimeout: { userInfo inprint("申请上麦超时")} onError: { userInfo, code, message inprint("申请上麦错误")}
TUILiveKit 观众申请上麦功能 主要是通过 SeatGridView 实现,您可以调用如下 API 函数,实现观众申请上麦功能。以观众 B 申请上麦为例实现如下。
注意:
只有当房间模式是 APPLY_TO_TAKE (申请上麦),房主才会收到上麦请求,FREE_TO_TAKE (自由上麦) 模式下,takeSeat会直接上麦成功。
主播端收到申请上麦请求
主播 A 会在 onSeatRequestReceived 回调方法中收到 观众B 的上麦请求。
override fun onSeatRequestReceived(type: VoiceRoomDefine.RequestType, userInfo: TUIRoomDefine.UserInfo) {if (type == VoiceRoomDefine.RequestType.APPLY_TO_TAKE_SEAT) {Log.i(TAG, "收到观众申请上麦请求:${userInfo.userId}")}}
@Overridepublic void onSeatRequestReceived(VoiceRoomDefine.RequestType type, TUIRoomDefine.UserInfo userInfo) {if (type == VoiceRoomDefine.RequestType.APPLY_TO_TAKE_SEAT) {Log.i(TAG, "收到观众上麦请求:" + userInfo.userId);}}
func onSeatRequestReceived(type: SGRequestType, userInfo: TUIUserInfo) {if type == .applyToTakeSeat {print("收到观众申请上麦请求:\(userInfo.userId)")}}
注意:
只有当房间模式是 APPLY_TO_TAKE (申请上麦),房主才会收到上麦请求,FREE_TO_TAKE (自由上麦) 模式下,takeSeat会直接上麦成功。
主播响应上麦请求
主播 A 收到观众的上麦请求后,可以调用 responseRemoteRequest 响应观众 B 是否同意上麦, 观众 B 会收到主播 A 同意和拒绝(onAccepted/onRejected)的回调。
// 主播同意观众上麦seatGridView.responseRemoteRequest(userId, true, null);// 主播拒绝观众上麦seatGridView.responseRemoteRequest(userId, false, null);
// 主播同意观众上麦seatGridView.responseRemoteRequest(userId, true, null);// 主播拒绝观众上麦seatGridView.responseRemoteRequest(userId, false, null);
// 主播同意观众上麦seatGridView.responseRemoteRequest(userId, true) {} onError: { code, message in}// 主播拒绝观众上麦seatGridView.responseRemoteRequest(userId, false) {} onError: { code, message in}
麦位信息发生变化的回调
override fun updateSeatView(seatGridView: SeatGridView, seatInfo: TUIRoomDefine.SeatInfo, seatView: View) {Log.i(TAG, "麦位信息发生变化");}
@Overridepublic void void updateSeatView(SeatGridView seatGridView, TUIRoomDefine.SeatInfo seatInfo, View seatView) {Log.i(TAG, "麦位信息发生变化");}
func seatGridView(_ view: SeatGridView, updateSeatView seatInfo: TUISeatInfo, seatView: UIView) {print("麦位信息发生变化")}
主播邀请观众上麦流程
主播发送邀请上麦请求
主播 A 给观众 C 发送邀请上麦请求,观众 C 会在 onSeatRequestReceived 回调中收到主播 A 的邀请上麦请求。
val seatIndex = 1;val userId = "userIdC";val timeout = 60;seatGridView.takeUserOnSeatByAdmin(seatIndex, timeout, userId, object : VoiceRoomDefine.RequestCallback {override fun onAccepted(userInfo: TUIRoomDefine.UserInfo) {Log.i(TAG, "邀请上麦被同意")}override fun onRejected(userInfo: TUIRoomDefine.UserInfo) {Log.i(TAG, "邀请上麦被拒绝")}override fun onCancelled(userInfo: TUIRoomDefine.UserInfo) {Log.i(TAG, "邀请上麦被取消")}override fun onTimeout(userInfo: TUIRoomDefine.UserInfo) {Log.i(TAG, "邀请上麦超时")}override fun onError(userInfo: TUIRoomDefine.UserInfo, error: TUICommonDefine.Error, message: String) {Log.i(TAG, "邀请上麦错误")}})
val seatIndex = 1;val userId = "userIdC";val timeout = 60;seatGridView.takeUserOnSeatByAdmin(seatIndex, userId, timeout, new VoiceRoomDefine.RequestCallback() {@Overridepublic void onAccepted(TUIRoomDefine.UserInfo userInfo) {Log.i(TAG, "邀请上麦被同意");}@Overridepublic void onRejected(TUIRoomDefine.UserInfo userInfo) {Log.i(TAG, "邀请上麦被拒绝");}@Overridepublic void onCancelled(TUIRoomDefine.UserInfo userInfo) {Log.i(TAG, "邀请上麦被取消");}@Overridepublic void onTimeout(TUIRoomDefine.UserInfo userInfo) {Log.i(TAG, "邀请上麦超时");}@Overridepublic void onError(TUIRoomDefine.UserInfo userInfo, TUICommonDefine.Error error, String message) {Log.i(TAG, "邀请上麦错误");}});
let seatIndex = 1let userId = "userIdC"seatGridView.takeUserOnSeatByAdmin(index: seatIndex, timeout: timeout, userId: userId) { userInfo inprint("邀请上麦被同意")} onRejected: { userInfo inprint("邀请上麦被拒绝")} onCancelled: { userInfo inprint("邀请上麦被取消")} onTimeout: { userInfo inprint("邀请上麦超时")} onError: { userInfo, code, message inprint("邀请上麦错误")}
观众端收到邀请上麦请求
观众 C 会在 onSeatRequestReceived 回调方法中收到 主播A 的邀请上麦请求。
override fun onSeatRequestReceived(type: VoiceRoomDefine.RequestType, userInfo: TUIRoomDefine.UserInfo) {if (type == VoiceRoomDefine.RequestType.INVITE_TO_TAKE_SEAT) {Log.i(TAG, "收到主播邀请上麦请求:${userInfo.userId}")}}
@Overridepublic void onSeatRequestReceived(VoiceRoomDefine.RequestType type, TUIRoomDefine.UserInfo userInfo) {if (type == VoiceRoomDefine.RequestType.INVITE_TO_TAKE_SEAT) {Log.i(TAG, "收到主播邀请上麦请求:" + userInfo.userId);}}
func onSeatRequestReceived(type: SGRequestType, userInfo: TUIUserInfo) {if type == .inviteToTakeSeat {print("收到主播邀请上麦请求:\(userInfo.userId)")}}
观众响应邀请上麦请求
观众 C 收到观众的上麦请求后,可以调用 responseRemoteRequest 响应主播 A 是否同意上麦, 主播 A 会收到观众 C 同意和拒绝(onAccepted/onRejected)的回调。
// 观众同意主播邀请seatGridView.responseRemoteRequest("", true, null);// 观众拒绝主播邀请seatGridView.responseRemoteRequest("", false, null);
// 观众同意主播邀请seatGridView.responseRemoteRequest("", true, null);// 观众拒绝主播邀请seatGridView.responseRemoteRequest("", false, null);
// 观众同意主播邀请seatGridView.responseRemoteRequest("userId of anchor", true) {} onError: { code, message in}// 观众拒绝主播邀请seatGridView.responseRemoteRequest("userId of anchor", false, null) {} onError: { code, message in}
说明:
下麦流程
观众上麦成功后,主动下麦
观众 B 上麦成功后,观众 B 主动下麦可以调用 leaveSeat。
seatGridView.leaveSeat()
seatGridView.leaveSeat();
seatGridView.leaveSeat() {} onError: { code, message in}
观众上麦成功后,主播踢观众下麦
观众 B 上麦成功后,主播 A 踢观众 B 下麦。
val userId = "userIdB"seatGridView.kickUserOffSeatByAdmin(userId, null)
String userId = "userIdB";seatGridView.kickUserOffSeatByAdmin(userId, null);
userId = "userIdB"seatGridView.kickUserOffSeatByAdmin(userId) {} onError: { code, message in}
观众收到被主播踢下麦的回调
主播 A 踢观众 B 下麦后,观众 B 会收到 onKickedOffSeat 回调。
override fun onKickedOffSeat(inviterUser: UserInfo) {Log.i(TAG, "主播踢下麦")}
@Overridepublic void onKickedOffSeat(TUIRoomDefine.UserInfo userInfo) {Log.i(TAG, "主播踢下麦");}
func onKickedOffSeat(userInfo: TUIUserInfo) {print("主播踢下麦")}
说明:
锁麦流程
位置锁定
主播可将某个麦位进行锁定,此麦位就会被封禁,此麦位就无法进行上下麦操作。
val index = 1;val isLockSeat = trueval params = TUIRoomDefine.SeatLockParams().apply {lockSeat = isLockSeat}seatGridView.lockSeat(index, params, null)
int index = 1;bool isLockSeat = true;TUIRoomDefine.SeatLockParams params = new TUIRoomDefine.SeatLockParams();params.lockSeat = isLockSeat;seatGridView.lockSeat(index, params, null);
let index = 1let isLockSeat = truelet params = TUISeatLockParams()params.lockSeat = isLockSeatseatGridView.lockSeat(index: index, lockMode: params) {} onError: { code, message in}
音频锁定
主播可将某个麦位进行音频锁定,此麦位上的用户就会被静音。
val index = 1;bool isAudioLocked = true;val params = TUIRoomDefine.SeatLockParams().apply {isAudioLocked = isLockSeat}seatGridView.lockSeat(index, params, null)
int index = 1;bool isAudioLocked = true;TUIRoomDefine.SeatLockParams params = new TUIRoomDefine.SeatLockParams();params.lockAudio = seatInfo.isAudioLocked;seatGridView.lockSeat(index, params, null);
let index = 1let isAudioLocked = truelet params = TUISeatLockParams()params.lockAudio = isAudioLockedseatGridView.lockSeat(index: index, lockMode: params) {} onError: { code, message in}
说明:
其它麦位管理功能扩展