LiveCoreView (Android Java)

最近更新时间:2025-09-08 22:59:43

我的收藏
LiveCoreView 是一个跨平台的视频直播核心组件,提供了直播中的关键能力,例如开播、观看、连麦和主播 PK。通过集成 LiveCoreView,您可以在短时间内快速搭建直播主流程,并在此基础上添加您自己的业务 UI 视图,实现高度定制化的直播应用。

效果展示

主播开播预览
观众观看
主播连麦





环境准备

Android 5.0(SDK API Level 21)及以上版本。
Gradle 7.0 及以上的版本。
Android 5.0 及以上的手机设备。

快速开始

步骤 1:准备工作

请参见 开通服务,获取体验版或付费版 SDK。

步骤 2:集成与配置

1. 添加依赖:在您项目的 app/build.gradle.kts(或 build.gradle)文件中,添加 LiveCoreView 组件的依赖。
build.gradle.kts
build.gradle
api("io.trtc.uikit:live-stream-core:latest.release")
api 'io.trtc.uikit:live-stream-core:latest.release'
2. 配置混淆规则:由于 SDK 内部使用了 Java 反射特性,请在 proguard-rules.pro 文件中添加以下代码,将相关类加入不混淆名单。
-keep class com.tencent.** { *; }
-keep class com.trtc.uikit.livekit.livestreamcore.** { *; }
-keep class com.google.gson.** { *;}
3. 配置清单文件:在 app/src/main/AndroidManifest.xml 文件的 <application> 节点中,添加以下配置以覆盖组件内部的设置,使用您自己的 android:allowBackup
// app/src/main/AndroidManifest.xml
<application
...
// 添加如下配置覆盖 依赖的 sdk 中的配置
android:allowBackup="false"
tools:replace="android:allowBackup">=

步骤 3:登录

在您的项目中调用 TUIRoomEngine.login方法完成登录。这是使用 LiveCoreView 所有功能的关键前提。
Kotlin
Java
// 登录
TUILogin.login(applicationContext,
1400000001, // 请替换为开通服务控制台的 SDKAppID
"denny", // 请替换为您的 UserID
"xxxxxxxxxxx", // 您可以在控制台中计算一个 UserSig 并填在这个位置
object : TUICallback() {
override fun onSuccess() {
Log.i(TAG, "login success")
}

override fun onError(errorCode: Int, errorMessage: String) {
Log.e(TAG, "login failed, errorCode: $errorCode msg:$errorMessage")
}
})
// 登录
TUILogin.login(context,
1400000001, // 请替换为开通服务控制台的 SDKAppID
"denny", // 请替换为您的 UserID
"xxxxxxxxxxx", // 您可以在控制台中计算一个 UserSig 并填在这个位置
new TUICallback() {
@Override
public void onSuccess() {
Log.i(TAG, "login success");
}

@Override
public void onError(int errorCode, String errorMessage) {
Log.e(TAG, "login failed, errorCode: " + errorCode + " msg:" + errorMessage);
}
});
登录接口参数说明
参数
类型
说明
SDKAppID
int
控制台获取。
UserID
String
当前用户的唯一 ID,仅包含英文字母、数字、连字符和下划线。
userSig
String
用于腾讯云鉴权的票据。请注意:
开发环境:您可以采用本地 GenerateTestUserSig.genTestSig 函数生成 userSig 或者 通过 UserSig 辅助工具 生成临时的 UserSig。
生产环境:为了防止密钥泄露,请务必采用服务端生成 UserSig 的方式。详细信息请参考 服务端生成 UserSig
更多信息请参见 如何计算及使用 UserSig

组件使用

所有直播功能都通过 LiveCoreView 实现。

主播预览与开播

步骤1:创建核心控件

您可以在 Activity 中通过代码或 XML 方式加载 LiveCoreView
Kotlin
Java
val livecoreView = LiveCoreView(this)
LiveCoreView liveCoreView = new LiveCoreView(this);

步骤2:开启直播预览

调用 startCamera 方法,开启本地摄像头的预览。这并不会真正开启直播间。
Kotlin
Java
livecoreView.startCamera(true, null)
liveCoreView.startCamera(true, null);

步骤3:开启直播间

调用 startLiveStream 方法,开启一个直播间并将本地音视频流推送到直播间。您可以通过 liveInfo.seatLayoutTemplateId 设置布局样式:
Kotlin
Java
val liveInfo = TUILiveListManager.LiveInfo()
liveInfo.roomId = "123456"
/**
选择布局:如果要选择其他布局开播,设置 liveInfo.seatLayoutTemplateId = 600
600: 动态宫格布局(默认)
601: 浮动小窗布局
800: 固定宫格布局
801: 固定小窗布局
*/
liveInfo.seatLayoutTemplateId = 600

livecoreView.startLiveStream(liveInfo, null)

livecoreView.startMicrophone(null)
TUILiveListManager.LiveInfo liveInfo = new TUILiveListManager.LiveInfo();
liveInfo.roomId = "roomId_123456";
/**
选择布局:如果要选择其他布局开播,设置 liveInfo.seatLayoutTemplateId = 600
600: 动态宫格布局(默认)
601: 浮动小窗布局
800: 固定宫格布局
801: 固定小窗布局
*/
liveInfo.seatLayoutTemplateId = 600
livecoreView.startLiveStream(liveInfo, null);

