会议
会议通过 BimRtcManager.meetingService 管理。会议分为即时会议和预约会议,创建、编辑、查询属于会议数据服务,开始或加入后通过 BimMeetingSession 控制实时媒体。
会议类型
| 类型 | 说明 | 是否可创建 |
|---|---|---|
INSTANT | 创建后立即使用的会议 | 是 |
RESERVE | 带开始和结束时间的预约会议 | 是 |
CALL | 历史通话映射记录 | 否,只读展示 |
BimMeetingType.CALL 只用于识别历史记录,不能通过会议 API 创建、编辑或入会。
查询会议列表
kotlin
val result = BimRtcManager.getInstance().meetingService.fetchMeetings(
BimMeetingListQueryOptions(
status = BimMeetingStatus.WAITING,
startTime = startOfMonth,
endTime = endOfMonth,
),
)
result.meetings.forEach { meeting ->
println("${meeting.meetingNumber}: ${meeting.subject}")
}
println("total=${result.totalCount}")BimMeetingListQueryOptions:
| 字段 | 说明 |
|---|---|
status | UNKNOWN 表示不按状态过滤 |
startTime | 开始时间范围,0 表示不传 |
endTime | 结束时间范围,0 表示不传 |
列表返回 BimMeetingListResult.meetings 和 totalCount。时间戳使用毫秒时间戳。
创建即时会议
kotlin
val meeting = rtc.meetingService.createMeeting(
BimMeetingCreateOptions(
meetingType = BimMeetingType.INSTANT,
mediaType = BimRtcMediaType.VIDEO,
subject = "项目例会",
inviteeUserIds = listOf("u10002", "u10003"),
),
)BimMeetingCreateOptions 的字段:
| 字段 | 说明 |
|---|---|
meetingType | INSTANT 或 RESERVE |
mediaType | AUDIO 或 VIDEO |
subject | 会议主题 |
reserveStartTime | 预约开始时间,预约会议使用 |
reserveEndTime | 预约结束时间,预约会议使用 |
remindBeforeMinutes | 提前提醒分钟数,默认 15 |
inviteeUserIds | 初始邀请成员 ID 列表 |
预约会议示例:
kotlin
val reserved = rtc.meetingService.createMeeting(
BimMeetingCreateOptions(
meetingType = BimMeetingType.RESERVE,
mediaType = BimRtcMediaType.AUDIO,
subject = "周会",
reserveStartTime = startTime,
reserveEndTime = endTime,
remindBeforeMinutes = 10,
),
)预约会议的结束时间必须晚于开始时间。会议创建成功后,返回的 BimMeeting 包含 meetingId、meetingNumber、组织者、状态、时间和成员快照。
查询、编辑和取消
kotlin
val current = rtc.meetingService.queryMeeting(meeting.meetingNumber)
val edited = rtc.meetingService.editMeeting(
meetingNumber = meeting.meetingNumber,
options = BimMeetingEditOptions(
mediaType = BimRtcMediaType.VIDEO,
subject = "调整后的项目例会",
reserveStartTime = startTime,
reserveEndTime = endTime,
remindBeforeMinutes = 5,
inviteeUserIds = listOf("u10002", "u10003", "u10004"),
),
)
val canceled = rtc.meetingService.cancelMeeting(meeting.meetingNumber)编辑和取消前应根据会议当前状态控制页面按钮。已结束或已取消的会议不应继续执行变更操作。
开始或加入会议
组织者开始会议:
kotlin
val session = rtc.meetingService.startMeeting(
meetingNumber = meeting.meetingNumber,
options = BimMeetingEnterOptions(
initialMicrophoneMuted = false,
initialCameraEnabled = true,
preferredAudioOutput = BimRtcAudioOutput.SPEAKER,
),
)其他成员加入会议:
kotlin
val session = rtc.meetingService.joinMeeting(
meetingNumber = meeting.meetingNumber,
options = BimMeetingEnterOptions(initialCameraEnabled = false),
)BimMeetingEnterOptions 只描述进入时的本地媒体状态;进入后的控制通过 BimMeetingSession 完成。
会议状态
kotlin
val listener = object : BimMeetingListener {
override fun onMeetingSession(
session: BimMeetingSession,
snapshot: BimMeetingSnapshot,
) {
when (snapshot.state) {
BimMeetingSessionState.CONNECTING -> showConnecting()
BimMeetingSessionState.CONNECTED -> showMeeting(snapshot.meeting)
BimMeetingSessionState.RECONNECTING -> showReconnecting()
BimMeetingSessionState.ENDING -> showEnding()
BimMeetingSessionState.ENDED -> showEnded(snapshot.terminalError)
}
}
override fun onMeetingInvite(message: BimMeetingInviteMessage) {
// 处理会议邀请
}
override fun onMeetingStatus(message: BimMeetingStatusMessage) {
// 更新会议等待、开始、取消或结束状态
}
override fun onMeetingError(session: BimMeetingSession?, error: BimRtcError) {
// 处理错误
}
}
rtc.addMeetingListener(listener)BimMeetingSnapshot 包含当前会议对象、revision、媒体状态和终态错误。会议状态包括 CONNECTING、CONNECTED、RECONNECTING、ENDING 和 ENDED。
会议会话控制
kotlin
session.setMicrophoneMuted(true)
session.setCameraEnabled(false)
session.switchCamera()
session.setAudioOutput(BimRtcAudioOutput.BLUETOOTH)
session.setScreenSharing(true)
session.attachRenderView(videoContainer)
// 退出会议
session.leave()
session.detachRenderView()退出会议只结束当前成员的实时媒体会话,不等同于取消整个会议。取消会议由组织者调用 meetingService.cancelMeeting(meetingNumber)。
会议邀请与状态通知
会议邀请和会议状态以 BimMeetingInviteMessage、BimMeetingStatusMessage 表达,包含消息 ID、会议号、会议名称、时间、操作者和参与者列表。它们是 RTC 业务事件,不应当作为普通聊天气泡自行拼装。
Core 的 BimMeetingMessage 仍可能出现在消息历史中,但它只是聊天历史中的控制记录;会议页面应以 RTC 服务和 BimMeetingListener 的状态为准。
渲染、权限与生命周期
- 相机、麦克风、通知和前台服务权限由宿主在使用前申请。
- 宿主负责准备
ViewGroup、页面导航和权限拒绝后的降级 UI。 - RTC 初始化后会感知核心 IM 登录态;账号切换、登出或核心 SDK 释放会结束旧账号会议。
- 页面销毁时移除全局监听器,会议结束时移除会话监听和渲染视图。
- 应用进入后台时不要把页面销毁误认为会议结束;是否保持或恢复媒体由 RTC 会话状态和宿主业务决定。
kotlin
rtc.removeMeetingListener(listener)
session.detachRenderView()
rtc.release()常见错误
| 错误 | 含义 |
|---|---|
NOT_INITIALIZED | RTC 尚未初始化 |
NOT_LOGGED_IN | 核心 IM 没有有效登录态 |
INVALID_ARGUMENT | 会议号、时间或参数不合法 |
ALREADY_ACTIVE | 已存在活动通话或会议 |
PERMISSION_DENIED | 宿主未授予所需权限 |
MEDIA_UNAVAILABLE | 本机媒体能力不可用 |
NETWORK_UNAVAILABLE | 网络不可用 |
FEATURE_UNSUPPORTED | 当前环境不支持该能力 |
遇到错误时不要继续使用失败的 BimMeetingSession;先根据 BimMeetingSnapshot 或错误回调更新页面,再决定重试、重新加入或退出当前页面。
