跳到主要内容

Android SDK

基于 LiveKit 的 TgoRTC Android (Kotlin) SDK,用于实时音视频通讯。

安装

build.gradle.kts (Project) 中添加 JitPack 仓库:

allprojects {
repositories {
maven { url = uri("https://jitpack.io") }
}
}

build.gradle.kts (Module) 中添加依赖:

dependencies {
implementation("com.github.TgoRTC:TgoRTCSDK:1.0.0")
}

最新版本:

依赖说明

SDK 自动包含以下核心依赖:

  • io.livekit:livekit-android:2.23.1

快速开始

1. 初始化 SDK

import com.tgo.rtc.TgoRTC
import com.tgo.rtc.entity.TgoOptions

val options = TgoOptions().apply {
debug = true
mirror = false
}

TgoRTC.instance.init(applicationContext, options)

2. 创建房间信息并加入

import com.tgo.rtc.entity.TgoRoomInfo
import com.tgo.rtc.entity.TgoRTCType
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch

val scope = MainScope()

val roomInfo = TgoRoomInfo(
roomName = "room-name",
token = "your-token",
url = "http://your-server",
loginUID = "local-user-id",
creatorUID = "creator-user-id"
)

roomInfo.maxParticipants = 4
roomInfo.rtcType = TgoRTCType.VIDEO
roomInfo.timeout = 30

scope.launch {
TgoRTC.instance.roomManager.joinRoom(
roomInfo,
micEnabled = true,
cameraEnabled = true
)
}

3. 监听连接状态

import com.tgo.rtc.entity.TgoConnectStatus

val connectListener = { roomName: String, status: TgoConnectStatus, reason: String ->
println("Room $roomName: $status - $reason")

when (status) {
TgoConnectStatus.CONNECTING -> println("正在连接...")
TgoConnectStatus.CONNECTED -> println("已连接到房间")
TgoConnectStatus.DISCONNECTED -> println("已断开连接")
}
}

TgoRTC.instance.roomManager.addConnectListener(connectListener)
TgoRTC.instance.roomManager.removeConnectListener(connectListener)

说明: 当前 Android SDK 中没有单独的 RECONNECTING / RECONNECTED 枚举值。 RoomEvent.ReconnectingTgoRoomManager 中会回调为 TgoConnectStatus.CONNECTING

4. 获取参与者

val local = TgoRTC.instance.participantManager.getLocalParticipant()
val localOrNull = TgoRTC.instance.participantManager.getLocalParticipantOrNull()

val remotes = TgoRTC.instance.participantManager.getRemoteParticipants()
val joinedRemotes = TgoRTC.instance.participantManager.getJoinedRemoteParticipants()

val all = TgoRTC.instance.participantManager.getAllParticipants()
val joined = TgoRTC.instance.participantManager.getJoinedParticipants()
val joinedCount = TgoRTC.instance.participantManager.getJoinedParticipantCount()

TgoRTC.instance.participantManager.addNewParticipantListener { participant ->
println("新参与者加入: ${participant.uid}")
}

5. 媒体控制与事件

媒体控制仅对本地参与者有效。

import com.tgo.rtc.entity.TgoConnectionQuality
import com.tgo.rtc.entity.TgoVideoInfo

val participant = TgoRTC.instance.participantManager.getLocalParticipant()

scope.launch {
participant.setMicrophoneEnabled(true)
}

scope.launch {
participant.setCameraEnabled(true)
}

scope.launch {
participant.setScreenShareEnabled(true)
}

participant.switchCamera()

val micEnabled = participant.getMicrophoneEnabled()
val cameraEnabled = participant.getCameraEnabled()
val screenShareEnabled = participant.getScreenShareEnabled()
val cameraPosition = participant.getCameraPosition()
val isSpeaking = participant.getIsSpeaking()
val audioLevel = participant.getAudioLevel()
val createdAt = participant.getCreatedAt()
val isJoined = participant.isJoined()

val onMicChange: (Boolean) -> Unit = { enabled ->
println("麦克风: ${if (enabled) "开启" else "关闭"}")
}

val onCameraChange: (Boolean) -> Unit = { enabled ->
println("摄像头: ${if (enabled) "开启" else "关闭"}")
}

val onScreenShareChange: (Boolean) -> Unit = { enabled ->
println("屏幕共享: ${if (enabled) "开启" else "关闭"}")
}

val onSpeakingChange: (Boolean, Float) -> Unit = { speaking, level ->
println("正在说话: $speaking, 音量: $level")
}

val onConnQualityChange: (TgoConnectionQuality) -> Unit = { quality ->
println("连接质量: $quality")
}

val onJoined: () -> Unit = {
println("参与者已加入")
}

val onLeave: () -> Unit = {
println("参与者已离开")
}

val onTrackPublished: () -> Unit = {
println("轨道已发布")
}

