tencent cloud

Feedback

Microphone Management (TUILiveKit)

Last updated: 2024-12-19 18:08:20

    Description of the Feature

    Seat Management is a real-time interaction and communication method where anchors can interact with the audience on the seat in real-time. Whether it's answering questions, sharing experiences, or entertainment interactions, it greatly enhances the audience's sense of participation and satisfaction. This direct interaction and communication provide more convenient and efficient channels for commercial operations. Using this feature, you can achieve applying to join the seat, inviting to take seat, moving seat positions, kicking someone off the seat, and locking seats, greatly enriching the playability of the voice chat room.
    Seat List
    Audience applies to take seat
    Anchor Handling Seat Request
    
    
    
    
    
    
    
    
    

    Apply To take Seat Process

    Audience applies to take seat process

    The TUILiveKit audience application for seat feature is mainly implemented through SeatGridView. You can call the following API Function to achieve the audience application for seat feature. The implementation is as follows, with Audience B applying for a seat as an example.

    Audience sends a request to join the seat

    Audience B sends a request to join the seat to Anchor A. Anchor A will receive the join request from Audience B in the onSeatRequestReceived Callback.
    Android
    iOS
    Kotlin
    Java
    val seatIndex = 1;
    val timeout = 60;
    seatGridView.takeSeat(seatIndex, timeout, object : VoiceRoomDefine.RequestCallback {
    override fun onAccepted(userInfo: TUIRoomDefine.UserInfo) {
    Log.i(TAG, "Application for speaking is approved")
    }
    
    override fun onRejected(userInfo: TUIRoomDefine.UserInfo) {
    Log.i(TAG, "Application for speaking is rejected")
    }
    
    override fun onCancelled(userInfo: TUIRoomDefine.UserInfo) {
    Log.i(TAG, "Application for speaking is canceled")
    }
    
    override fun onTimeout(userInfo: TUIRoomDefine.UserInfo) {
    Log.i(TAG, "Application for speaking times out")
    }
    
    override fun onError(userInfo: TUIRoomDefine.UserInfo, error: TUICommonDefine.Error, message: String) {
    Log.i(TAG, "Application for speaking error")
    }
    })
    int seatIndex = 1;
    int timeout = 60;
    seatGridView.takeSeat(seatIndex, timeout, new VoiceRoomDefine.RequestCallback() {
    @Override
    public void onAccepted(TUIRoomDefine.UserInfo userInfo) {
    Log.i(TAG, "Application for speaking is approved");
    }
    
    @Override
    public void onRejected(TUIRoomDefine.UserInfo userInfo) {
    Log.i(TAG, "Application for speaking is rejected");
    }
    
    @Override
    public void onCancelled(TUIRoomDefine.UserInfo userInfo) {
    Log.i(TAG, "Application for speaking is canceled");
    }
    
    @Override
    public void onTimeout(TUIRoomDefine.UserInfo userInfo) {
    Log.i(TAG, "Application for speaking times out");
    }
    
    @Override
    public void onError(TUIRoomDefine.UserInfo userInfo, TUICommonDefine.Error error, String message) {
    Log.i(TAG, "Application for speaking error");
    }
    });
    swift
    let seatIndex = 1
    let timeout = 60
    seatGridView.takeSeat(index: index, timeout: timeout) { userInfo in
    print("Application for speaking is approved")
    } onRejected: { userInfo in
    print("Application for speaking is rejected")
    } onCancelled: { userInfo in
    print("Application for speaking is canceled")
    } onTimeout: { userInfo in
    print("Application for speaking times out")
    } onError: { userInfo, code, message in
    print("Application for speaking error")
    }
    The TUILiveKit audience application for seat feature is mainly implemented through SeatGridView. You can call the following API Function to achieve the audience application for seat feature. The implementation is as follows, with Audience B applying for a seat as an example.
    Note:
    The room owner will only receive a request to speak when the room mode is APPLY_TO_TAKE, in FREE_TO_TAKE mode, takeSeat will directly succeed in taking the seat.

    Host end receives a Request to Speak

    Anchor A will receive Audience B's request to join the seat in the onSeatRequestReceived callback method.
    Android
    iOS
    Kotlin
    Java
    override fun onSeatRequestReceived(type: VoiceRoomDefine.RequestType, userInfo: TUIRoomDefine.UserInfo) {
    if (type == VoiceRoomDefine.RequestType.APPLY_TO_TAKE_SEAT) {
    Log.i(TAG, "Received request to join the seat from the audience: ${userInfo.userId}")
    }
    }
    @Override
    public void onSeatRequestReceived(VoiceRoomDefine.RequestType type, TUIRoomDefine.UserInfo userInfo) {
    if (type == VoiceRoomDefine.RequestType.APPLY_TO_TAKE_SEAT) {
    Log.i(TAG, "Received request to join the mi from the audience: " + userInfo.userId);
    }
    }
    swift
    func onSeatRequestReceived(type: SGRequestType, userInfo: TUIUserInfo) {
    if type == .applyToTakeSeat {
    print("Received audience's request to join the seat: \\(userInfo.userId)")
    }
    }
    Note:
    The room owner will only receive a request to take seat when the room mode is APPLY_TO_TAKE, in FREE_TO_TAKE mode, takeSeat will directly succeed in taking the seat.

    Anchor responds to the request to take the seat

    After Anchor A receives Audience B's request to join the seat, they can call responseRemoteRequest to respond whether they agree to let Audience B take seat. Audience B will receive a callback of Anchor A's acceptance or rejection (onAccepted/onRejected).
    Android
    iOS
    Kotlin
    Java
    // Anchor agrees to let the audience take the seat
    seatGridView.responseRemoteRequest(userId, true, null);
    
    // Anchor rejects the audience's request to take the seat
    seatGridView.responseRemoteRequest(userId, false, null);
    // Anchor agrees to let the audience take the seat
    seatGridView.responseRemoteRequest(userId, true, null);
    
    // Anchor rejects the audience's request to take the seat
    seatGridView.responseRemoteRequest(userId, false, null);
    swift
    // Anchor agrees to let the audience take the seat
    seatGridView.responseRemoteRequest(userId, true) {
    } onError: { code, message in
    }
    
    // Anchor rejects the audience's request to take the seat
    seatGridView.responseRemoteRequest(userId, false) {
    } onError: { code, message in
    }

    Callback for seat information changes

    Android
    iOS
    If you have already set up the Custom Seat View, you can listen to the updateSeatView callback to refresh your custom UI.
    Kotlin
    Java
    override fun updateSeatView(seatGridView: SeatGridView, seatInfo: TUIRoomDefine.SeatInfo, seatView: View) {
    Log.i(TAG, "Seat information changes");
    }
    @Override
    public void void updateSeatView(SeatGridView seatGridView, TUIRoomDefine.SeatInfo seatInfo, View seatView) {
    Log.i(TAG, "Seat information changes");
    }
    If you have already set up the Custom Seat View, you can listen to the updateSeatView callback to refresh your custom seat UI.
    swift
    func seatGridView(_ view: SeatGridView, updateSeatView seatInfo: TUISeatInfo, seatView: UIView) {
    print("Seat information changes")
    }

    Anchor invites audience to speak flow

    Anchor sends invite speaking request

    Anchor A sends an invite speaking request to Audience C. Audience C will receive the invite speaking request from Anchor A in the onSeatRequestReceived Callback.
    Android
    iOS
    Kotlin
    Java
    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, "Invitation to Become a Speaker Accepted")
    }
    
    override fun onRejected(userInfo: TUIRoomDefine.UserInfo) {
    Log.i(TAG, "Invitation to Become a Speaker Rejected")
    }
    
    override fun onCancelled(userInfo: TUIRoomDefine.UserInfo) {
    Log.i(TAG, "Invitation to Become a Speaker Cancelled")
    }
    
    override fun onTimeout(userInfo: TUIRoomDefine.UserInfo) {
    Log.i(TAG, "Invitation to Become a Speaker Timed Out")
    }
    
    override fun onError(userInfo: TUIRoomDefine.UserInfo, error: TUICommonDefine.Error, message: String) {
    Log.i(TAG, "Invitation to Become a Speaker Error")
    }
    })
    val seatIndex = 1;
    val userId = "userIdC";
    val timeout = 60;
    seatGridView.takeUserOnSeatByAdmin(seatIndex, userId, timeout, new VoiceRoomDefine.RequestCallback() {
    @Override
    public void onAccepted(TUIRoomDefine.UserInfo userInfo) {
    Log.i(TAG, "Invitation to Become a Speaker Accepted");
    }
    
    @Override
    public void onRejected(TUIRoomDefine.UserInfo userInfo) {
    Log.i(TAG, "Invitation to Become a Speaker Rejected");
    }
    
    @Override
    public void onCancelled(TUIRoomDefine.UserInfo userInfo) {
    Log.i(TAG, "Invitation to Become a Speaker Cancelled");
    }
    
    @Override
    public void onTimeout(TUIRoomDefine.UserInfo userInfo) {
    Log.i(TAG, "Invitation to Become a Speaker Timed Out");
    }
    
    @Override
    public void onError(TUIRoomDefine.UserInfo userInfo, TUICommonDefine.Error error, String message) {
    Log.i(TAG, "Invitation to Become a Speaker Error");
    }
    });
    swift
    let seatIndex = 1
    let userId = "userIdC"
    
    seatGridView.takeUserOnSeatByAdmin(index: seatIndex, timeout: timeout, userId: userId) { userInfo in
    print("Invitation to join the microphone is approved")
    } onRejected: { userInfo in
    print("Invitation to join the microphone is rejected")
    } onCancelled: { userInfo in
    print("Invitation to join the microphone is canceled")
    } onTimeout: { userInfo in
    print("Invitation to join the microphone times out")
    } onError: { userInfo, code, message in
    print("Invitation to join the microphone error")
    }

    Audience Side received an Invite Speaking Request

    Audience C will receive Anchor A's invite to join the seat in the onSeatRequestReceived callback method.
    Android
    iOS
    Kotlin
    Java
    override fun onSeatRequestReceived(type: VoiceRoomDefine.RequestType, userInfo: TUIRoomDefine.UserInfo) {
    if (type == VoiceRoomDefine.RequestType.INVITE_TO_TAKE_SEAT) {
    Log.i(TAG, "Received invite to join the seat from the anchor: ${userInfo.userId}")
    }
    }
    @Override
    public void onSeatRequestReceived(VoiceRoomDefine.RequestType type, TUIRoomDefine.UserInfo userInfo) {
    if (type == VoiceRoomDefine.RequestType.INVITE_TO_TAKE_SEAT) {
    Log.i(TAG, "Received invite to join the seat from the anchor: " + userInfo.userId);
    }
    }
    swift
    func onSeatRequestReceived(type: SGRequestType, userInfo: TUIUserInfo) {
    if type == .inviteToTakeSeat {
    print("Received invite to join the seat from the anchor: \\(userInfo.userId)")
    }
    }

    Audience responds to the invite to speak

    After Audience C receives the join request from Anchor A, they can call responseRemoteRequest to respond whether they agree to speak. Anchor A will receive Audience C's acceptance or rejection (onAccepted/onRejected) callback.
    Android
    iOS
    Kotlin
    Java
    // Audience agrees to the anchor's invite
    seatGridView.responseRemoteRequest("", true, null);
    
    // Audience rejects the anchor's invite
    seatGridView.responseRemoteRequest("", false, null);
    // Audience agrees to the anchor's invite
    seatGridView.responseRemoteRequest("", true, null);
    
    // Audience rejects the anchor's invite
    seatGridView.responseRemoteRequest("", false, null);
    swift
    // Audience agrees to the anchor's invite
    seatGridView.responseRemoteRequest("userId of anchor", true) {
    } onError: { code, message in
    }
    
    // Audience rejects the anchor's invite
    seatGridView.responseRemoteRequest("userId of anchor", false, null) {
    } onError: { code, message in
    }
    Note:
    If using a custom seat view, both anchors and the audience can refresh the seat UI by listening to the callback for seat information changes.

    Leave the Seat Process

    After the audience successfully becomes a speaker, they proactively become a listener again.

    After Audience B becomes a speaker successfully, they can call leaveSeat to leave the mic voluntarily.
    Android
    iOS
    Kotlin
    Java
    seatGridView.leaveSeat()
    seatGridView.leaveSeat();
    swift
    seatGridView.leaveSeat() {
    } onError: { code, message in
    }

    After the audience successfully joins the stage, the host kicks them off stage

    After Audience B becomes a speaker successfully, Anchor A can kick Audience B off.
    Android
    iOS
    Kotlin
    Java
    val userId = "userIdB"
    seatGridView.kickUserOffSeatByAdmin(userId, null)
    String userId = "userIdB";
    seatGridView.kickUserOffSeatByAdmin(userId, null);
    swift
    userId = "userIdB"
    seatGridView.kickUserOffSeatByAdmin(userId) {
    } onError: { code, message in
    }

    Audience receives a callback when the host kicks them off stage

    After Anchor A kicks Audience B off, Audience B will receive the onKickedOffSeat callback.
    Android
    iOS
    Kotlin
    Java
    override fun onKickedOffSeat(inviterUser: UserInfo) {
    Log.i(TAG, "Anchor kicked off the seat")
    }
    @Override
    public void onKickedOffSeat(TUIRoomDefine.UserInfo userInfo) {
    Log.i(TAG, "Anchor kicked off the seat");
    }
    swift
    func onKickedOffSeat(userInfo: TUIUserInfo) {
    print("Anchor kicked off the seat")
    }
    
    Note:
    If using a custom seat view, both anchors and the audience can refresh the seat UI by listening to the callback for seat information changes.

    Lock Seat Process

    Position Lock

    The anchor can lock a specific seat, and it will be blocked, preventing any seat operations.
    Android
    iOS
    Kotlin
    Java
    val index = 1;
    val isLockSeat = true
    val 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);
    swift
    let index = 1
    let isLockSeat = true
    
    let params = TUISeatLockParams()
    params.lockSeat = isLockSeat
    
    seatGridView.lockSeat(index: index, lockMode: params) {
    } onError: { code, message in
    }

    Audio Lock

    The anchor can lock the audio for a specific seat position, and the user on that position will be muted.
    Android
    iOS
    Kotlin
    Java
    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);
    swift
    let index = 1
    let isAudioLocked = true
    
    let params = TUISeatLockParams()
    params.lockAudio = isAudioLocked
    
    seatGridView.lockSeat(index: index, lockMode: params) {
    } onError: { code, message in
    }
    Note:
    If using a custom seat view, both anchors and the audience can refresh the seat UI by listening to the callback for seat information changes.

    Other seat management feature extensions

    The seat management feature is implemented based on SeatGridView. If you need to extend the seat management feature, please refer to the SeatGridView documentation.
    
    Contact Us

    Contact our sales team or business advisors to help your business.

    Technical Support

    Open a ticket if you're looking for further assistance. Our Ticket is 7x24 avaliable.

    7x24 Phone Support