会议对象是与 RealtimeKit 会话进行交互的核心接口。它提供了对参与者、本地用户控制、聊天、投票、插件等的访问。此对象在您初始化 SDK 时返回。
本指南涵盖了会议对象上的核心命名空间以及最常用的属性、方法和事件。各命名空间参考已链接以获取更多详细信息。
会议对象包含多个属性,这些属性组织了会议的不同方面:
meeting.self ↗ 表示会议中的本地用户(您)。它提供了控制您自己的音频、视频和屏幕共享的属性和方法。
关键属性:
// 参与者标识符
meeting.self.id; // Peer ID (每个会话唯一)
meeting.self.userId; // 参与者 ID (跨会话持久)
meeting.self.name; // 参与者显示名称
// 媒体状态
meeting.self.audioEnabled; // 布尔值:是否启用音频?
meeting.self.videoEnabled; // 布尔值:是否启用视频?
meeting.self.screenShareEnabled; // 布尔值:屏幕共享是否处于活动状态?
// 媒体轨道
meeting.self.audioTrack; // 音频 MediaStreamTrack,如果启用了音频
meeting.self.videoTrack; // 视频 MediaStreamTrack,如果启用了视频
meeting.self.screenShareTracks; // 结构:{ audio: MediaStreamTrack, video: MediaStreamTrack },如果启用了屏幕共享
// 房间状态
meeting.self.roomJoined; // 布尔值:是否已加入会议?
meeting.self.roomState; // 当前房间状态常用方法:
// 媒体控制
await meeting.self.enableAudio(); // 成功时在 `meeting.self` 上触发 `audioUpdate` 事件。
await meeting.self.disableAudio(); // 成功时在 `meeting.self` 上触发 `audioUpdate` 事件。
await meeting.self.enableVideo(); // 成功时在 `meeting.self` 上触发 `videoUpdate` 事件。
await meeting.self.disableVideo(); // 成功时在 `meeting.self` 上触发 `videoUpdate` 事件。
await meeting.self.enableScreenShare(); // 成功时在 `meeting.self` 上触发 `screenShareUpdate` 事件。
await meeting.self.disableScreenShare(); // 成功时在 `meeting.self` 上触发 `screenShareUpdate` 事件。
// 更新姓名
await meeting.self.setName("New Name"); // setName 仅在加入会议前有效
// 列出设备
await meeting.self.getAllDevices(); // 返回所有可用设备
await meeting.self.getAudioDevices(); // 返回所有可用音频设备
await meeting.self.getVideoDevices(); // 返回所有可用视频设备
await meeting.self.getSpeakerDevices(); // 返回所有可用扬声器设备
await meeting.self.getCurrentDevices(); // {audio: MediaDevice, video: MediaDevice, speaker: MediaDevice} 返回当前的设备配置
// 更改设备
await meeting.self.setDevice((await meeting.self.getAllDevices())[0]);meeting.self ↗ 表示会议中的本地用户(您)。它提供了控制您自己的音频、视频和屏幕共享的属性和方法。
关键属性:
// 参与者标识符
meeting.self.id; // Peer ID (每个会话唯一)
meeting.self.userId; // 参与者 ID (跨会话持久)
meeting.self.name; // 参与者显示名称
// 媒体状态
meeting.self.audioEnabled; // 布尔值:是否启用音频?
meeting.self.videoEnabled; // 布尔值:是否启用视频?
meeting.self.screenShareEnabled; // 布尔值:屏幕共享是否处于活动状态?
// 媒体轨道
meeting.self.audioTrack; // 音频 MediaStreamTrack,如果启用了音频
meeting.self.videoTrack; // 视频 MediaStreamTrack,如果启用了视频
meeting.self.screenShareTracks; // 结构:{ audio: MediaStreamTrack, video: MediaStreamTrack },如果启用了屏幕共享
// 房间状态
meeting.self.roomJoined; // 布尔值:是否已加入会议?
meeting.self.roomState; // 当前房间状态常用方法:
// 媒体控制
await meeting.self.enableAudio(); // 成功时在 `meeting.self` 上触发 `audioUpdate` 事件。
await meeting.self.disableAudio(); // 成功时在 `meeting.self` 上触发 `audioUpdate` 事件。
await meeting.self.enableVideo(); // 成功时在 `meeting.self` 上触发 `videoUpdate` 事件。
await meeting.self.disableVideo(); // 成功时在 `meeting.self` 上触发 `videoUpdate` 事件。
await meeting.self.enableScreenShare(); // 成功时在 `meeting.self` 上触发 `screenShareUpdate` 事件。
await meeting.self.disableScreenShare(); // 成功时在 `meeting.self` 上触发 `screenShareUpdate` 事件。
// 更新姓名
await meeting.self.setName("New Name"); // setName 仅在加入会议前有效
// 列出设备
await meeting.self.getAllDevices(); // 返回所有可用设备
await meeting.self.getAudioDevices(); // 返回所有可用音频设备
await meeting.self.getVideoDevices(); // 返回所有可用视频设备
await meeting.self.getSpeakerDevices(); // 返回所有可用扬声器设备
await meeting.self.getCurrentDevices(); // {audio: MediaDevice, video: MediaDevice, speaker: MediaDevice} 返回当前的设备配置
// 更改设备
await meeting.self.setDevice((await meeting.self.getAllDevices())[0]);meeting.self ↗ 表示会议中的本地用户(您)。它提供了控制您自己的音频、视频和屏幕共享的属性和方法。
关键属性:
// 参与者标识符
meeting.self.id; // Peer ID (每个会话唯一)
meeting.self.userId; // 参与者 ID (跨会话持久)
meeting.self.name; // 参与者显示名称
// 媒体状态
meeting.self.audioEnabled; // 布尔值:是否启用音频?
meeting.self.videoEnabled; // 布尔值:是否启用视频?
meeting.self.screenShareEnabled; // 布尔值:屏幕共享是否处于活动状态?
// 媒体轨道
meeting.self.audioTrack; // 音频 MediaStreamTrack,如果启用了音频
meeting.self.videoTrack; // 视频 MediaStreamTrack,如果启用了视频
meeting.self.screenShareTracks; // 结构:{ audio: MediaStreamTrack, video: MediaStreamTrack },如果启用了屏幕共享
// 房间状态
meeting.self.roomJoined; // 布尔值:是否已加入会议?
meeting.self.roomState; // 当前房间状态常用方法:
// 媒体控制
await meeting.self.enableAudio(); // 成功时在 `meeting.self` 上触发 `audioUpdate` 事件。
await meeting.self.disableAudio(); // 成功时在 `meeting.self` 上触发 `audioUpdate` 事件。
await meeting.self.enableVideo(); // 成功时在 `meeting.self` 上触发 `videoUpdate` 事件。
await meeting.self.disableVideo(); // 成功时在 `meeting.self` 上触发 `videoUpdate` 事件。
await meeting.self.enableScreenShare(); // 成功时在 `meeting.self` 上触发 `screenShareUpdate` 事件。
await meeting.self.disableScreenShare(); // 成功时在 `meeting.self` 上触发 `screenShareUpdate` 事件。
// 更新姓名
await meeting.self.setName("New Name"); // setName 仅在加入会议前有效
// 列出设备
await meeting.self.getAllDevices(); // 返回所有可用设备
await meeting.self.getAudioDevices(); // 返回所有可用音频设备
await meeting.self.getVideoDevices(); // 返回所有可用视频设备
await meeting.self.getSpeakerDevices(); // 返回所有可用扬声器设备
await meeting.self.getCurrentDevices(); // {audio: MediaDevice, video: MediaDevice, speaker: MediaDevice} 返回当前的设备配置
// 更改设备
await meeting.self.setDevice((await meeting.self.getAllDevices())[0]);meeting.localUser 表示会议中的本地用户(您)。它提供了控制您自己的音频、视频和屏幕共享的属性和方法。
关键属性:
// 参与者标识符
meeting.localUser.id // 本地用户参与者的 ID
meeting.localUser.userId // 跨会话的持久用户 ID
meeting.localUser.name // 本地用户的名称
meeting.localUser.picture // 本地用户的图片 URL(可选)
meeting.localUser.customParticipantId // 用户提供的参与者 ID(可选)
meeting.localUser.permissions // 在会议上下文中与本地用户各种能力相关的权限
// 媒体状态
meeting.localUser.audioEnabled // 布尔值:本地用户当前是否启用了音频
meeting.localUser.videoEnabled // 布尔值:本地用户当前是否启用了视频
meeting.localUser.screenShareEnabled // 布尔值:本地用户当前是否启用了屏幕共享
meeting.localUser.isCameraPermissionGranted // 布尔值:本地用户是否具有设备摄像头权限
meeting.localUser.isMicrophonePermissionGranted // 布尔值:本地用户是否具有设备麦克风权限
// 参与者元数据
meeting.localUser.isHost // 布尔值:本地用户是否为主持人
meeting.localUser.isPinned // 布尔值:本地用户是否被置顶
meeting.localUser.flags // 参与者标志(录制器、隐藏参与者、网络研讨会隐藏参与者)
// 预设信息
meeting.localUser.presetName // 表示本地用户预设名称的字符串值
meeting.localUser.presetInfo // 表示本地用户预设信息的类型化对象
meeting.localUser.designToken // 用于 UI 自定义的设计令牌
// 舞台和房间状态
meeting.localUser.stageStatus // 本地用户的舞台状态
meeting.localUser.roomJoined // 布尔值:本地用户是否已加入房间
meeting.localUser.waitListStatus // 本地用户的等候名单状态(NONE、WAITING、ACCEPTED 或 REJECTED)常用方法:
// 获取本地用户视频视图
meeting.localUser.getSelfPreview() // 返回一个可以添加到 Android 中任何 ViewGroup 的 VideoView
// 更新姓名
meeting.localUser.setDisplayName("New Name") // 姓名更改仅在 joinRoom() 之前和 init() 之后进行才可见
// 音频静音/取消静音
meeting.localUser.disableAudio { error: AudioError? -> }
meeting.localUser.enableAudio { error: AudioError? -> }
// 启用/禁用视频
meeting.localUser.disableVideo { error: VideoError? -> }
meeting.localUser.enableVideo { error: VideoError? -> }
// 启用/禁用屏幕共享
meeting.localUser.canEnableScreenShare() // 检查是否可以启用屏幕共享
val error: ScreenShareError? = meeting.localUser.enableScreenShare() // 失败则返回错误,成功则返回 null
meeting.localUser.disableScreenShare()
// 设备管理
val audioDevices = meeting.localUser.getAudioDevices() // 获取所有可用音频设备
val videoDevices = meeting.localUser.getVideoDevices() // 获取所有可用视频设备
meeting.localUser.setAudioDevice(audioDevices[0]) // 切换音频设备
meeting.localUser.setVideoDevice(videoDevices[0]) // 切换视频设备
val selectedAudio = meeting.localUser.getSelectedAudioDevice() // 获取当前选定的音频设备
val selectedVideo = meeting.localUser.getSelectedVideoDevice() // 获取当前选定的视频设备
meeting.localUser.switchCamera() // 在前置和后置摄像头之间切换
// 舞台权限
meeting.localUser.canJoinStage() // 检查本地用户是否可以加入舞台
meeting.localUser.canRequestToJoinStage() // 检查本地用户是否可以申请加入舞台
// 主持人控制
meeting.localUser.canDoParticipantHostControls() // 检查本地用户是否可以执行主持人控制
// 设置页面
meeting.localUser.shouldShowSetupScreen() // 检查是否应显示设置页面
meeting.localUser.shouldJoinMediaRoom() // 检查本地用户是否应加入媒体房间meeting.localUser 表示会议中的本地用户(您)。它提供了控制您自己的音频、视频和屏幕共享的属性和方法。
关键属性:
// 参与者标识符
meeting.localUser.id // 本地用户参与者的 ID
meeting.localUser.userId // 跨会话的持久用户 ID
meeting.localUser.name // 本地用户的名称
meeting.localUser.picture // 本地用户的图片 URL(可选)
meeting.localUser.customParticipantId // 用户提供的参与者 ID(可选)
meeting.localUser.permissions // 在会议上下文中与本地用户各种能力相关的权限
// 媒体状态
meeting.localUser.audioEnabled // 布尔值:本地用户当前是否启用了音频
meeting.localUser.videoEnabled // 布尔值:本地用户当前是否启用了视频
meeting.localUser.screenShareEnabled // 布尔值:本地用户当前是否启用了屏幕共享
meeting.localUser.isCameraPermissionGranted // 布尔值:本地用户是否具有设备摄像头权限
meeting.localUser.isMicrophonePermissionGranted // 布尔值:本地用户是否具有设备麦克风权限
// 参与者元数据
meeting.localUser.isHost // 布尔值:本地用户是否为主持人
meeting.localUser.isPinned // 布尔值:本地用户是否被置顶
meeting.localUser.flags // 参与者标志(录制器、隐藏参与者、网络研讨会隐藏参与者)
// 预设信息
meeting.localUser.presetName // 表示本地用户预设名称的字符串值
meeting.localUser.presetInfo // 表示本地用户预设信息的类型化对象
meeting.localUser.designToken // 用于 UI 自定义的设计令牌
// 舞台和房间状态
meeting.localUser.stageStatus // 本地用户的舞台状态
meeting.localUser.roomJoined // 布尔值:本地用户是否已加入房间
meeting.localUser.waitListStatus // 本地用户的等候名单状态(.none、.waiting、.accepted 或 .rejected)常用方法:
// 获取本地用户视频视图
meeting.localUser.getSelfPreview() // 返回适用于 iOS 的 VideoView (UIView)
// 更新姓名
meeting.localUser.setDisplayName("New Name") // 姓名更改仅在 joinRoom() 之前和 init() 之后进行才可见
// 音频静音/取消静音
meeting.localUser.disableAudio { error in }
meeting.localUser.enableAudio { error in }
// 启用/禁用视频
meeting.localUser.disableVideo { error in }
meeting.localUser.enableVideo { error in }
// 启用/禁用屏幕共享
meeting.localUser.canEnableScreenShare() // 检查是否可以启用屏幕共享
let error: ScreenShareError? = meeting.localUser.enableScreenShare() // 失败则返回错误,成功则返回 null
meeting.localUser.disableScreenShare()
// 设备管理
let audioDevices = meeting.localUser.getAudioDevices() // 获取所有可用音频设备
let videoDevices = meeting.localUser.getVideoDevices() // 获取所有可用视频设备
meeting.localUser.setAudioDevice(audioDevices[0]) // 切换音频设备
meeting.localUser.setVideoDevice(videoDevices[0]) // 切换视频设备
let selectedAudio = meeting.localUser.getSelectedAudioDevice() // 获取当前选定的音频设备
let selectedVideo = meeting.localUser.getSelectedVideoDevice() // 获取当前选定的视频设备
meeting.localUser.switchCamera() // 在前置和后置摄像头之间切换
// 舞台权限
meeting.localUser.canJoinStage() // 检查本地用户是否可以加入舞台
meeting.localUser.canRequestToJoinStage() // 检查本地用户是否可以申请加入舞台
// 主持人控制
meeting.localUser.canDoParticipantHostControls() // 检查本地用户是否可以执行主持人控制
// 设置页面
meeting.localUser.shouldShowSetupScreen() // 检查是否应显示设置页面
meeting.localUser.shouldJoinMediaRoom() // 检查本地用户是否应加入媒体房间meeting.localUser 表示会议中的本地用户(您)。它提供了控制您自己的音频、视频和屏幕共享的属性和方法。
关键属性:
// 参与者标识符
meeting.localUser.id; // 本地用户参与者的 ID
meeting.localUser.userId; // 跨会话的持久用户 ID
meeting.localUser.name; // 本地用户的名称
meeting.localUser.picture; // 本地用户的图片 URL(可选)
meeting.localUser.customParticipantId; // 用户提供的参与者 ID(可选)
meeting.localUser.permissions; // 在会议上下文中与本地用户各种能力相关的权限
// 媒体状态
meeting.localUser.audioEnabled; // 布尔值:本地用户当前是否启用了音频
meeting.localUser.videoEnabled; // 布尔值:本地用户当前是否启用了视频
meeting.localUser.screenShareEnabled; // 布尔值:本地用户当前是否启用了屏幕共享
meeting.localUser.isCameraPermissionGranted; // 布尔值:本地用户是否具有设备摄像头权限
meeting.localUser.isMicrophonePermissionGranted; // 布尔值:本地用户是否具有设备麦克风权限
// 参与者元数据
meeting.localUser.isHost; // 布尔值:本地用户是否为主持人
meeting.localUser.isPinned; // 布尔值:本地用户是否被置顶
meeting.localUser.flags; // 参与者标志(录制器、隐藏参与者、网络研讨会隐藏参与者)
// 预设信息
meeting.localUser.presetName; // 表示本地用户预设名称的字符串值
meeting.localUser.presetInfo; // 表示本地用户预设信息的类型化对象
// 舞台和房间状态
meeting.localUser.stageStatus; // 本地用户的舞台状态
meeting.localUser.roomJoined; // 布尔值:本地用户是否已加入房间
meeting.localUser.waitListStatus; // 本地用户的等候名单状态(None、Waiting、Accepted 或 Rejected)常用方法:
// 更新姓名
await meeting.localUser.setDisplayName("New Name"); // 姓名更改仅在 joinRoom() 之前和 init() 之后进行才可见
// 音频静音/取消静音
meeting.localUser.disableAudio(onResult: (error) {});
meeting.localUser.enableAudio(onResult: (error) {});
// 启用/禁用视频
meeting.localUser.disableVideo(onResult: (error) {});
meeting.localUser.enableVideo(onResult: (error) {});
// 启用/禁用屏幕共享
meeting.localUser.enableScreenShare();
meeting.localUser.disableScreenShare();
// 设备 management
final audioDevices = await meeting.localUser.getAudioDevices(); // 获取所有可用音频设备
final videoDevices = await meeting.localUser.getVideoDevices(); // 获取所有可用视频设备
await meeting.localUser.setAudioDevice(audioDevices[0]); // 切换音频设备
await meeting.localUser.setVideoDevice(videoDevices[0]); // 切换视频设备
final selectedAudio = await meeting.localUser.getSelectedAudioDevice(); // 获取当前选定的音频设备
final selectedVideo = await meeting.localUser.getSelectedVideoDevice(); // 获取当前选定的视频设备
meeting.localUser.switchCamera(); // 在前置和后置摄像头之间切换meeting.self ↗ 表示会议中的本地用户(您)。它提供了控制您自己的音频、视频和屏幕共享的属性和方法。
关键属性:
// 参与者标识符
meeting.self.id; // Peer ID (每个会话唯一)
meeting.self.userId; // 参与者 ID (跨会话持久)
meeting.self.name; // 参与者显示名称
// 媒体状态
meeting.self.audioEnabled; // 布尔值:是否启用音频?
meeting.self.videoEnabled; // 布尔值:是否启用视频?
meeting.self.screenShareEnabled; // 布尔值:屏幕共享是否处于活动状态?
// 媒体轨道
meeting.self.audioTrack; // 音频 MediaStreamTrack,如果启用了音频
meeting.self.videoTrack; // 视频 MediaStreamTrack,如果启用了视频
meeting.self.screenShareTracks; // 结构:{ audio: MediaStreamTrack, video: MediaStreamTrack },如果启用了屏幕共享
// 房间状态
meeting.self.roomJoined; // 布尔值:是否已加入会议?
meeting.self.roomState; // 当前房间状态常用方法:
// 媒体控制
await meeting.self.enableAudio(); // 成功时在 `meeting.self` 上触发 `audioUpdate` 事件。
await meeting.self.disableAudio(); // 成功时在 `meeting.self` 上触发 `audioUpdate` 事件。
await meeting.self.enableVideo(); // 成功时在 `meeting.self` 上触发 `videoUpdate` 事件。
await meeting.self.disableVideo(); // 成功时在 `meeting.self` 上触发 `videoUpdate` 事件。
await meeting.self.enableScreenShare(); // 成功时在 `meeting.self` 上触发 `screenShareUpdate` 事件。
await meeting.self.disableScreenShare(); // 成功时在 `meeting.self` 上触发 `screenShareUpdate` 事件。
// 更新姓名
await meeting.self.setName("New Name"); // setName 仅在加入会议前有效
// 列出设备
await meeting.self.getAllDevices(); // 返回所有可用设备
await meeting.self.getAudioDevices(); // 返回所有可用音频设备
await meeting.self.getVideoDevices(); // 返回所有可用视频设备
await meeting.self.getSpeakerDevices(); // 返回所有可用扬声器设备
await meeting.self.getCurrentDevices(); // {audio: MediaDevice, video: MediaDevice, speaker: MediaDevice} 返回当前的设备配置
// 更改设备
await meeting.self.setDevice((await meeting.self.getAllDevices())[0]);meeting.participants ↗ 包含会议中所有远程参与者的映射,按其状态组织。
参与者映射:
// 所有已加入的参与者
meeting.participants.joined; // 已加入参与者的映射
meeting.participants.joined.toArray(); // 已加入参与者的数组
// 具有活动媒体的参与者
meeting.participants.active; // 具有活动音频/视频的参与者的映射
meeting.participants.active.toArray(); // 具有活动音频/视频的参与者的数组
// 等候室中的参与者
meeting.participants.waitlisted; // 等候名单中参与者的映射
meeting.participants.waitlisted.toArray(); // 等候名单中参与者的数组
// 已置顶的参与者
meeting.participants.pinned; // 已置顶参与者的映射
meeting.participants.pinned.toArray(); // 已置顶参与者的数组访问参与者数据:
// 以数组形式获取所有已加入的参与者
const joinedParticipants = meeting.participants.joined.toArray();
// 访问第一个参与者的 ID
const firstParticipant = joinedParticipants[0];
console.log("第一个参与者的 Peer ID:", firstParticipant?.id); // Peer ID(每个会话唯一)
console.log("第一个参与者的 User ID:", firstParticipant?.userId); // 参与者 ID(持久)
console.log("第一个参与者的姓名:", firstParticipant?.name); // 显示名称
console.log("第一个参与者的音频是否启用:", firstParticipant?.audioEnabled); // 音频状态
console.log("第一个参与者的视频是否启用:", firstParticipant?.videoEnabled); // 视频状态
console.log(
"第一个参与者的屏幕共享是否启用:",
firstParticipant?.screenShareEnabled,
); // 屏幕共享状态
console.log("第一个参与者的音频轨道:", firstParticipant?.audioTrack); // 音频 MediaStreamTrack
console.log("第一个参与者的视频轨道:", firstParticipant?.videoTrack); // 视频 MediaStreamTrack
console.log(
"第一个参与者的屏幕共享轨道:",
firstParticipant?.screenShareTracks,
); // 屏幕共享 MediaStreamTrack
// 通过 peer ID 访问参与者
const participant = meeting.participants.joined.get("peer-id");
// 获取已加入参与者的计数
const count = meeting.participants.joined.size();参与者属性:
每个参与者对象都具有与 meeting.self 类似的属性:
participant.id; // Peer ID
participant.userId; // 参与者 ID
participant.name; // 显示名称
participant.audioEnabled; // 音频状态
participant.videoEnabled; // 视频状态
participant.screenShareEnabled; // 屏幕共享状态
participant.audioTrack; // 音频 MediaStreamTrack
participant.videoTrack; // 视频 MediaStreamTrack
participant.screenShareTrack; // 屏幕共享 MediaStreamTrackmeeting.participants 包含会议中所有远程参与者的映射,按其状态组织。
参与者映射:
// 所有已加入的参与者
meeting.participants.joined; // 已加入参与者的映射
meeting.participants.joined.toArray(); // 已加入参与者的数组
// 具有活动媒体的参与者
meeting.participants.active; // 具有活动音频/视频的参与者的映射
meeting.participants.active.toArray(); // 具有活动音频/视频的参与者的数组
// 等候室中的参与者
meeting.participants.waitlisted; // 等候名单中参与者的映射
meeting.participants.waitlisted.toArray(); // 等候名单中参与者的数组
// 已置顶的参与者
meeting.participants.pinned; // 已置顶参与者的映射
meeting.participants.pinned.toArray(); // 已置顶参与者的数组访问参与者数据:
// 以数组形式获取所有已加入的参与者
const joinedParticipants = meeting.participants.joined.toArray();
// 访问第一个参与者的 ID
const firstParticipant = joinedParticipants[0];
console.log("第一个参与者的 Peer ID:", firstParticipant?.id); // Peer ID(每个会话唯一)
console.log("第一个参与者的 User ID:", firstParticipant?.userId); // 参与者 ID(持久)
console.log("第一个参与者的姓名:", firstParticipant?.name); // 显示名称
console.log("第一个参与者的音频是否启用:", firstParticipant?.audioEnabled); // 音频状态
console.log("第一个参与者的视频是否启用:", firstParticipant?.videoEnabled); // 视频状态
console.log(
"第一个参与者的屏幕共享是否启用:",
firstParticipant?.screenShareEnabled,
); // 屏幕共享状态
console.log("第一个参与者的音频轨道:", firstParticipant?.audioTrack); // 音频 MediaStreamTrack
console.log("第一个参与者的视频轨道:", firstParticipant?.videoTrack); // 视频 MediaStreamTrack
console.log(
"第一个参与者的屏幕共享轨道:",
firstParticipant?.screenShareTracks,
); // 屏幕共享 MediaStreamTrack
// 通过 peer ID 访问参与者
const participant = meeting.participants.joined.get("peer-id");
// 获取已加入参与者的计数
const count = meeting.participants.joined.size();参与者属性:
每个参与者对象都具有与 meeting.self 类似的属性:
participant.id; // Peer ID
participant.userId; // 参与者 ID
participant.name; // 显示名称
participant.audioEnabled; // 音频状态
participant.videoEnabled; // 视频状态
participant.screenShareEnabled; // 屏幕共享状态
participant.audioTrack; // 音频 MediaStreamTrack
participant.videoTrack; // 视频 MediaStreamTrack
participant.screenShareTrack; // 屏幕共享 MediaStreamTrackmeeting.participants 包含会议中所有远程参与者的映射,按其状态组织。
参与者映射:
// 所有已加入的参与者
meeting.participants.joined; // 已加入参与者的映射
meeting.participants.joined.toArray(); // 已加入参与者的数组
// 具有活动媒体的参与者
meeting.participants.active; // 具有活动音频/视频的参与者的映射
meeting.participants.active.toArray(); // 具有活动音频/视频的参与者的数组
// 等候室中的参与者
meeting.participants.waitlisted; // 等候名单中参与者的映射
meeting.participants.waitlisted.toArray(); // 等候名单中参与者的数组
// 已置顶的参与者
meeting.participants.pinned; // 已置顶参与者的映射
meeting.participants.pinned.toArray(); // 已置顶参与者的数组访问参与者 data:
// 以数组形式获取所有已加入的参与者
const joinedParticipants = meeting.participants.joined.toArray();
// 访问第一个参与者的 ID
const firstParticipant = joinedParticipants[0];
console.log("第一个参与者的 Peer ID:", firstParticipant?.id); // Peer ID(每个会话唯一)
console.log("第一个参与者的 User ID:", firstParticipant?.userId); // 参与者 ID(持久)
console.log("第一个参与者的姓名:", firstParticipant?.name); // 显示名称
console.log("第一个参与者的音频是否启用:", firstParticipant?.audioEnabled); // 音频状态
console.log("第一个参与者的视频是否启用:", firstParticipant?.videoEnabled); // 视频状态
console.log(
"第一个参与者的屏幕共享是否启用:",
firstParticipant?.screenShareEnabled,
); // 屏幕共享状态
console.log("第一个参与者的音频轨道:", firstParticipant?.audioTrack); // 音频 MediaStreamTrack
console.log("第一个参与者的视频轨道:", firstParticipant?.videoTrack); // 视频 MediaStreamTrack
console.log(
"第一个参与者的屏幕共享轨道:",
firstParticipant?.screenShareTracks,
); // 屏幕共享 MediaStreamTrack
// 通过 peer ID 访问参与者
const participant = meeting.participants.joined.get("peer-id");
// 获取已加入参与者的计数
const count = meeting.participants.joined.size();参与者属性:
每个参与者对象都具有与 meeting.self 类似的属性:
participant.id; // Peer ID
participant.userId; // 参与者 ID
participant.name; // 显示名称
participant.audioEnabled; // 音频状态
participant.videoEnabled; // 视频状态
participant.screenShareEnabled; // 屏幕共享状态
participant.audioTrack; // 音频 MediaStreamTrack
participant.videoTrack; // 视频 MediaStreamTrack
participant.screenShareTrack; // 屏幕共享 MediaStreamTrackmeeting.participants 包含会议中所有远程参与者的列表,按其状态组织。
参与者列表:
// 所有已加入的参与者
val joined: List<RtkRemoteParticipant> = meeting.participants.joined
// 具有活动媒体的参与者
val active: List<RtkRemoteParticipant> = meeting.participants.active
// 等候室中的参与者
val waitlisted: List<RtkRemoteParticipant> = meeting.participants.waitlisted
// 已置顶的参与者
val pinned: RtkRemoteParticipant? = meeting.participants.pinned
// 正在共享屏幕的参与者
val screenShares: List<RtkRemoteParticipant> = meeting.participants.screenShares
// 活跃发言者
val activeSpeaker: RtkRemoteParticipant? = meeting.participants.activeSpeaker
// 参与者总数(包括已加入的本地用户)
val totalCount: Int = meeting.participants.totalCount访问参与者数据:
// 获取所有已加入的参与者
val joinedParticipants = meeting.participants.joined
// 访问第一个参与者
val firstParticipant = joinedParticipants.firstOrNull()
firstParticipant?.id // 参与者 ID(又称 peerId)
firstParticipant?.userId // 用户 ID
firstParticipant?.name // 显示名称
firstParticipant?.picture // 参与者图片(如果有)
firstParticipant?.customParticipantId // 自定义参与者 ID
firstParticipant?.audioEnabled // 音频状态
firstParticipant?.videoEnabled // 视频状态
firstParticipant?.screenShareEnabled // 屏幕共享状态
firstParticipant?.isPinned // 置顶状态
firstParticipant?.isHost // 主持人状态
firstParticipant?.presetName // 预设名称
firstParticipant?.stageStatus // 舞台状态
firstParticipant?.flags // 参与者标志(录制器、隐藏参与者、网络研讨会隐藏参与者)
// 获取参与者视频视图
firstParticipant?.getVideoView() // 返回渲染视频流的 View
firstParticipant?.getScreenShareVideoView() // 返回渲染屏幕共享流的 View
// 访问分页
val maxNumberOnScreen = meeting.participants.maxNumberOnScreen // 每页最大参与者数
val currentPageNumber = meeting.participants.currentPageNumber // 当前页码
val pageCount = meeting.participants.pageCount // 总页数
val canGoNextPage = meeting.participants.canGoNextPage // 可以导航到下一页
val canGoPreviousPage = meeting.participants.canGoPreviousPage // 可以导航到上一页
meeting.participants.setPage(1) // 切换到特定页面参与者控制方法:
// 单个参与者控制(仅限主持人)
firstParticipant?.disableAudio { error -> } // 禁用参与者的音频
firstParticipant?.disableVideo { error -> } // 禁用参与者的视频
firstParticipant?.kick { error -> } // 将参与者移出会议
// 置顶/取消置顶参与者
val error: HostError? = firstParticipant?.pin() // 置顶参与者
val error: HostError? = firstParticipant?.unpin() // 取消置顶参与者
// 等候室管理
meeting.participants.acceptWaitingRoomRequest(participantId) // 从等候室接受
meeting.participants.rejectWaitingRoomRequest(participantId) // 从等候室拒绝
meeting.participants.acceptAllWaitingRoomRequests() // 接受所有等待中的参与者
// 批量操作(仅限主持人)
val error: HostError? = meeting.participants.disableAllAudio() // 禁用所有参与者的音频
val error: HostError? = meeting.participants.disableAllVideo() // 禁用所有参与者的视频
val error: HostError? = meeting.participants.kickAll() // 移除所有参与者
// 广播自定义消息
meeting.participants.broadcastMessage("custom-event", mapOf("key" to "value"))
// 缓存管理
meeting.participants.enableCache() // 启用参与者缓存
meeting.participants.disableCache() // 禁用参与者缓存参与者属性:
participant.id // 参与者 ID(每个会话唯一,又称 peerId)
participant.userId // 用户 ID(跨会话持久)
participant.name // 显示名称
participant.picture // 参与者图片 URL
participant.customParticipantId // 自定义参与者 ID
participant.audioEnabled // 音频状态
participant.videoEnabled // 视频状态
participant.screenShareEnabled // 屏幕共享状态
participant.isPinned // 置顶状态
participant.isHost // 主持人状态
participant.presetName // 预设名称
participant.stageStatus // 舞台状态
participant.flags // 参与者标志(录制器、隐藏参与者、网络研讨会隐藏参与者)meeting.participants 包含会议中所有远程参与者的列表,按其状态组织。
参与者列表:
// 所有已加入的参与者
let joined: [RtkRemoteParticipant] = meeting.participants.joined
// 具有活动媒体的参与者
let active: [RtkRemoteParticipant] = meeting.participants.active
// 等候室中的参与者
let waitlisted: [RtkRemoteParticipant] = meeting.participants.waitlisted
// 已置顶的参与者
let pinned: RtkRemoteParticipant? = meeting.participants.pinned
// 正在共享屏幕的参与者
let screenShares: [RtkRemoteParticipant] = meeting.participants.screenShares
// 活跃发言者
let activeSpeaker: RtkRemoteParticipant? = meeting.participants.activeSpeaker
// 参与者总数(包括已加入的本地用户)
let totalCount: Int = meeting.participants.totalCount访问参与者数据:
// 获取所有已加入的参与者
let joinedParticipants = meeting.participants.joined
// 访问第一个参与者
let firstParticipant = joinedParticipants.first
firstParticipant?.id // 参与者 ID(又称 peerId)
firstParticipant?.userId // 用户 ID
firstParticipant?.name // 显示名称
firstParticipant?.picture // 参与者图片(如果有)
firstParticipant?.customParticipantId // 自定义参与者 ID
firstParticipant?.audioEnabled // 音频状态
firstParticipant?.videoEnabled // 视频状态
firstParticipant?.screenShareEnabled // 屏幕共享状态
firstParticipant?.isPinned // 置顶状态
firstParticipant?.isHost // 主持人状态
firstParticipant?.presetName // 预设名称
firstParticipant?.stageStatus // 舞台状态
firstParticipant?.flags // 参与者标志(录制器、隐藏参与者、网络研讨会隐藏参与者)
// 获取参与者视频视图
firstParticipant?.getVideoView() // 返回渲染视频流的 UIView
firstParticipant?.getScreenShareVideoView() // 返回渲染屏幕共享流的 UIView
// 访问分页
let maxNumberOnScreen = meeting.participants.maxNumberOnScreen // 每页最大参与者数
let currentPageNumber = meeting.participants.currentPageNumber // 当前页码
let pageCount = meeting.participants.pageCount // 总页数
let canGoNextPage = meeting.participants.canGoNextPage // 可以导航到下一页
let canGoPreviousPage = meeting.participants.canGoPreviousPage // 可以导航到上一页
meeting.participants.setPage(1) // 切换到特定页面参与者控制方法:
// 单个参与者控制(仅限主持人)
firstParticipant?.disableAudio { error in } // 禁用参与者的音频
firstParticipant?.disableVideo { error in } // 禁用参与者的视频
firstParticipant?.kick { error in } // 将参与者移出会议
// 置顶/取消置顶参与者
let error: HostError? = firstParticipant?.pin() // 置顶参与者
let error: HostError? = firstParticipant?.unpin() // 取消置顶参与者
// 等候室管理
meeting.participants.acceptWaitingRoomRequest(participantId) // 从等候室接受
meeting.participants.rejectWaitingRoomRequest(participantId) // 从等候室拒绝
meeting.participants.acceptAllWaitingRoomRequests() // 接受所有等待中的参与者
// 批量操作(仅限主持人)
let error: HostError? = meeting.participants.disableAllAudio() // 禁用所有参与者的音频
let error: HostError? = meeting.participants.disableAllVideo() // 禁用所有参与者的视频
let error: HostError? = meeting.participants.kickAll() // 移除所有参与者
// 广播自定义消息
meeting.participants.broadcastMessage("custom-event", ["key": "value"])
// 缓存管理
meeting.participants.enableCache() // 启用参与者缓存
meeting.participants.disableCache() // 禁用参与者缓存参与者属性:
participant.id // 参与者 ID(每个会话唯一,又称 peerId)
participant.userId // 用户 ID(跨会话持久)
participant.name // 显示名称
participant.picture // 参与者图片 URL
participant.customParticipantId // 自定义参与者 ID
participant.audioEnabled // 音频状态
participant.videoEnabled // 视频状态
participant.screenShareEnabled // 屏幕共享状态
participant.isPinned // 置顶状态
participant.isHost // 主持人状态
participant.presetName // 预设名称
participant.stageStatus // 舞台状态
participant.flags // 参与者标志(录制器、隐藏参与者、网络研讨会隐藏参与者)meeting.participants 包含会议中所有远程参与者的列表,按其状态组织。
参与者列表:
// 所有已加入的参与者
final joined = meeting.participants.joined; // List<RtkRemoteParticipant>
// 具有活动媒体的参与者
final active = meeting.participants.active; // List<RtkRemoteParticipant>
// 等候室中的参与者
final waitlisted = meeting.participants.waitlisted; // List<RtkRemoteParticipant>
// 已置顶的参与者
final pinned = meeting.participants.pinned; // RtkRemoteParticipant?
// 正在共享屏幕的参与者
final screenshares = meeting.participants.screenshares; // List<RtkRemoteParticipant>访问参与者数据:
// 获取所有已加入的参与者
final joinedParticipants = meeting.participants.joined;
// 访问第一个参与者
final firstParticipant = joinedParticipants.firstOrNull;
firstParticipant?.id; // 参与者 ID(又称 peerId)
firstParticipant?.userId; // 用户 ID
firstParticipant?.name; // 显示名称
firstParticipant?.picture; // 参与者图片(如果有)
firstParticipant?.customParticipantId; // 自定义参与者 ID
firstParticipant?.audioEnabled; // 音频状态
firstParticipant?.videoEnabled; // 视频状态
firstParticipant?.screenShareEnabled; // 屏幕共享状态
firstParticipant?.isPinned; // 置顶状态
firstParticipant?.isHost; // 主持人状态
firstParticipant?.presetName; // 预设名称
firstParticipant?.stageStatus; // 舞台状态
firstParticipant?.flags; // 参与者标志(录制器、隐藏参与者、网络研讨会隐藏参与者)
// 获取参与者视频视图
firstParticipant?.videoView; // 返回渲染视频流的 Widget
// 访问分页信息
final grid = meeting.participants.grid;
grid.pageCount; // 总页数
grid.currentPageNumber; // 当前页码
grid.shouldShowPaginator; // 是否显示分页器
grid.isNextPagePossible; // 可以导航到下一页
grid.isPreviousPagePossible; // 可以导航到上一页
meeting.participants.setPage(1); // 切换到特定页面参与者控制方法:
// 单个参与者控制(仅限主持人)
firstParticipant?.disableAudio(onResult: (error) {}); // 禁用参与者的音频
firstParticipant?.disableVideo(onResult: (error) {}); // 禁用参与者的视频
firstParticipant?.kick(onResult: (error) {}); // 将参与者移出会议
// 置顶/取消置顶参与者
final error: HostError? = firstParticipant?.pin(); // 置顶参与者
final error: HostError? = firstParticipant?.unpin(); // 取消置顶参与者
// 等候室管理
firstParticipant?.acceptWaitListedRequest(participantId); // 从等候室接受
firstParticipant?.rejectWaitListedRequest(participantId); // 从等候室拒绝
// 批量操作(仅限主持人)
meeting.participants.disableAllAudio(onResult: (error) {}); // 禁用所有参与者的音频
meeting.participants.disableAllVideo(onResult: (error) {}); // 禁用所有参与者的视频
meeting.participants.kickAll(onResult: (error) {}); // 移除所有参与者
// 等候室批量操作
meeting.participants.acceptWaitlistedParticipant(participant); // 接受特定参与者
meeting.participants.rejectWaitlistedParticipant(participant); // 拒绝特定参与者
meeting.participants.acceptAllWaitingRoomRequests(); // 接受所有等待中的参与者
// 广播自定义消息
meeting.participants.broadcastMessage("custom-event", {"key": "value"});参与者属性:
participant.id; // 参与者 ID(每个会话唯一,又称 peerId)
participant.userId; // 用户 ID(跨会话持久)
participant.name; // 显示名称
participant.picture; // 参与者图片 URL
participant.customParticipantId; // 自定义参与者 ID
participant.audioEnabled; // 音频状态
participant.videoEnabled; // 视频状态
participant.screenShareEnabled; // 屏幕共享状态
participant.isPinned; // 置顶状态
participant.isHost; // 主持人状态
participant.presetName; // 预设名称
participant.stageStatus; // 舞台状态
participant.flags; // 参与者标志(录制器、隐藏参与者、网络研讨会隐藏参与者)meeting.participants ↗ 包含会议中所有远程参与者的映射,按其状态组织。
参与者映射:
// 所有已加入的参与者
meeting.participants.joined; // 已加入参与者的映射
meeting.participants.joined.toArray(); // 已加入参与者的数组
// 具有活动媒体的参与者
meeting.participants.active; // 具有活动音频/视频的参与者的映射
meeting.participants.active.toArray(); // 具有活动音频/视频的参与者的数组
// 等候室中的参与者
meeting.participants.waitlisted; // 等候名单中参与者的映射
meeting.participants.waitlisted.toArray(); // 等候名单中参与者的数组
// 已置顶的参与者
meeting.participants.pinned; // 已置顶参与者的映射
meeting.participants.pinned.toArray(); // 已置顶参与者的数组访问参与者数据:
// 以数组形式获取所有已加入的参与者
const joinedParticipants = meeting.participants.joined.toArray();
// 访问第一个参与者的 ID
const firstParticipant = joinedParticipants[0];
console.log("第一个参与者的 Peer ID:", firstParticipant?.id); // Peer ID(每个会话唯一)
console.log("第一个参与者的 User ID:", firstParticipant?.userId); // 参与者 ID(持久)
console.log("第一个参与者的姓名:", firstParticipant?.name); // 显示名称
console.log("第一个参与者的音频是否启用:", firstParticipant?.audioEnabled); // 音频状态
console.log("第一个参与者的视频是否启用:", firstParticipant?.videoEnabled); // 视频状态
console.log(
"第一个参与者的屏幕共享是否启用:",
firstParticipant?.screenShareEnabled,
); // 屏幕共享状态
console.log("第一个参与者的音频轨道:", firstParticipant?.audioTrack); // 音频 MediaStreamTrack
console.log("第一个参与者的视频轨道:", firstParticipant?.videoTrack); // 视频 MediaStreamTrack
console.log(
"第一个参与者的屏幕共享轨道:",
firstParticipant?.screenShareTracks,
); // 屏幕共享 MediaStreamTrack
// 通过 peer ID 访问参与者
const participant = meeting.participants.joined.get("peer-id");
// 获取已加入参与者的计数
const count = meeting.participants.joined.size();参与者属性:
每个参与者对象都具有与 meeting.self 类似的属性:
participant.id; // Peer ID
participant.userId; // 参与者 ID
participant.name; // 显示名称
participant.audioEnabled; // 音频状态
participant.videoEnabled; // 视频状态
participant.screenShareEnabled; // 屏幕共享状态
participant.audioTrack; // 音频 MediaStreamTrack
participant.videoTrack; // 视频 MediaStreamTrack
participant.screenShareTrack; // 屏幕共享 MediaStreamTrackmeeting.meta ↗ 包含有关会议室本身的信息。
meeting.meta.meetingId; // 会议标识符
meeting.meta.meetingTitle; // 会议主题
meeting.meta.meetingStartedTimestamp; // 会议开始时间meeting.meta ↗ 包含有关会议室本身的信息。
meeting.meta.meetingId; // 会议标识符
meeting.meta.meetingTitle; // 会议主题
meeting.meta.meetingStartedTimestamp; // 会议开始时间meeting.meta ↗ 包含有关会议室本身的信息。
meeting.meta.meetingId; // 会议标识符
meeting.meta.meetingTitle; // 会议主题
meeting.meta.meetingStartedTimestamp; // 会议开始时间meeting.meta 包含有关会议室本身的信息。
属性:
meeting.meta.meetingId // 会议标识符
meeting.meta.meetingTitle // 会议主题
meeting.meta.meetingStartedTimestamp // 会议开始时间
meeting.meta.meetingType // 会议类型(GROUP_CALL、WEBINAR 或 LIVESTREAM)
meeting.meta.meetingConfig // 包含音频和视频设置的会议配置
meeting.meta.meetingState // 会议状态 (RtkMeetingState)
meeting.meta.authToken // 用户加入会议的身份验证令牌
meeting.meta.selfActiveTab // 本地参与者当前活跃的标签页 (ActiveTab?)
meeting.meta.mediaConnectionState // 媒体连接的当前状态 (MediaConnectionState)
meeting.meta.socketConnectionState // Socket 连接的当前状态 (SocketConnectionState)方法:
// 同步活跃标签页(用于插件或屏幕共享)
meeting.meta.syncTab(
id = "plugin-id-or-screenshare-id", // 唯一插件/屏幕共享的标识符
tabType = ActiveTabType.PLUGIN // 或 ActiveTabType.SCREENSHARE
)meeting.meta 包含有关会议室本身的信息。
属性:
meeting.meta.meetingId // 会议标识符
meeting.meta.meetingTitle // 会议主题
meeting.meta.meetingStartedTimestamp // 会议开始时间
meeting.meta.meetingType // 会议类型(.groupCall、.webinar 或 .livestream)
meeting.meta.meetingConfig // 包含音频和视频设置的会议配置
meeting.meta.meetingState // 会议状态 (RtkMeetingState)
meeting.meta.authToken // 用户加入会议的身份验证令牌
meeting.meta.selfActiveTab // 本地参与者当前活跃的标签页 (ActiveTab?)
meeting.meta.mediaConnectionState // 媒体连接的当前状态 (MediaConnectionState)
meeting.meta.socketConnectionState // Socket 连接的当前状态 (SocketConnectionState)方法:
// 同步活跃标签页(用于插件或屏幕共享)
meeting.meta.syncTab(
id: "plugin-id-or-screenshare-id", // 唯一插件/屏幕共享的标识符
tabType: .plugin // 或 .screenshare
)meeting.meta 包含有关会议室本身的信息。
属性:
meeting.meta.meetingId; // 会议标识符
meeting.meta.meetingTitle; // 会议主题
meeting.meta.meetingStartedTimeStamp; // 会议开始时间
meeting.meta.meetingType; // 会议类型(groupCall, webinar, 或 livestream)
meeting.meta.activeTab; // 本地参与者当前活跃的标签页 (ActiveTab?)
meeting.meta.designToken; // 用于 UI 自定义的设计令牌 (RtkDesignTokens)方法:
// 同步活跃标签页(用于插件或屏幕共享)
meeting.meta.syncTab(
"plugin-id-or-screenshare-id", // 唯一插件/屏幕共享的标识符
RtkActiveTabType.plugin // 或 RtkActiveTabType.screenshare
);meeting.meta ↗ 包含有关会议室本身的信息。
meeting.meta.meetingId; // 会议标识符
meeting.meta.meetingTitle; // 会议主题
meeting.meta.meetingStartedTimestamp; // 会议开始时间meeting.chat ↗ 管理在会议中共享的文本消息、图片和文件。
// 获取所有聊天消息
const messages = meeting.chat.messages;
// 发送文本消息
await meeting.chat.sendTextMessage("Hello everyone!");
// 发送图片消息
await meeting.chat.sendImageMessage(imageFile);
// 监听聊天消息
console.log("第一条消息:", meeting.chat.messages[0]);
meeting.chat.on("chatUpdate", ({ message, messages }) => {
console.log(`收到消息 ${message}`);
console.log(`聊天中的所有消息: ${messages.join(", ")}`);
});meeting.chat ↗ 管理在会议中共享的文本消息、图片和文件。
// 获取所有聊天消息
const messages = meeting.chat.messages;
// 发送文本消息
await meeting.chat.sendTextMessage("Hello everyone!");
// 发送图片消息
await meeting.chat.sendImageMessage(imageFile);
// 监听聊天消息
console.log("第一条消息:", meeting.chat.messages[0]);
meeting.chat.on("chatUpdate", ({ message, messages }) => {
console.log(`收到消息 ${message}`);
console.log(`聊天中的所有消息: ${messages.join(", ")}`);
});meeting.chat ↗ 管理在会议中共享的文本消息、图片和文件。
// 获取所有聊天消息
const messages = meeting.chat.messages;
// 发送文本消息
await meeting.chat.sendTextMessage("Hello everyone!");
// 发送图片消息
await meeting.chat.sendImageMessage(imageFile);
// 监听聊天消息
console.log("第一条消息:", meeting.chat.messages[0]);
meeting.chat.on("chatUpdate", ({ message, messages }) => {
console.log(`收到消息 ${message}`);
console.log(`聊天中的所有消息: ${messages.join(", ")}`);
});meeting.chat 管理在会议中共享的文本消息、图片和文件。
// 获取所有聊天消息
val messages = meeting.chat.messages
// 发送文本消息
val message = "Hello everyone!"
meeting.chat.sendTextMessage(message) // 失败则返回 ChatTextError,成功则返回 null
// 发送图片消息
meeting.chat.sendImageMessage(imageUri) { err ->
// 处理 ChatFileError(如果有)
}
// 发送文件
meeting.chat.sendFileMessage(fileUri) { err ->
// 处理 ChatFileError(如果有)
}
// 监听聊天消息
meeting.addChatEventListener(object : RtkChatEventListener {
override fun onChatUpdates(messages: List<ChatMessage>) {
// 每当聊天消息发生变化时调用
}
override fun onNewChatMessage(message: ChatMessage) {
// 当共享新聊天消息时调用
}
override fun onMessageRateLimitReset() {
// 当发送消息的速率限制重置时调用
}
})
// 处理错误
when (err) {
is ChatFileError.FileFormatNotAllowed -> {} // 不允许的文件格式
is ChatFileError.PermissionDenied -> {} // 无权发送文件
is ChatFileError.RateLimitBreached -> {} // 突破速率限制
is ChatFileError.ReadFailed -> {} // 无法读取文件
is ChatFileError.UploadFailed -> {} // 无法上传文件
else -> {}
}meeting.chat 管理在会议中共享的文本消息、图片和文件。
// 获取所有聊天消息
let messages = meeting.chat.messages
// 发送文本消息
let message = "Hello everyone!"
meeting.chat.sendTextMessage(message) // 失败则返回 ChatTextError,成功则返回 nil
// 发送图片消息
meeting.chat.sendImageMessage(imageUri) { err in
// 处理 ChatFileError(如果有)
}
// 发送文件
meeting.chat.sendFileMessage(fileUri) { err in
// 处理 ChatFileError(如果有)
}
// 监听聊天消息
extension MeetingViewModel: RtkChatEventListener {
func onChatUpdates(messages: [ChatMessage]) {
// 每当聊天消息发生变化时调用
}
func onNewChatMessage(message: ChatMessage) {
// 当共享新聊天消息时调用
}
func onMessageRateLimitReset() {
// 当发送消息的速率限制重置时调用
}
}
// 添加监听器
meeting.addChatEventListener(self)
// 处理错误
switch err {
case .fileFormatNotAllowed:
// 不允许的文件格式
case .permissionDenied:
// 无权发送文件
case .rateLimitBreached:
// 突破速率限制
case .readFailed:
// 无法读取文件
case .uploadFailed:
// 无法上传文件
default:
break
}meeting.chat 管理在会议中共享的文本消息、图片和文件。
// 获取所有聊天消息
final messages = meeting.chat.messages;
// 发送文本消息
final message = "Hello everyone!";
meeting.chat.sendTextMessage(message); // 失败则返回 ChatTextError,成功则返回 null
// 发送图片消息
meeting.chat.sendImageMessage(imageUri, (err) {
// 处理 ChatFileError(如果有)
});
// 发送文件
meeting.chat.sendFileMessage(fileUri, (err) {
// 处理 ChatFileError(如果有)
});
// 监听聊天消息
class ChatListener extends RtkChatEventListener {
@override
void onChatUpdates(List<ChatMessage> messages) {
// 每当聊天消息发生变化时调用
}
@override
void onNewChatMessage(ChatMessage message) {
// 当共享新聊天消息时调用
}
@override
void onMessageRateLimitReset() {
// 当发送消息的速率限制重置时调用
}
}
// 添加监听器
final chatListener = ChatListener();
meeting.addChatEventListener(chatListener);
// 处理错误
switch (err.runtimeType) {
case ChatFileError.FileFormatNotAllowed:
// 不允许的文件格式
break;
case ChatFileError.PermissionDenied:
// 无权发送文件
break;
case ChatFileError.RateLimitBreached:
// 突破速率限制
break;
case ChatFileError.ReadFailed:
// 无法读取文件
break;
case ChatFileError.UploadFailed:
// 无法上传文件
break;
default:
break;
}meeting.chat ↗ 管理在会议中共享的文本消息、图片和文件。
// 获取所有聊天消息
const messages = meeting.chat.messages;
// 发送文本消息
await meeting.chat.sendTextMessage("Hello everyone!");
// 发送图片消息
await meeting.chat.sendImageMessage(imageFile);
// 监听聊天消息
console.log("第一条消息:", meeting.chat.messages[0]);
meeting.chat.on("chatUpdate", ({ message, messages }) => {
console.log(`收到消息 ${message}`);
console.log(`聊天中的所有消息: ${messages.join(", ")}`);
});meeting.polls ↗ 管理会议中的投票。
// 获取所有投票
const polls = meeting.polls.items;
// 创建投票
await meeting.polls.create(
"What time works best?", // 问题
["9 AM", "2 PM", "5 PM"], // 选项
false, // 是否匿名
false, // 是否隐藏票数
);
// 进行投票
await meeting.polls.vote(pollId, optionIndex); // 从 meeting.polls.items 获取 pollIdmeeting.polls ↗ 管理会议中的投票。
// 获取所有投票
const polls = meeting.polls.items;
// 创建投票
await meeting.polls.create(
"What time works best?", // 问题
["9 AM", "2 PM", "5 PM"], // 选项
false, // 是否匿名
false, // 是否隐藏票数
);
// 进行投票
await meeting.polls.vote(pollId, optionIndex); // 从 meeting.polls.items 获取 pollIdmeeting.polls ↗ 管理会议中的投票。
// 获取所有投票
const polls = meeting.polls.items;
// 创建投票
await meeting.polls.create(
"What time works best?", // 问题
["9 AM", "2 PM", "5 PM"], // 选项
false, // 是否匿名
false, // 是否隐藏票数
);
// 进行投票
await meeting.polls.vote(pollId, optionIndex); // 从 meeting.polls.items 获取 pollIdmeeting.polls 管理会议中的投票。
// 获取所有投票
val polls = meeting.polls.items
// 创建投票
val pollsCreateError: PollsError? = meeting.polls.create(
question = "What time works best?",
options = listOf("9 AM", "2 PM", "5 PM"),
anonymous = false,
hideVotes = false
)
// 进行投票
val poll: Poll = meeting.polls.items.first()
val selectedPollOption: PollOption = poll.options.first()
val pollsError: PollsError? = meeting.polls.vote(poll.id, selectedPollOption)
// 监听投票更新
meeting.addPollsEventListener(object : RtkPollsEventListener {
override fun onNewPoll(poll: Poll) {
// 当创建新投票时调用
}
override fun onPollUpdate(poll: Poll) {
// 当投票更新时(票数、详情更改)调用
}
override fun onPollUpdates(pollItems: List<Poll>) {
// 当投票列表有更新时调用
}
})meeting.polls 管理会议中的投票。
// 获取所有投票
let polls = meeting.polls.items
// 创建投票
let pollsCreateError: PollsError? = meeting.polls.create(
question: "What time works best?",
options: ["9 AM", "2 PM", "5 PM"],
anonymous: false,
hideVotes: false
)
// 进行投票
let poll: Poll = meeting.polls.items.first
let selectedPollOption: PollOption = poll.options.first
let pollsError: PollsError? = meeting.polls.vote(poll.id, selectedPollOption)
// 监听投票更新
extension MeetingViewModel: RtkPollsEventListener {
func onNewPoll(poll: Poll) {
// 当创建新投票时调用
}
func onPollUpdate(poll: Poll) {
// 当投票更新时(票数、详情更改)调用
}
func onPollUpdates(pollItems: [Poll]) {
// 当投票列表有更新时调用
}
}
// 添加监听器
meeting.addPollsEventListener(self)meeting.polls 管理会议中的投票。
// 获取所有投票
final polls = meeting.polls.items;
// 创建投票
final pollsCreateError = meeting.polls.create(
question: "What time works best?",
options: ["9 AM", "2 PM", "5 PM"],
anonymous: false,
hideVotes: false
);
// 进行投票
final poll = meeting.polls.items.first;
final selectedPollOption = poll.options.first;
final pollsError = meeting.polls.vote(poll.id, selectedPollOption);
// 监听投票更新
class PollsListener extends RtkPollsEventListener {
@override
void onNewPoll(Poll poll) {
// 当创建新投票时调用
}
@override
void onPollUpdate(Poll poll) {
// 当投票更新时(票数、详情更改)调用
}
@override
void onPollUpdates(List<Poll> pollItems) {
// 当投票列表有更新时调用
}
}
// 添加监听器
final pollsListener = PollsListener();
meeting.addPollsEventListener(pollsListener);meeting.polls ↗ 管理会议中的投票。
// 获取所有投票
const polls = meeting.polls.items;
// 创建投票
await meeting.polls.create(
"What time works best?", // 问题
["9 AM", "2 PM", "5 PM"], // 选项
false, // 是否匿名
false, // 是否隐藏票数
);
// 进行投票
await meeting.polls.vote(pollId, optionIndex); // 从 meeting.polls.items 获取 pollIdmeeting.plugins 管理会议插件(协作应用)。激活操作位于 Plugin 对象上。
// 获取所有可用插件
const allPlugins = meeting.plugins.all.toArray();
// 获取活动插件
const activePlugins = meeting.plugins.active.toArray();
// 为所有参与者激活插件
await meeting.plugins.all.get(pluginId).activate();
// 为所有参与者停用插件
await meeting.plugins.all.get(pluginId).deactivate();meeting.plugins 管理会议插件(协作应用)。激活操作位于 Plugin 对象上。
// 获取所有可用插件
const allPlugins = meeting.plugins.all.toArray();
// 获取活动插件
const activePlugins = meeting.plugins.active.toArray();
// 为所有参与者激活插件
await meeting.plugins.all.get(pluginId).activate();
// 为所有参与者停用插件
await meeting.plugins.all.get(pluginId).deactivate();meeting.plugins 管理会议插件(协作应用)。激活操作位于 Plugin 对象上。
// 获取所有可用插件
const allPlugins = meeting.plugins.all.toArray();
// 获取活动插件
const activePlugins = meeting.plugins.active.toArray();
// 为所有参与者激活插件
await meeting.plugins.all.get(pluginId).activate();
// 为所有参与者停用插件
await meeting.plugins.all.get(pluginId).deactivate();meeting.plugins 管理会议插件(协作应用)。
// 获取所有可用插件
val plugins = meeting.plugins.all
// 获取活动插件
val activePlugins = meeting.plugins.active
// 激活插件
meeting.plugins.all.first().activate()
// 停用插件
meeting.plugins.active.first().deactivate()
// 获取插件视图
val pluginView = meeting.plugins.active.first().getPluginView() // 返回 WebView
// 向插件发送数据
val pluginId = ""
val plugin = meeting.plugins.active.firstOrNull { it.id == pluginId }
plugin?.sendData(
eventName = "my-custom-event",
data = "Hello world"
)
// 向插件上传文件
plugin?.uploadFile(
RtkPluginFile(
resultCode = <activity-resultCode>,
data = Intent() // 包含文件数据的 Intent
)
)
// 监听插件事件
val pluginsEventListener = object : RtkPluginsEventListener {
override fun onPluginActivated(plugin: RtkPlugin) {
// 当插件被激活时调用
}
override fun onPluginDeactivated(plugin: RtkPlugin) {
// 当插件被停用时调用
}
override fun onPluginMessage(plugin: RtkPlugin, eventName: String, data: Any?) {
// 当插件发送消息时调用
}
override fun onPluginFileRequest(plugin: RtkPlugin) {
// 当插件请求文件时调用
}
}
meeting.addPluginsEventListener(pluginsEventListener)meeting.plugins 管理会议插件(协作应用)。
// 获取所有可用插件
let plugins = meeting.plugins.all
// 获取活动插件
let activePlugins = meeting.plugins.active
// 激活插件
meeting.plugins.all.first?.activate()
// 停用插件
meeting.plugins.active.first?.deactivate()
// 获取插件视图
let pluginView = meeting.plugins.active.first?.getPluginView() // 返回 WKWebView
// 向插件发送数据
let pluginId = ""
let plugin = meeting.plugins.active.first { $0.id == pluginId }
plugin?.sendData(
eventName: "my-custom-event",
data: "Hello world"
)
// 监听插件事件
extension MeetingViewModel: RtkPluginsEventListener {
func onPluginActivated(plugin: RtkPlugin) {
// 当插件被激活时调用
}
func onPluginDeactivated(plugin: RtkPlugin) {
// 当插件被停用时调用
}
func onPluginMessage(plugin: RtkPlugin, eventName: String, data: Any?) {
// 当插件发送消息时调用
}
func onPluginFileRequest(plugin: RtkPlugin) {
// 当插件请求文件时调用
}
}
// 添加监听器
meeting.addPluginsEventListener(self)meeting.plugins 管理会议插件(协作应用)。
// 获取所有可用插件
final plugins = meeting.plugins.all;
// 获取活动插件
final activePlugins = meeting.plugins.active;
// 激活插件
meeting.plugins.all.first.activate();
// 停用插件
meeting.plugins.active.first.deactivate();
// 获取插件视图
final pluginView = meeting.plugins.active.first.getPluginView(); // 返回 Widget
// 向插件发送数据
final pluginId = "";
final plugin = meeting.plugins.active.firstWhere((p) => p.id == pluginId, orElse: () => null);
plugin?.sendData(
eventName: "my-custom-event",
data: "Hello world"
);
// 监听插件事件
class PluginsListener extends RtkPluginsEventListener {
@override
void onPluginActivated(RtkPlugin plugin) {
// 当插件被激活时调用
}
@override
void onPluginDeactivated(RtkPlugin plugin) {
// 当插件被停用时调用
}
@override
void onPluginMessage(RtkPlugin plugin, String eventName, dynamic data) {
// 当插件发送消息时调用
}
@override
void onPluginFileRequest(RtkPlugin plugin) {
// 当插件请求文件时调用
}
}
// 添加监听器
final pluginsListener = PluginsListener();
meeting.addPluginsEventListener(pluginsListener);meeting.plugins ↗ 管理会议插件(协作应用)。
// 获取所有可用插件
const plugins = meeting.plugins.all;
// 激活插件
await meeting.plugins.activate(pluginId);
// 停用插件
await meeting.plugins.deactivate();meeting.ai 提供了对 AI 驱动功能(如实时字幕)的访问。
// 访问实时字幕
meeting.ai.transcripts; // 仅当在预设中启用字幕时显示meeting.ai 提供了对 AI 驱动功能(如实时字幕)的访问。
// 访问实时字幕
meeting.ai.transcripts; // 仅当在预设中启用字幕时显示meeting.ai 提供了对 AI 驱动功能(如实时字幕)的访问。
// 访问实时字幕
meeting.ai.transcripts; // 仅当在预设中启用字幕时显示meeting.ai 提供了对 AI 驱动功能(如实时字幕)的访问。
// 访问实时字幕
meeting.ai.transcripts; // 仅当在预设中启用字幕时显示meeting.ai 在此移动平台上不受支持。
meeting.ai 在此移动平台上不受支持。
meeting.ai 在此移动平台上不受支持。
加入或离开会议室:
// 加入会议室
await meeting.join(); // 成功时在 `meeting.self` 上触发 `roomJoined` 事件
// 离开会议室
await meeting.leave();// 加入会议室
await meeting.join(); // 成功时在 `meeting.self` 上触发 `roomJoined` 事件
// 离开会议室
await meeting.leave();// 加入会议室
await meeting.join(); // 成功时在 `meeting.self` 上触发 `roomJoined` 事件
// 离开会议室
await meeting.leave();// 加入会议室
meeting.joinRoom(
onSuccess = {
// 已加入房间
},
onFailure = { err ->
// 处理错误
}
)
// 离开会议室
meeting.leave(
onSuccess = {
// 已离开房间
},
onFailure = { err ->
// 处理错误
}
)// 加入会议室
meeting.joinRoom(
onSuccess: {
// 已加入房间
},
onFailure: { err in
// 处理错误
}
)
// 离开会议室
meeting.leave(
onSuccess: {
// 已离开房间
},
onFailure: { err in
// 处理错误
}
)// 加入会议室
meeting.joinRoom(
onSuccess: () {
// 已加入房间
},
onFailure: (err) {
// 处理错误
}
);
// 离开会议室
meeting.leave(
onSuccess: () {
// 已离开房间
},
onFailure: (err) {
// 处理错误
}
);// 加入会议室
await meeting.join(); // 成功时在 `meeting.self` 上触发 `roomJoined` 事件
// 离开会议室
await meeting.leave();RealtimeKit 对参与者使用两种类型的标识符:
-
会话 ID (
id):每个会议连接的唯一标识符。每次参与者加入新会话时都会更改。在 Web 平台上,这被称为“Peer ID”,存储在meeting.self.id或participant.id中。在移动平台上,这被称为“参与者 ID”,存储在meeting.localUser.id或participant.id中。 -
用户 ID (
userId):参与者跨多个会话的持久标识符。当用户重新连接时保持不变。这存储在meeting.self.userId(Web) 或meeting.localUser.userId(Mobile) 中,对于远程参与者则存储在participant.userId中。
何时使用:
- 当您需要跨不同会话或重新连接跟踪同一用户时(例如,保存用户首选项或权限),请使用
userId。 - 当处理当前会话的连接时(例如,管理活动视频流或实时参与者状态),请使用
id。
-
监听事件而不是轮询:当状态发生变化时,会议对象会触发事件。订阅这些事件,而不是持续检查属性值。
-
使用参与者集合:在 Web 平台上,使用
toArray()将参与者映射转换为数组。在移动平台上,参与者集合已经是列表,您可以直接对其进行循环遍历。 -
检查连接状态:在访问需要活动会话的属性或调用方法之前,务必检查
roomJoined(在移动端为meeting.localUser.roomJoined)。 -
优雅地处理错误:许多方法都接受错误回调。请始终实现适当的错误处理,以提供良好的用户体验。
现在您已经了解了会议对象的结构,可以使用它来构建自定义会议体验。UI Kit 组件在内部使用相同的会议对象来提供开箱即用的界面。在下一指南中,我们将向您展示如何将 UI Kit 组件与直接会议对象访问相结合,以创建您自己的自定义 UI。