livecoreView.startMicrophone(null);
布局样式示例:
600 动态宫格布局
601 浮动小窗布局
800 固定宫格布局
801 固定小窗布局





观众观看

观众通过调用 joinLiveStream 方法进入直播间,并拉取主播的音视频流。
Kotlin
Java
val livecoreView = LiveCoreView(this)
livecoreView.joinLiveStream("roomId_123456", null)
LiveCoreView liveCoreView = new LiveCoreView(this);
livecoreView.joinLiveStream("roomId_123456", null);

观众连麦

以下是以观众向主播发起连麦为例的典型流程。观众连麦效果预览:
单人连麦
多人连麦







步骤1:观众发送连麦请求

观众调用 requestIntraRoomConnection 向主播发送连麦请求。
Kotlin
Java
val userId = "anchorUserId"; // 修改为房主的UserId,传入空字符串时默认为房主UserId
val timeout = 60;
liveCoreView.requestIntraRoomConnection(userId, 10, null)
String userId = "anchorUserId"; // 修改为房主的UserId,传入空字符串时默认为房主UserId
int timeout = 60;
liveCoreView.requestIntraRoomConnection(userId, timeout, true, null);

步骤2:主播端收到连麦请求

主播在 onUserConnectionRequest 回调中收到观众的连麦请求。
Kotlin
Java
override fun onUserConnectionRequest(inviterUser: UserInfo) {
Log.i(TAG, "收到观众连线请求:${inviterUser.userId}")
}
@Override
public void onUserConnectionRequest(LiveStreamDefine.LiveUser inviterUser) {
Log.i(TAG, "收到观众连线请求:" + inviterUser.userId);
}:

步骤3:主播响应连麦请求

主播调用 respondIntraRoomConnection 同意或拒绝连麦。
Kotlin
Java
// 主播同意连麦
liveCoreView.respondIntraRoomConnection(audienceBUserId, true, null)
// 主播同意连麦
liveCoreView.respondIntraRoomConnection(userId, true, null);

// 主播拒绝连麦
liveCoreView.respondIntraRoomConnection(userId, false, null);
观众在 onUserConnectionAcceptedonUserConnectionRejected 回调中收到主播的响应。
Kotlin
Java
override fun onUserConnectionAccepted(inviterUser: UserInfo) {
Log.i(TAG, "主播同意连线:${inviterUser.userId}")
}
@Override
public void onUserConnectionAccepted(LiveStreamDefine.LiveUser liveUser) {
Log.i(TAG, "观众同意连线:" + liveUser.userId);
}

@Override
public void onUserConnectionRejected(LiveStreamDefine.LiveUser liveUser) {
Log.i(TAG, "观众拒绝连线:" + liveUser.userId);
}:

步骤4:断开连麦

主播挂断观众连麦:
观众 B 和主播 A 连麦成功后,主播 A 断开和观众 B 的连麦。
Kotlin
Java
val userId = "audienceBUserId"
liveCoreView.disconnectUser(userId, null)
String userId = "audienceUserId";
liveCoreView.disconnectUser(userId, null);
主播 A 断开和观众 B 的连麦请求后,观众 B 会收到 onUserConnectionTerminated 回调。
Kotlin
Java
override fun onUserConnectionTerminated(inviterUser: UserInfo) {
Log.i(TAG, "主播关闭连线")
}
@Override
public void onUserConnectionTerminated() {
Log.i(TAG, "主播关闭连线");
}
观众主动结束连麦:
观众 B 和主播 A 连麦成功后,观众 B 主动断开连麦可以调用 terminateIntraRoomConnection。
Kotlin
Java
liveCoreView.terminateIntraRoomConnection()
liveCoreView.terminateIntraRoomConnection();
当观众 B 主动断开连麦时,主播会收到 onUserConnectionExited 回调。
Kotlin
Java
override fun onUserConnectionExited(inviterUser: LiveStreamDefine.LiveUser) {
Log.i(TAG, "观众退出连线")
}
@Override
public void onUserConnectionExited(UserInfo liveUser) {
Log.i(TAG, "观众退出连线:${liveUser.userId}");
}

主播连线

主播连线效果预览:
双主播连线
多主播连线






您可以按如下 API 来完成主播连线功能。这里以主播 A 与主播 B 连线为例实现如下,以下是主播 A 向主播 B 发起跨房连线的典型流程。
说明:
以下是由 LiveCoreView 提供的主动调用方法。
所有的回调方法是指 LiveCoreView 设置的 ConnectionObserver 对象中的回调方法。

步骤1:主播 A 发起连线

主播 A 调用 requestCrossRoomConnection 发起连线,传入主播 B 的房间 ID。
主播 A 可通过 onCrossRoomConnectionAccepted 接收请求同意回调。
Kotlin
Java
val roomId = "anchorBRoomId"
mLiveViewList.requestCrossRoomConnection(roomId, 10, null)
String roomId = "anchorBRoomId";
mLiveViewList.requestCrossRoomConnection(roomId, 10, null);

