Skip to content
v1
文档/Android SDK/开发指南

会议

会议通过 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

字段说明
statusUNKNOWN 表示不按状态过滤
startTime开始时间范围,0 表示不传
endTime结束时间范围,0 表示不传

列表返回 BimMeetingListResult.meetingstotalCount。时间戳使用毫秒时间戳。

创建即时会议

kotlin
val meeting = rtc.meetingService.createMeeting(
    BimMeetingCreateOptions(
        meetingType = BimMeetingType.INSTANT,
        mediaType = BimRtcMediaType.VIDEO,
        subject = "项目例会",
        inviteeUserIds = listOf("u10002", "u10003"),
    ),
)

BimMeetingCreateOptions 的字段:

字段说明
meetingTypeINSTANTRESERVE
mediaTypeAUDIOVIDEO
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 包含 meetingIdmeetingNumber、组织者、状态、时间和成员快照。

查询、编辑和取消

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、媒体状态和终态错误。会议状态包括 CONNECTINGCONNECTEDRECONNECTINGENDINGENDED

会议会话控制

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)

会议邀请与状态通知

会议邀请和会议状态以 BimMeetingInviteMessageBimMeetingStatusMessage 表达,包含消息 ID、会议号、会议名称、时间、操作者和参与者列表。它们是 RTC 业务事件,不应当作为普通聊天气泡自行拼装。

Core 的 BimMeetingMessage 仍可能出现在消息历史中,但它只是聊天历史中的控制记录;会议页面应以 RTC 服务和 BimMeetingListener 的状态为准。

渲染、权限与生命周期

  • 相机、麦克风、通知和前台服务权限由宿主在使用前申请。
  • 宿主负责准备 ViewGroup、页面导航和权限拒绝后的降级 UI。
  • RTC 初始化后会感知核心 IM 登录态;账号切换、登出或核心 SDK 释放会结束旧账号会议。
  • 页面销毁时移除全局监听器,会议结束时移除会话监听和渲染视图。
  • 应用进入后台时不要把页面销毁误认为会议结束;是否保持或恢复媒体由 RTC 会话状态和宿主业务决定。
kotlin
rtc.removeMeetingListener(listener)
session.detachRenderView()
rtc.release()

常见错误

错误含义
NOT_INITIALIZEDRTC 尚未初始化
NOT_LOGGED_IN核心 IM 没有有效登录态
INVALID_ARGUMENT会议号、时间或参数不合法
ALREADY_ACTIVE已存在活动通话或会议
PERMISSION_DENIED宿主未授予所需权限
MEDIA_UNAVAILABLE本机媒体能力不可用
NETWORK_UNAVAILABLE网络不可用
FEATURE_UNSUPPORTED当前环境不支持该能力

遇到错误时不要继续使用失败的 BimMeetingSession;先根据 BimMeetingSnapshot 或错误回调更新页面,再决定重试、重新加入或退出当前页面。