獨立 RTC 頻道
獨立頻道用於會議、語音房這類不依賴 IM 群的場景:使用者憑業務服務端給的許可加入,沒有振鈴和來電介面。加入和離開用 DRClient.instance.channels,音影片和影片檢視由 im-call 模組提供。頻道的規則見服務端的頻道概述,模組的安裝見 Android 概述。
| 要做什麼 | 看哪裡 |
|---|---|
| 引入模組、申請許可權 | 依賴與許可權 |
| 加入、離開,App 重啟後恢復 | 加入、取消與恢復 |
| 顯示成員和影片畫面 | 狀態與畫面 |
| 退出登入、後臺時的行為 | 生命週期與邊界 |
依賴與許可權
- 引入同一版本的
im和im-call。im-call會自動為頻道提供媒體能力,不需要配置系統來電的選項。 - 沒有
im-call時channels.supported為false,join直接以unsupported失敗,不會佔用服務端的名額。 - 麥克風許可權
RECORD_AUDIO、攝像頭許可權CAMERA由 App 用 Android 的許可權 API 申請;SDK 不會自己彈出許可權請求,缺少許可權時返回permission_required。 - 開啟麥克風、攝像頭要由使用者操作觸發。只能觀看的身份(
subscriber)不能釋出音影片,純語音訊道(audio)不能開啟攝像頭。
加入、取消與恢復
在已登入 Activity / Fragment 的協程中使用,ticketFromBusinessServer 由業務服務端提供:
kotlin
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,加入時不開啟麥克風和攝像頭。- SDK 重試同一次加入時沿用同一個加入標識,不會重複加入。
- 取消
join所在的協程會釋放已佔用的名額;leave的請求即使失敗,本地的麥克風和攝像頭也會停止。
kotlin
val existing = channels.currentSession()
if (existing != null && existing.status in setOf("joining", "joined")) {
val restored = channels.resume(existing.channelId, existing.sessionId)
// 恢复只使用原会话,不新占位,也不自动采集。
}current是本機當前的頻道控制代碼(StateFlow);currentSession()向服務端查詢本次登入在頻道中的會話,用於 App 重啟後恢復。- 只能恢復本次登入的會話,換了登入不能恢復。狀態為
leaving的要等清理完成,left的不能恢復。 - 各種 ID 是字串,不要轉成
Int或截斷。
狀態與畫面
介面觀察兩個 StateFlow:
handle.snapshot(ChannelSnapshot):channel、session、members、mediaState、microphoneEnabled、cameraEnabled、error。handle.tracks(List<ChannelTrack>):音影片軌道。遠端的軌道要確認屬於有權加入的成員後才會出現在這裡。
kotlin
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。只顯示 tracks 中給出的軌道,不要按使用者名稱或來源不明的媒體自己拼出影片。
生命週期與邊界
- SDK 自動傳送心跳、續期加入許可。切換登入、退出登入或媒體出錯時,SDK 停止本地的連線。
- 每次加入仍由服務端檢查許可權;媒體連線自身的令牌重新整理不能代替這個檢查。
- 加入許可、媒體令牌和控制代碼都不會儲存到本地。
- 頻道不接入系統來電介面(
DRCallUI、Core-Telecom),沒有振鈴和來電通知。 - 目前只支援在前臺使用。要在後臺持續採集音影片,需要前臺服務、常駐通知和額外的系統適配,並單獨測試。
- 離開頁面時要呼叫
leave(),不要只解綁影片檢視。
頻道的程式碼和自動化測試已完成,但還沒有釋出包含它的 APK / AAR,也還沒有在真機上測試多人通話。Java 的介面見 Java 接入,完整簽名見介面參考,型別見資料型別。