步骤2:主播 B 收到连线请求

主播 B 在 onCrossRoomConnectionRequest 回调中收到连线请求。
Kotlin
java
override fun onCrossRoomConnectionRequest(inviterUser: UserInfo) {
Log.i(TAG, "收到主播A连线房间请求:${inviterUser.userId}")
}
@Override
public void onCrossRoomConnectionRequest(LiveStreamDefine.RoomInfo roomInfo) {
Log.i(TAG, "收到主播A连线房间请求:" + roomInfo.roomId);
}

步骤3:主播 B 响应连线请求

主播 B 调用 respondToCrossRoomConnection 响应连线。
Kotlin
Java
liveCoreView.respondToCrossRoomConnection(roomId, true, null)
// 同意连线请求
liveCoreView.respondToCrossRoomConnection(roomId, true, null);

步骤4:退出连线

主播 B 调用 terminateCrossRoomConnection 退出连线。
Kotlin
Java
liveCoreView.terminateCrossRoomConnection()
liveCoreView.terminateCrossRoomConnection()

主播 PK

LiveCoreView 提供了主播 PK 相关的 API , 由于每种 PK 玩法的 UI 都不一样,所以LiveCoreView 只提供 API,您需要自己完成 UI 效果的实现。
主播 PK 效果预览:
双主播PK
多主播PK






说明:
PK 功能依赖于连线功能,所以您需要在主播连线的情况下才能发起 PK请求
以下主动调用 API 是由 LiveCoreView 提供。
所有的回调方法是指 LiveCoreView 设置的 BattleObserver 对象中的回调方法。
您可以按如下 API 来完成主播PK功能。这里以主播 A 与主播 B PK 为例实现如下。

步骤1:主播 A 发起 PK

主播 A 调用 requestBattle 发起 PK。
主播 A 可通过 onBattleRequestAccept 接收 PK 同意回调。
Kotlin
Java
val BATTLE_DURATION = 30
val battleConfig = BattleConfig()
battleConfig.duration = BATTLE_DURATION
battleConfig.needResponse = true
battleConfig.extensionInfo = ""

val list: MutableList<String> = ArrayList()
list.add("anchorBUserId")

val BATTLE_REQUEST_TIMEOUT = 10

liveCoreView.requestBattle(battleConfig, list, BATTLE_REQUEST_TIMEOUT,
object : LiveCoreViewDefine.BattleRequestCallback {
override fun onSuccess(battleId: String, requestedUserIdList: List<String>) {}
override fun onError(error: TUICommonDefine.Error, message: String) {}
})
final int BATTLE_DURATION = 30;
TUILiveBattleManager.BattleConfig battleConfig = new TUILiveBattleManager.BattleConfig();
battleConfig.duration = BATTLE_DURATION;
battleConfig.needResponse = true;
battleConfig.extensionInfo = "";

List<String> list = new ArrayList<>();
list.add("anchorBUserId");

final int BATTLE_REQUEST_TIMEOUT = 10;

liveCoreView.requestBattle(battleConfig, list, BATTLE_REQUEST_TIMEOUT,
new LiveCoreViewDefine.BattleRequestCallback() {
@Override
public void onSuccess(String battleId, List<String> requestedUserIdList) {

}


@Override
public void onError(TUICommonDefine.Error error, String message) {

}
});

步骤2:主播 B 收到 PK 请求

主播 B 通过 onBattleRequestReceived 接收 PK 请求回调。
Kotlin
Java
override fun onBattleRequestReceived(battleId: String, inviterUser: BattleUser, invitee: BattleUser) {
Log.i(TAG, "收到主播 A 的 PK 请求::$battleId")
}
@Override
public void onBattleRequestReceived(String battleId, BattleUser inviter, BattleUser invitee) {
Log.i(TAG, "收到主播 A 的 PK 请求:" + battleId);
}

步骤3:主播 B 响应 PK 请求

主播 B 通过调用 respondToBattle 响应 PK 请求。
Kotlin
Java
// 同意 PK 请求
val battleId = "battleId"
liveCoreView.respondToBattle(battleId, true, null)
// 同意 PK 请求
String battleId = "battleId";
liveCoreView.respondToBattle(battleId, true, null);
主播 A、B 以及房间内观众收到 onBattleStarted,收到 PK 开始通知。
Kotlin
Java
override fun onBattleStarted(battleInfo: BattleInfo) {
Log.i(TAG, "PK 开始回调")
}
@Override
public void onBattleStarted(BattleInfo battleInfo) {
Log.i(TAG, "主播连线房间列表更新");
}

步骤4:退出 PK

自然结束:当 PK 时间截止时,会收到 onBattleEnded 回调。
主动停止:主播 B 调用 terminateBattle 自己会退出 PK,主播 A 会收到 onUserExitBattle
Kotlin
Java
mLiveCoreView.terminateBattle(battleId, null)
mLiveCoreView.terminateBattle(battleId, null);