val onTrackUnpublished: () -> Unit = {
println("轨道已取消发布")
}

val onVideoInfoChange: (TgoVideoInfo) -> Unit = { info ->
println("视频信息: ${info.resolutionString}, ${info.bitrateString}")
}

participant.addMicrophoneStatusListener(onMicChange)
participant.addCameraStatusListener(onCameraChange)
participant.addScreenShareStatusListener(onScreenShareChange)
participant.addSpeakingListener(onSpeakingChange)
participant.addConnQualityListener(onConnQualityChange)
participant.addJoinedListener(onJoined)
participant.addLeaveListener(onLeave)
participant.addTrackPublishedListener(onTrackPublished)
participant.addTrackUnpublishedListener(onTrackUnpublished)
participant.addVideoInfoListener(onVideoInfoChange)

participant.removeMicrophoneStatusListener(onMicChange)
participant.removeCameraStatusListener(onCameraChange)
participant.removeScreenShareStatusListener(onScreenShareChange)
participant.removeSpeakingListener(onSpeakingChange)
participant.removeConnQualityListener(onConnQualityChange)
participant.removeJoinedListener(onJoined)
participant.removeLeaveListener(onLeave)
participant.removeTrackPublishedListener(onTrackPublished)
participant.removeTrackUnpublishedListener(onTrackUnpublished)
participant.removeVideoInfoListener(onVideoInfoChange)

6. 渲染视频轨道

在布局 XML 中添加 TgoVideoRenderer

<com.tgo.rtc.track.TgoVideoRenderer
android:id="@+id/videoRenderer"
android:layout_width="match_parent"
android:layout_height="match_parent" />

在 Activity 或 Fragment 中初始化:

import com.tgo.rtc.track.TgoRendererType
import com.tgo.rtc.track.TgoVideoRenderer
import com.tgo.rtc.track.TgoVideoScaleType
import io.livekit.android.room.track.Track

val renderer = findViewById<TgoVideoRenderer>(R.id.videoRenderer)

renderer.init()
renderer.setParticipant(participant)
renderer.setMirror(true)
renderer.setRendererType(TgoRendererType.TEXTURE_VIEW)
renderer.setScaleType(TgoVideoScaleType.FILL)
renderer.setTrackSource(Track.Source.CAMERA)

7. 音频管理

import com.tgo.rtc.entity.TgoAudioDevice
import com.tgo.rtc.entity.TgoAudioDeviceType

val devices = TgoRTC.instance.audioManager.getAudioOutputDevices()
val selected = TgoRTC.instance.audioManager.getSelectedDevice()

val deviceListener: (List<TgoAudioDevice>, TgoAudioDevice?) -> Unit = { available, current ->
println("可用设备: $available")
println("当前设备: $current")
}

TgoRTC.instance.audioManager.addDeviceChangeListener(deviceListener)

selected?.let { TgoRTC.instance.audioManager.selectDevice(it) }
TgoRTC.instance.audioManager.selectDeviceByType(TgoAudioDeviceType.SPEAKER)

TgoRTC.instance.audioManager.toggleSpeakerphone()
TgoRTC.instance.audioManager.setSpeakerphoneOn(true)

val isSpeakerOn = TgoRTC.instance.audioManager.isSpeakerOn()
val hasBluetooth = TgoRTC.instance.audioManager.isBluetoothConnected()
val hasWiredHeadset = TgoRTC.instance.audioManager.isWiredHeadsetConnected()
val canSwitchSpeaker = TgoRTC.instance.audioManager.canSwitchSpeakerphone()

TgoRTC.instance.audioManager.removeDeviceChangeListener(deviceListener)

8. 离开房间

TgoRTC.instance.roomManager.leaveRoom()

API 参考

TgoRTC

属性类型描述
instanceTgoRTC单例实例
optionsTgoOptionsSDK 配置选项
roomManagerTgoRoomManager房间管理
participantManagerTgoParticipantManager参与者管理
audioManagerTgoAudioManager音频管理

TgoRoomManager

方法描述
joinRoom(roomInfo, micEnabled, cameraEnabled)加入房间 (suspend)
leaveRoom()离开当前房间
addConnectListener(listener)添加连接状态监听器
removeConnectListener(listener)移除连接状态监听器
addVideoInfoListener(listener)添加视频信息监听器
removeVideoInfoListener(listener)移除视频信息监听器
isCalling()是否正在通话中

TgoParticipantManager

方法描述
getLocalParticipantOrNull()获取本地参与者,为空时返回 null
getLocalParticipant()获取本地参与者
getRemoteParticipants(includePending)获取远程参与者列表
getAllParticipants(includePending)获取所有参与者列表
getJoinedParticipants()获取已加入的参与者列表
getJoinedRemoteParticipants()获取已加入的远程参与者列表
getJoinedParticipantCount()获取已加入参与者数量
inviteParticipant(roomName, uids)邀请指定 UID 的参与者
removePendingParticipants(roomName?, uids)移除尚未加入的待加入参与者
addNewParticipantListener(listener)监听新参与者加入
removeNewParticipantListener(listener)移除新参与者监听

