CoGuestState 和 LiveSeatState 在您的应用中快速实现语音连麦功能。
CoGuestState 和 LiveSeatState 支持以下几个主流的场景:applyForSeat 方法。import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';// 先获取要加入的语聊房 ID(liveID)。通常有以下方式:// 通过房间列表选择(可从 LiveListState 的 liveList 数据中获取)const liveID = "xxx" // 您当前加入语聊房的 liveID//通过 liveID 获取 CoGuestState 的实例const { applyForSeat } = useCoGuestState(liveID);// 用户点击“申请连麦”const handleApplyForSeat = () => {applyForSeat({liveID,seatIndex: -1, // 申请的麦位,申请上麦传 -1, 随机分配麦位timeout: 30, // 请求超时时间,例如 30s});};
addCoGuestGuestListener 订阅 onGuestApplicationResponded 事件,您可以接收到主播的处理结果。import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';import { useDeviceState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/DeviceState';const { addCoGuestGuestListener } = useCoGuestState(liveID);const { openLocalMicrophone } = useDeviceState(liveID);// 页面初始化时订阅连麦申请响应事件useEffect(() => {addCoGuestGuestListener('onGuestApplicationResponded', (event) => {const res = typeof event === 'string' ? JSON.parse(event) : event;if (res.isAccept) {console.log('上麦申请被同意');// 1.打开麦克风openLocalMicrophone();// 2. 在此更新 UI,例如变更申请按钮状态,显示为连麦中} else {console.log('上麦申请被拒绝');// 弹窗提示用户申请被拒绝}});}, [liveID]);
disconnect 方法即可返回普通观众状态。import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';const { disconnect } = useCoGuestState(liveID);// 用户点击"下麦"按钮const handleLeaveSeat = () => {disconnect({liveID,onSuccess: () => {console.log('下麦成功');},onError: (error) => {console.log('下麦失败', error);},});};
cancelApplication。import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';const { cancelApplication } = useCoGuestState(liveID);// 用户在等待时,点击"取消申请"const handleCancelRequest = () => {cancelApplication({liveID,onSuccess: () => {console.log('取消申请成功');},onError: (error) => {console.log('取消申请失败', error);},});};
CoGuestHostListener 订阅 onGuestApplicationReceived 事件,您在有新观众申请时立即收到通知,并给出提示。import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';// 获取 CoGuestState 实例const { addCoGuestHostListener } = useCoGuestState(liveID);// 在页面初始化时订阅事件useEffect(() => {addCoGuestHostListener('onGuestApplicationReceived', (event) => {const res = JSON.parse(event);console.log('收到观众的连麦申请');// 在此更新 UI,例如在"申请列表"按钮上显示红点});}, [liveID]);
CoGuestState 会实时维护当前的申请者列表 applicants,数据本身是响应式数据,您可以直接在 UI 上使用。const { addCoGuestHostListener, applicants } = useCoGuestState(liveID);{/* 申请者列表 */}{applicants && applicants.length > 0 ? (<View style={styles.applicantContainer}><Text style={styles.applicantTitle}>申请列表({applicants.length})</Text>{applicants.map((audience) => (<View key={audience?.userID} style={styles.applicantItem}><Text style={styles.applicantName}>{audience.userName}</Text><Text style={styles.applicantId}>{audience.userID}</Text></View>))}</View>) : null}
import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';const { acceptApplication, rejectApplication } = useCoGuestState(liveID);// 主播点击"同意"按钮,传入申请者的 userIDconst handleAccept = (userID) => {acceptApplication({liveID,userID,onSuccess: () => {console.log('已同意上麦申请');},onError: (error) => {console.log('同意上麦申请失败', error);},});};// 主播点击"拒绝"按钮,传入申请者的 userIDconst handleReject = (userID) => {rejectApplication({liveID,userID,onSuccess: () => {console.log('已拒绝上麦申请');},onError: (error) => {console.log('拒绝上麦申请失败', error);},});};
inviteToSeat 方法。import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';const { inviteToSeat } = useCoGuestState(liveID);// 主播选择观众并发起邀请const handleInviteToSeat = (inviteeID) => {inviteToSeat({liveID,inviteeID,seatIndex: -1, // 邀请的麦位,传 -1, 随机分配麦位timeout: 30, // 超时时间onSuccess: () => {console.log('已向观众发送上麦邀请,请等待回应...');},onError: (error) => {console.log('向观众发送上麦邀请失败', error);},});};
CoGuestHostListener 订阅 onHostInvitationResponded 事件。import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';const { addCoGuestHostListener } = useCoGuestState(liveID);// 在页面初始化时订阅事件useEffect(() => {addCoGuestHostListener('onHostInvitationResponded', (event) => {const res = JSON.parse(event);if (res.isAccept) {console.log('观众接受了您的邀请');} else {console.log('观众拒绝了您的邀请');}});}, [liveID]);
addCoGuestGuestListener 订阅 onHostInvitationReceived 事件。import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';import { useLiveListState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveListState';const { addCoGuestGuestListener } = useCoGuestState(liveID);const { currentLive } = useLiveListState();// 页面初始化时订阅连麦申请响应事件useEffect(() => {addCoGuestGuestListener('onHostInvitationReceived', (event) => {const inviterID = currentLive?.liveOwner?.userID || '';console.log('邀请人ID:', inviterID);// 弹出对话框,让用户选择"接受"或"拒绝"});}, [liveID]);
import { useCoGuestState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/CoGuestState';const { acceptInvitation, rejectInvitation } = useCoGuestState(liveID);const { openLocalMicrophone } = useDeviceState(liveID);// 用户点击“接受”const handleAcceptInvitation = (inviterID) => {acceptInvitation({liveID,inviterID,onSuccess: () => {console.log('已接受上麦邀请');openLocalMicrophone(); // 可以选择在此处打开麦克风},onError: (error) => {console.log('接受上麦邀请失败', error);},});};// 用户点击“拒绝”const handleRejectInvitation = (inviterID) => {rejectInvitation({liveID,inviterID,onSuccess: () => {console.log('已拒绝上麦邀请');},onError: (error) => {console.log('拒绝上麦邀请失败', error);},});};
LiveSeatState 提供,它可以与 CoGuestState 协同工作。LiveSeatState 提供的接口来控制自己的麦克风静音状态。muteMicrophone() 方法。这是一个无回调的单向请求。unmuteMicrophone(onSuccess: onError:) 方法。import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';const { muteMicrophone, unmuteMicrophone } = useLiveSeatState(liveID);//静音const handleMuteMic = () => {muteMicrophone();};// 解除静音const handleUnmuteMic = () => {unmuteMicrophone({onSuccess: () => {console.log('解除静音成功');},onError: (error) => {console.log('解除静音失败', error);},});};
参数 | 类型 | 描述 |
onSuccess | Function | 解除静音的回调 |
onError | Function | 解除静音失败的回调。 |
closeRemoteMicrophone 会强制关闭对方的麦克风,并锁定对方的麦克风权限。被静音的用户会收到 'onLocalMicrophoneClosedByAdmin' 事件,此时其本地的“打开麦克风”按钮应变为不可点击状态。openRemoteMicrophone 并非强制打开对方麦克风,而是解除对方的“锁定状态”,允许对方自行开麦。此时,被操作的用户会收到 onLocalMicrophoneOpenedByAdmin 事件,其本地的“打开麦克风”按钮应恢复为可点击状态,但用户仍处于静音中。LiveSeatState 的 unmuteMicrophone()方法解除静音,才能让房间内其他人听到自己的声音。import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';//通过 liveID 获取 LiveSeatState 的实例const { openRemoteMicrophone, closeRemoteMicrophone } = useLiveSeatState(liveID);const targetUserID = "userA"// 1. 强制静音 userA 并锁定const handleCloseRemoteMic = (userID) => {closeRemoteMicrophone({liveID,userID,onSuccess: () => {console.log('静音并锁定成功');},onError: (error) => {console.log('静音并锁定失败', error);},});};// 2. 解锁 userA 的麦克风权限(此时 userA 依然是静音状态)const handleOpenRemoteMic = (userID) => {openRemoteMicrophone({liveID,userID,onSuccess: () => {console.log('邀请打开麦克风成功');},onError: (error) => {console.log('邀请打开麦克风失败', error);},});};
import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';//通过 liveID 获取 LiveSeatState 的实例const { addLiveSeatEventListener } = useLiveSeatState(liveID);// 监听主播的静音/解锁操作useEffect(() => {addLiveSeatEventListener('onLocalMicrophoneClosedByAdmin', () => {console.log('被主播静音了');// 可以在此进行弹框提示});addLiveSeatEventListener('onLocalMicrophoneOpenedByAdmin', () => {console.log('主播已解除静音锁定');// 可以在此进行弹框提示});}, [liveID]);
参数 | 类型 | 描述 |
liveID | string | 当前语聊房的 liveID。 |
userID | string | 被操作的用户 userID。 |
onSuccess | Function | 静音成功的回调。 |
onError | Function | 静音失败的回调。 |
参数 | 类型 | 描述 |
liveID | string | 当前语聊房的 liveID。 |
userID | string | 被操作的用户 userID。 |
onSuccess | Function | 解除静音成功的回调。 |
onError | Function | 解除静音失败的回调。 |
kickUserOutOfSeat 方法,强制将指定用户踢下麦位。onKickedOffSeat 事件通知。import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';//通过 liveID 获取 LiveSeatState 的实例const { kickUserOutOfSeat, addLiveSeatEventListener } = useLiveSeatState(liveID);// 假设要踢走 "userB"const targetUserID = "userB";// 踢人下麦const handleKickUserOutOfSeat = (userID) => {kickUserOutOfSeat({liveID: liveID,userID: userID,onSuccess: () => {console.log('踢下麦位成功');},onError: (error) => {console.log('踢人失败', error);},});};useEffect(() => {addLiveSeatEventListener('onKickedOffSeat', () => {console.log('被主播踢下麦');// 可以在此进行弹框提示});}, [liveID]);
参数 | 类型 | 描述 |
liveID | string | 当前语聊房的 liveID。 |
userID | String | 被踢下麦的用户 userID。 |
onSuccess | Function | 踢下麦成功的回调。 |
onError | Function | 踢下麦失败的回调。 |
lockSeat 方法锁定指定索引的麦位,麦位被锁定后,观众无法通过 applyForSeat 或 takeSeat 占用该麦位。unlockSeat 可以解锁麦位,解锁后该麦位可以再次被占用。import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';//通过 liveID 获取 LiveSeatState 的实例const { lockSeat, unlockSeat } = useLiveSeatState(liveID);// 锁定 2 号麦位const handleLockSeat = () => {lockSeat({liveID: liveID,seatIndex: 2,onSuccess: () => {console.log(`已将 2 号麦位锁定`);},onError: (error) => {console.log('锁定麦位失败', error);},});};// 解锁 2 号麦位const handleUnlockSeat = () => {unlockSeat({liveID: liveID,seatIndex: 2,onSuccess: () => {console.log('已将 2 号麦位解锁');},onError: (error) => {console.log('解锁麦位失败', error);},});};
参数 | 类型 | 描述 |
liveID | string | 当前语聊房的 liveID。 |
seatIndex | number | 需要锁定的麦位索引。 |
onSuccess | Function | 锁麦成功的回调。 |
onError | Function | 锁麦失败的回调。 |
参数 | 类型 | 描述 |
liveID | string | 当前语聊房的 liveID。 |
seatIndex | number | 需要解锁的麦位索引。 |
onSuccess | Function | 解锁麦位成功的回调。 |
onError | Function | 解锁麦位失败的回调。 |
moveUserToSeat 移动麦位。userID 传入目标用户的 ID,targetIndex 是目标麦位索引,policy 参数来指定如果目标麦位有人时的移动策略,详细参见 接口参数 说明。userID 必须传入用户自己的 ID,targetIndex 传入想去的新麦位索引,此时 policy 参数无效,如果目标麦位有人时会报错并停止移动。import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';//通过 liveID 获取 LiveSeatState 的实例const { moveUserToSeat } = useLiveSeatState(liveID);const newSeatIndex = 2; // 目标麦位索引。const moveSeat = () => {moveUserToSeat({liveID: liveID,userID: "userC",targetIndex: newSeatIndex, // 目标麦位policy: 'FORCE_REPLACE',onSuccess: () => {console.log('移动麦位成功')},onError: (error) => {console.log('换座失败', error)}})}
参数 | 类型 | 描述 |
userID | string | 需要移麦的用户 userID。 |
targetIndex | number | 目标麦位索引。 |
policy | string | 目标麦位有人时的移动策略枚举: ABORT_WHEN_OCCUPIED:目标麦位有人时放弃移动(默认策略)FORCE_REPLACE:强制替换目标麦位上的用户,被替换的用户将会被踢下麦SWAP_POSITION:与目标麦位用户交换位置。 |
onSuccess | Function | 移动麦位成功的回调。 |
onError | Function | 移动麦位失败的回调。 |
LiveCoreView 作为核心组件来渲染主播和连麦观众的视频流。UI 的重点是处理视频画面的布局、大小,以及通过 在视频流上添加挂件(例如昵称、占位图)。您可以同时打开摄像头,麦克风。LiveCoreView,而是会基于 LiveSeatState 的数据(特别是 seatList)来构建一个网格 UI 。UI 的重点是实时显示每个麦位 SeatInfo 的状态:是否有人、是否静音、是否被锁定 ,以及是否正在说话。您只需要打开麦克风。LiveSeatState 中的 seatList 属性,它是一个[SeatInfo] 数组类型的响应式数据,每当数组变化时都会通知您重新渲染麦位列表。遍历此数组,您可以:seatInfo.userInfo 来获取麦位上用户信息。seatInfo.isLocked 判断麦位是否被锁定。seatInfo.userInfo.microphoneStatus 判断麦上用户的麦克风状态。DeviceState 管理的是物理设备,而 LiveSeatState 管理的是麦位业务(即音频流)。DeviceState:openLocalMicrophone:向系统请求权限并启动麦克风设备进行音频采集。这是一个“重”操作。closeLocalMicrophone:停止音频采集并释放麦克风设备。LiveSeatState:muteMicrophone:静音。停止向远端发送本地的音频流,但麦克风设备本身仍在运行。unmuteMicrophone:解除静音。恢复向远端发送音频流。openLocalMicrophone 来启动设备。unmuteMicrophone 和 muteMicrophone 来控制上行音频流的通断。文档反馈