独立 RTC 频道
DRClient.instance.channels 提供独立频道控制,im-call 提供 LiveKit 媒体和视频视图。频道不依赖 IM 群,不使用来电振铃。规则见频道概述,依赖安装见Android 概述。
依赖与权限
引入相同版本的 im 和 im-call;后者自动注册频道媒体提供方,无需设置系统来电选项。没有媒体提供方时 channels.supported=false,join 在预留服务器席位前以 unsupported 拒绝。
App 通过 Android 权限 API 获取 RECORD_AUDIO,视频采集还需 CAMERA。SDK 不自行弹出 Android 权限请求,缺少授权返回 permission_required。采集按钮由用户操作触发;subscriber 不能发布,audio 频道不能开启摄像头。
加入、取消与恢复
在已登录 Activity / Fragment 的协程中使用,ticketFromBusinessServer 由业务服务端提供:
import com.deeprespond.im.ChannelJoinOptions
import com.deeprespond.im.DRClient
val channels = DRClient.instance.channels
check(channels.supported)
val handle = channels.join(
"meeting-demo",
ChannelJoinOptions(ticket = ticketFromBusinessServer),
)
// 默认不采集;完成媒体连接和服务端 joined 确认后才返回。
handle.setMicrophoneEnabled(true) // 用户操作且 RECORD_AUDIO 已授权。
handle.setCameraEnabled(true) // video publisher,且 CAMERA 已授权。
handle.leave()开放频道省略 ticket。ChannelJoinOptions 还包括 clientSessionId、microphoneEnabled、cameraEnabled,两个采集选项默认 false。同一次尝试重试保持原加入键;取消 join 协程会清理预留,退出 HTTP 失败仍停止本地媒体。
val existing = channels.currentSession()
if (existing != null && existing.status in setOf("joining", "joined")) {
val restored = channels.resume(existing.channelId, existing.sessionId)
// 恢复只使用原会话,不新占位,也不自动采集。
}current 是本地句柄 StateFlow;currentSession() 查询本登录的服务端会话。不能跨登录恢复;leaving 等待清理,left 不可恢复。数字 ID 保持 String,不转 Int 或截断。
状态与画面
handle.snapshot: StateFlow<ChannelSnapshot> 和 handle.tracks: StateFlow<List<ChannelTrack>> 用于界面观察。快照包含 channel、session、members、mediaState、microphoneEnabled、cameraEnabled、error。远端轨道经已授权成员名单确认后公开。
val stateJob = lifecycleScope.launch {
handle.snapshot.collect { snapshot -> renderChannelState(snapshot) }
}
val tracksJob = lifecycleScope.launch {
handle.tracks.collect { tracks ->
val video = tracks.firstOrNull { it.kind == "video" && !it.local }
channelVideoView.bind(handle, video)
}
}
// 页面结束时停止观察,解绑画面,并在可完成清理的协程中 leave。
stateJob.cancel()
tracksJob.cancel()
channelVideoView.unbind()
handle.leave()renderChannelState 是 App 的渲染函数;channelVideoView 为 com.deeprespond.im.call.DRChannelVideoView,支持 FIT / FILL、mirror、bind / unbind。不要拿 username 或不明媒体 identity 伪造已授权视频。
生命周期与边界
SDK 自动控制心跳和续凭据;登录切换、退出和媒体故障会停止本地连接。HTTP 授权检查不能被 LiveKit 的连接令牌刷新替代。票据、媒体 Token 和句柄不持久保存。
独立频道不会自动接入 DRCallUI、Core-Telecom、系统振铃或来电通知。当前面向前台使用,后台持续采集仍需前台服务、可见通知及专项系统适配和验收。离开页面时明确 leave,不能只解绑视频视图。
本轮频道源码与自动化检查已完成,尚未发布新的 APK / AAR 或完成真机多方互通验收。Java API 见Java 接入,完整签名见接口参考,类型见数据类型。