TgoParticipant

媒体控制方法 (仅本地有效)

方法描述
setMicrophoneEnabled(enabled)开启/关闭麦克风 (suspend)
setCameraEnabled(enabled)开启/关闭摄像头 (suspend)
setScreenShareEnabled(enabled)开启/关闭屏幕共享 (suspend)
switchCamera()切换前后摄像头

状态获取方法

方法描述
getMicrophoneEnabled()获取麦克风状态
getCameraEnabled()获取摄像头状态
getScreenShareEnabled()获取屏幕共享状态
getCameraPosition()获取摄像头位置 (前/后)
getAudioLevel()获取当前音量 (0.0 - 1.0)
getIsSpeaking()检查是否正在说话
getVideoTrack(source)获取视频轨道
getCreatedAt()获取参与者对象创建时间
isJoined()是否已加入房间

事件监听方法

方法描述
addMicrophoneStatusListener(listener)监听麦克风状态变化
addCameraStatusListener(listener)监听摄像头状态变化
addSpeakerStatusListener(listener)监听扬声器状态变化
addScreenShareStatusListener(listener)监听屏幕共享状态变化
addSpeakingListener(listener)监听说话状态及音量变化
addCameraPositionListener(listener)监听摄像头位置变化
addConnQualityListener(listener)监听连接质量变化
addJoinedListener(listener)监听参与者加入
addLeaveListener(listener)监听参与者离开
addTrackPublishedListener(listener)监听轨道发布
addTrackUnpublishedListener(listener)监听轨道取消发布
addVideoInfoListener(listener)监听视频信息变化
remove...Listener(listener)移除对应的监听器

属性

属性描述
uid参与者 UID
isLocal是否为本地参与者

TgoVideoRenderer (View)

方法描述
init()初始化渲染器
init(room)使用指定 Room 初始化渲染器
setParticipant(participant)设置要渲染的参与者
setVideoTrack(track)直接设置视频轨道
setMirror(mirror)设置镜像
setRendererType(type)设置渲染器类型 (SurfaceView/TextureView)
setScaleType(type)设置视频缩放模式 (FILL/FIT)
setTrackSource(source)设置轨道来源 (CAMERA/SCREEN_SHARE)
release()释放资源

TgoAudioManager

方法描述
addDeviceChangeListener(listener)监听输出设备变化
removeDeviceChangeListener(listener)移除设备变化监听
getAudioOutputDevices()获取可用输出设备
getSelectedDevice()获取当前选中的输出设备
selectDevice(device)选择指定输出设备
selectDeviceByType(type)按设备类型选择输出设备
isWiredHeadsetConnected()是否连接有线耳机
isBluetoothConnected()是否连接蓝牙音频设备
isSpeakerOn()当前是否为扬声器输出
setSpeakerphoneOn(on)设置扬声器开关状态
toggleSpeakerphone()切换扬声器状态
canSwitchSpeakerphone()当前是否支持切换扬声器

枚举类型

TgoConnectStatus

enum class TgoConnectStatus {
CONNECTING,
CONNECTED,
DISCONNECTED
}

TgoRTCType

enum class TgoRTCType {
AUDIO,
VIDEO
}

TgoConnectionQuality

enum class TgoConnectionQuality {
UNKNOWN,
EXCELLENT,
GOOD,
POOR,
LOST
}

TgoCameraPosition

enum class TgoCameraPosition {
FRONT,
BACK
}

TgoRoomInfo 类

用于配置房间连接的信息类。

属性描述
roomName房间名称
tokenLiveKit Token
urlLiveKit 服务器地址
loginUID当前用户 ID
creatorUID房间创建者 ID
maxParticipants最大参与人数 (默认 2)
rtcType通话类型 (默认 AUDIO)
isP2P是否为 P2P 模式 (默认 true)
uidList参与者 UID 列表
timeout加入超时时间(秒,默认 30)

配置选项

class TgoOptions {
var mirror: Boolean = false
var debug: Boolean = true
}

平台配置

权限设置

AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />

对于 Android 12 (API 31) 及以上版本,如果使用蓝牙耳机,还需要:

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

处理未加入的待加入参与者

当前 Android SDK 没有 participant.addTimeoutListener(...) 这类参与者级超时事件。 SDK 的做法是由 TgoRoomManagerroomInfo.timeout 定时检查待加入参与者, 超时后通过 TgoParticipantManager.removePendingParticipants(...) 移除。 如果业务侧已经知道某些用户未接听,也可以主动调用:

TgoRTC.instance.participantManager.removePendingParticipants(
roomName = roomInfo.roomName,
uids = listOf("user_b", "user_c")
)