腾讯云实时互动-教育版(原低代码互动课堂 LCIC)是一款集成音视频连麦、互动白板和直播等多功能的产品,能够帮助您节省90%的开发工作。在教育、医疗、金融和企业培训等领域,可快速搭建一对一教学、互动小班课、直播大班课和直播带货等多种互动直播业务场景。
TCIC Client
是一个包含 LCIC 所有功能的 Flutter 插件,您可以通过该插件快速集成 LCIC 功能,实现互动直播、互动白板、音视频连麦等功能。

支持平台
Android (API 21+)
iOS (12.0+)
环境要求
Flutter 环境
Flutter SDK:≥ 1.17.0
Dart SDK:^3.7.0
Android 环境
Android SDK:API 21+ (Android 5.0及以上)
NDK:27.0.12077973+
Java:11+
Kotlin:支持
iOS 环境
iOS: 12.0+
Xcode: 14.0+
CocoaPods: 1.12.0+
在线 Demo
前置准备
在使用
TCIC Client
前,您需要先完成以下前置准备。步骤一:创建新的应用
1. 登录 实时互动-教育版控制台,进入左侧导航栏的概览,单击新建应用。
2. 若尚未创建应用,则默认进入"创建应用"界面,输入应用名称,例如 TestLCIC。



说明:
步骤二:获取 SDKAppId 和密钥(SecretKey)
1. 进入 应用管理 > 应用配置,获取应用 ID(SDKAppId)。
2. 进入 访问管理(CAM)控制台 获取密钥,若无密钥,需要在 API 密钥管理中新建,具体可参见 访问密钥管理。


步骤三:获取进入课堂所需参数
1. 通过调用云 API 接口 RegisterUser 注册用户,可以获取到对应的用户 ID(userid)信息。
2. 通过云 API 接口 LoginUser 登录,可以获取到用户鉴权 token 信息。
3. 通过云 API 接口 CreateRoom 创建课堂,可以获取到课堂号(classid)信息。
字段 | 类型 | 必填 | 含义 | 备注 |
userid | string | 是 | 用户名。 | |
classid | string | 是 | 课堂 ID。 | |
token | string | 是 | 后台鉴权参数。 | |
role | string | 否 | 进入课堂角色,默认空。 | 可选参数 supervisor(巡课/内容审查) ,只有已注册应用内巡课用户才有权限。 |
lng | string | 否 | 语言参数,默认 zh-CN。 | 当前支持中文(简体)、中文(繁体) 、English、韩语、日语、阿拉伯语、越南语。可拼接相应参数,展示对应语种。参数:zh-CN、zh-TW、en-US、ka、ja、ar、vi。 |
location | boolean | 否 | 是否上报经纬度位置信息。 | 默认 false 不上报。 |
layout | string | 否 | 页面布局。 | 默认顶部布局(top),当前仅视频文档模式有效,支持双排布局(double)、右侧布局(right)、左侧布局(left)、三分布局(three)。 |
boardColor | string | 否 | 白板颜色。 | 白板颜色设置,默认为:#182E25 ,支持 Hex 格式,也支持 rgba(0, 0, 0, .3)设置。 |
noEndClass | boolean | 否 | 禁用下课。 | 助教进房时带上这个参数,在助教点击退出时,将隐藏「下课」,仅展示「离开」按钮。 |
快速跑通
安装依赖
在您的 Flutter 项目中执行
flutter pub add tcic_client_ui
安装依赖。权限相关配置
在教学场景中,通常我们会用到音视频互动,屏幕共享等功能,因此需要应用配置对应的权限。
Android 配置
1. 权限配置
在
android/app/src/main/AndroidManifest.xml
中添加以下权限:<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera.autofocus" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2. 屏幕录制配置
添加屏幕录制辅助 Activity:
<activityandroid:name="com.tencent.rtmp.video.TXScreenCapture$TXScreenCaptureAssistantActivity"android:theme="@android:style/Theme.Translucent"/>
3. build.gradle 配置
在
android/app/build.gradle.kts
中配置:1.
ndkVersion
版本设置为 27.0.12077973
。2. 配置
packagingOptions
解决 so 文件冲突问题。android {namespace = "com.tencent.tcic"compileSdk = flutter.compileSdkVersionndkVersion = "27.0.12077973"compileOptions {sourceCompatibility = JavaVersion.VERSION_11targetCompatibility = JavaVersion.VERSION_11}kotlinOptions {jvmTarget = JavaVersion.VERSION_11.toString()}defaultConfig {applicationId = "com.tencent.tcic"minSdk = flutter.minSdkVersiontargetSdk = flutter.targetSdkVersion}// 解决重复so文件冲突packagingOptions {pickFirst("lib/arm64-v8a/libliteavsdk.so")pickFirst("lib/armeabi-v7a/libliteavsdk.so")pickFirst("lib/x86/libliteavsdk.so")pickFirst("lib/x86_64/libliteavsdk.so")}}
4. 混淆配置
在
android/app/proguard-rules.pro
中添加:# 腾讯云SDK混淆配置-keep class com.tencent.** { *; }-keep class com.tencent.rtc.** { *; }-keep class com.tencent.liteav.** { *; }-keep class com.tencent.trtc.** { *; }-keep class com.tencent.imsdk.** { *; }-keep class com.tencent.tls.** { *; }# Flutter相关-keep class io.flutter.** { *; }-keep class io.flutter.plugins.** { *; }
iOS 配置
1. 权限配置
在
ios/Runner/Info.plist
中添加以下权限描述:<!-- 相机权限 --><key>NSCameraUsageDescription</key><string>Video calls require camera permission.</string><!-- 麦克风权限 --><key>NSMicrophoneUsageDescription</key><string>Voice calls require microphone permission.</string><!-- 网络配置 --><key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict><!-- 后台模式 --><key>UIBackgroundModes</key><array><string>fetch</string></array><!-- 屏幕录制扩展 --><key>com.apple.security.application-groups</key><array><string>group.com.tencent.comm.tcic.sharescreen</string></array>
跑通代码
配置完权限相关后,在前置条件中您了创建应用并且已经获取到了必要的
classId
,userId
,token
参数,只要将这些参数传入到组件中使用即可。import 'package:tcic_client_ui/tcic_client_ui.dart';import 'package:tcic_client_ui/controller/tcic_contoller.dart';import 'package:tcic_client_ui/utils/model/enum/role_enum.dart';import 'package:tcic_client_ui/utils/model/tcic_cofig_model.dart';// 创建控制器final controller = TCICController();// 配置参数final config = TCICConfig(userId: 'user123', /// 前置条件步骤中注册用户使用的用户idclassId: 'class456', /// 前置条件步骤中创建的课堂idrole: RoleEnum.student,token: 'your_token_here', /// 前置条件步骤中登录用户获取的token// 可选参数isTestBackend: false, /// 是否使用后台测试环境);// 根据您的业务场景,跳转到课堂页面Navigator.push(context,MaterialPageRoute(builder: (context) => TCICView(controller: controller,config: config,),),);
通过上述步骤您已经成功集成了课堂组件,您可以在您的应用中使用该组件来实现课堂功能。
跨应用屏幕共享
iOS 系统上的跨应用屏幕分享,需要增加 Extension 录屏进程以配合主 App 进程进行推流。Extension 录屏进程由系统在需要录屏的时候创建,并负责接收系统采集到屏幕图像。因此需要:
1. 创建 App Group,并在 Xcode 中进行配置(可选)。这一步的目的是让 Extension 录屏进程可以同主 App 进程进行跨进程通信。
2. 在您的工程中,新建一个 Broadcast Upload Extension 的 Target,并在 GitHub 中获取专门为扩展模块定制的 TXLiteAVSDK_ReplayKitExt.framework。
注意:
如果跳过步骤1(即不配置 App Group,接口传 null),屏幕分享依然可以运行,但稳定性会有所降低。因此,尽管步骤较多,建议尽量配置正确的 App Group 以保障屏幕分享功能的稳定性。
步骤1:创建 App Group
注意:
完成后需要重新下载对应的 Provisioning Profile。
1. 单击左侧的 Certificates, IDs & Profiles。
2. 在右侧的界面中单击加号。
3. 选择 App Groups,单击 Continue。
4. 在弹出的表单中填写 Description 和 Identifier,其中 Identifier 需要传入接口中对应的 AppGroup 参数。完成后单击 Continue。

5. 回到 Identifier 页面,在上边的菜单中选择 App IDs,然后单击您的 App ID(主 App 与 Extension 的 AppID 需要进行同样的配置)。
6. 选中 App Groups 并单击 Edit。
7. 在弹出的表单中选择您之前创建的 App Group,单击 Continue 返回编辑页。然后,单击 Save 保存。

8. 重新下载 Provisioning Profile 并配置到 Xcode 中。
步骤2:创建 Broadcast Upload Extension
1. 在 Xcode 菜单依次单击 File > New > Target...,选择 Broadcast Upload Extension。
2. 在弹出的对话框中填写相关信息,不用勾选 Include UI Extension,单击 Finish 完成创建。
3. 将下载到的 SDK 压缩包中的 TXLiteAVSDK_ReplayKitExt.framework 拖动到工程中,勾选刚创建的 Target。
4. 选中新增加的 Target,依次单击 + Capability,双击 App Groups,如下图:

操作完成后,会在文件列表中生成一个名为 Target.entitlements 的文件。如下图所示,选中该文件并单击 + 号填写上述步骤中的 App Group 即可。

5. 选中主 App 的 Target ,并按照上述步骤对主 App 的 Target 做同样的处理。
6. 在新创建的 Target 中,Xcode 会自动创建一个名为 "SampleHandler.swift" 的文件,用如下代码进行替换。需将代码中的 APPGROUP 改为上文创建的 App Group Identifier。
import ReplayKitimport TXLiteAVSDK_ReplayKitExtlet APPGROUP = "group.com.tencent.comm.tcic.sharescreen"class SampleHandler: RPBroadcastSampleHandler, TXReplayKitExtDelegate {let recordScreenKey = Notification.Name.init("TRTCRecordScreenKey")override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {// 用户已请求开始直播。UI 扩展程序的设置信息可以通过ut optional.TXReplayKitExt.sharedInstance().setup(withAppGroup: APPGROUP, delegate: self)}override func broadcastPaused() {// 用户已请求暂停直播。}override func broadcastResumed() {// 用户已请求恢复直播。}override func broadcastFinished() {// 用户已请求结束广播。TXReplayKitExt.sharedInstance() .finishBroadcast()}func broadcastFinished(_ broadcast: TXReplayKitExt, reason: TXReplayKitExtReason) {var tip = ""switch reason {case TXReplayKitExtReason.requestedByMain:tip = "屏幕共享已结束"breakcase TXReplayKitExtReason.disconnected:tip = "应用断开"breakcase TXReplayKitExtReason.versionMismatch:tip = "集成错误(SDK 版本号不相符合)"breakdefault:break}let error = NSError(domain: NSStringFromClass(self.classForCoder), code: 0, userInfo: [NSLocalizedFailureReasonErrorKey:tip])finishBroadcastWithError(error)}override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {switch sampleBufferType {case RPSampleBufferType.video:// 处理视频样本缓冲区TXReplayKitExt.sharedInstance() .sendVideoSampleBuffer(sampleBuffer)breakcase RPSampleBufferType.audioApp:// 处理应用程序音频的音频样本缓冲区breakcase RPSampleBufferType.audioMic:// 处理麦克风音频的音频样本缓冲区break@unknown default:// 处理其他样本缓冲液类型fatalError("未知类型")}}}
参数说明
TCICView 组件参数
参数名 | 类型 | 是否必填 | 描述 |
controller | TCICController | 是 | 控制器实例。 |
config | TCICConfig | 是 | 配置信息。 |
callback | TCICCallback | 否 | 回调函数。 |
TCICConfig 字段信息
字段名 | 类型 | 是否必填 | 描述 |
userId | String | 是 | 用户 ID。 |
classId | String | 是 | 课堂 ID。 |
token | String | 是 | 认证令牌。 |
role | RoleEnum | 是 | 用户角色(学生/老师等)。 |
langConfig | TCICLangConfig | 否 | 语言配置。 |
nameConfig | TCICNameConfig | 否 | 名称配置。 |
fontConfig | TCICFontConfig | 否 | 字体配置。 |
liveplayerConfig | TCICLivePlayerConfig | 否 | 直播播放器配置。 |
isLatestBackend | bool | 否 | 是否使用最新后端。 |
isTestBackend | bool | 否 | 是否使用测试后端。 |
componentConfig | List<TCICComponentConfig> | 否 | 组件配置列表。 |
TCICComponentConfig 字段信息
TCICComponentConfig 是一个抽象类,用于配置课堂界面中的各个组件。通过将具体的组件配置类实例添加到 componentConfig 列表中,可以实现对各个组件的自定义配置。
组件配置使用示例
// 创建控制器final controller = TCICController();// 配置参数final config = TCICConfig(userId: 'user123',classId: 'class456',role: RoleEnum.student,token: 'your_token_here',// 组件配置列表componentConfig: [HeaderComponentConfig(isShow: true,enableHandsUp: true,iconConfig: HeaderIconConfig(micIcon: 'custom_mic_icon.png',cameraIcon: 'custom_camera_icon.png',),),MemebersComponentConfig(enableStageUpDownAction: true,),MessageComponentConfig(),SetttingComponentConfig(),VideoComponentConfig(),WhiteboardComponentConfig(),],);// 根据您的业务场景,跳转到课堂页面Navigator.push(context,MaterialPageRoute(builder: (context) => TCICView(controller: controller,config: config,),),);
HeaderComponentConfig 字段信息
HeaderComponentConfig 用于配置头部组件,其字段信息如下:
字段名 | 类型 | 是否必填 | 描述 |
isShow | bool | 否 | 是否显示头部组件(默认为 true)。 |
enableHandsUp | bool | 否 | 是否显示举手(默认为 true)。 |
enableScreenShare | bool | 否 | 是否显示屏幕共享(默认为 true)。 |
enableMessage | bool | 否 | 是否显示消息(默认为 true)。 |
enableCourseware | bool | 否 | 是否显示课件(默认为 true)。 |
enableSetting | bool | 否 | 是否显示设置(默认为 true)。 |
enableMemberList | bool | 否 | 是否显示花名册(默认为 true)。 |
showClassStatus | bool | 否 | 是否显示课程状态(默认为 true)。 |
showClassTime | bool | 否 | 是否显示课程时间(默认为 true)。 |
showOnlineMemberCount | bool | 否 | 是否显示在线成员数量(默认为 true)。 |
showQuitButton | bool | 否 | 是否显示退出按钮(默认为 true)。 |
showClassLogo | bool | 否 | 是否显示课程 Logo(默认为 true)。 |
showClassName | bool | 否 | 是否显示课程名称(默认为 true)。 |
showClassInfo | bool | 否 | 是否显示课程信息(默认为 true)。 |
showNetworkStatus | bool | 否 | 是否显示网络状态(默认为 true)。 |
iconConfig | HeaderIconConfig | 否 | 自定义头部组件图标配置。 |
headerBuilder | Widget Function() | 否 | 自定义整个头部组件。 |
headerLeftBuilder | Widget Function() | 否 | 自定义头部组件左侧组件。 |
headerRightBuilder | Widget Function() | 否 | 自定义头部组件右侧组件。 |
headerActionsBuilder | Widget Function() | 否 | 自定义头部组件中间组件。 |
HeaderIconConfig 字段信息
HeaderIconConfig 用于配置头部组件的图标,其字段信息如下:
字段名 | 类型 | 是否必填 | 描述 |
micIcon | String | 否 | 麦克风图标。 |
micDisableIcon | String | 否 | 麦克风禁用图标。 |
cameraIcon | String | 否 | 摄像头图标。 |
cameraDisableIcon | String | 否 | 摄像头禁用图标。 |
handUpIcon | String | 否 | 举手图标。 |
screenShareIcon | String | 否 | 屏幕共享图标。 |
messageIcon | String | 否 | 消息图标。 |
coursewareIcon | String | 否 | 课件图标。 |
settingIcon | String | 否 | 设置图标。 |
membersIcon | String | 否 | 成员图标。 |
MemebersComponentConfig 字段信息
MemebersComponentConfig 用于配置成员组件,其字段信息如下:
字段名 | 类型 | 是否必填 | 描述 |
enableStageUpDownAction | bool | 否 | 是否启用上下台(默认为 true)。 |
MessageComponentConfig 字段信息
MessageComponentConfig 用于配置消息组件,其字段信息如下:
字段名 | 类型 | 是否必填 | 描述 |
messageItemBuilder | Widget Function(V2TimMessage) | 否 | 消息 Item 构建器。 |
messageHeaderBuilder | Widget Function(V2TimMessage) | 否 | 消息头构建器。 |
messageBubbleBuilder | Widget Function(V2TimMessage, Widget) | 否 | 消息气泡构建器。 |
messageRowBuilder | Widget Function(V2TimMessage) | 否 | 消息行构建器。 |
SettingComponentConfig 字段信息
SettingComponentConfig 用于配置设置组件,其字段信息如下:
字段名 | 类型 | 是否必填 | 描述 |
enableAudioSetting | bool | 否 | 是否启用音频设置(默认为 true)。 |
enableVideoSetting | bool | 否 | 是否启用视频设置(默认为 true)。 |
enableGeneralSetting | bool | 否 | 是否启用通用设置(默认为 true)。 |
showMemberJoinExitInfo | bool | 否 | 是否显示成员加入退出课堂信息(默认为 true)。 |
showMemberhandsupInfo | bool | 否 | 是否显示成员举手信息(默认为 true)。 |
VideoComponentConfig 字段信息
VideoComponentConfig 用于配置视频组件,其字段信息如下:
字段名 | 类型 | 是否必填 | 描述 |
videoFloatBuilder | Widget Function() | 否 | 视频悬浮层构建器。 |
videoActionBuilder | Widget Function() | 否 | 视频组件操作按钮构建器。 |
WhiteboardComponentConfig 字段信息
WhiteboardComponentConfig 用于配置白板组件,其字段信息如下:
字段名 | 类型 | 是否必填 | 描述 |
enableCreateBoard | bool | 否 | 是否启用创建白板(默认为 true)。 |
enableBoardList | bool | 否 | 是否启用白板列表(默认为 true)。 |
enableSwitchPage | bool | 否 | 是否 PPT 课件可翻页(默认为 true)。 |
TCICLangConfig 字段信息
TCICLangConfig 用于配置语言信息,其字段信息如下:
字段名 | 类型 | 是否必填 | 描述 |
lang | TranslateLangEnum | 是 | 语言类型(zh、en、ja、ko、zhTw 等)。 |
TranslateLangEnum 枚举值
TranslateLangEnum 用于定义支持的语言类型,其枚举值如下:
枚举值 | 描述 |
zh | 中文 |
en | 英文 |
ja | 日文 |
ko | 韩文 |
zhTw | 繁体中文 |
fr | 法文 |
de | 德文 |
es | 西班牙文 |
ru | 俄文 |
TCICFontConfig 字段信息
TCICFontConfig 用于配置字体信息,其字段信息如下:
字段名 | 类型 | 是否必填 | 描述 |
fontFamily | String | 否 | 字体族名称。 |
fontPath | String | 否 | 字体文件路径(相对于 assets 目录)。 |
fontUrl | String | 否 | 字体文件 URL(网络字体)。 |
enableCustomFont | bool | 是 | 是否启用自定义字体(默认为 false)。 |
fontWeights | Map<FontWeight, String> | 否 | 字体权重配置。 |
fontStyles | Map<FontStyle, String> | 否 | 字体样式配置。 |
TCICNameConfig 字段信息
TCICNameConfig
用于配置不同语言下的名称显示,其字段信息如下:字段名 | 类型 | 是否必填 | 描述 |
zh | NameConfigInfo | 否 | 中文名称配置。 |
en | NameConfigInfo | 否 | 英文名称配置。 |
ja | NameConfigInfo | 否 | 日文名称配置。 |
ko | NameConfigInfo | 否 | 韩文名称配置。 |
zhTw | NameConfigInfo | 否 | 繁体中文名称配置。 |
NameConfigInfo 字段信息
NameConfigInfo
用于定义具体语言下的各项名称,其字段信息如下:字段名 | 类型 | 是否必填 | 描述 |
teacher | String | 否 | 老师 |
assistant | String | 否 | 助教 |
student | String | 否 | 学生 |
host | String | 否 | 主持人 |
coHost | String | 否 | 副主持人 |
panelist | String | 否 | panelist |
viewer | String | 否 | 观众 |
raiseHand | String | 否 | 举手 |
lowerHand | String | 否 | 放下手 |
chat | String | 否 | 聊天 |
whiteboard | String | 否 | 白板 |
fileShare | String | 否 | 文件分享 |
screenShare | String | 否 | 屏幕分享 |
回调函数
TCICCallback 支持以下回调:
onJoinedClassSuccess
:加入课堂成功afterExitedClass
:退出课堂后onJoinedClassFailed
:加入课堂失败onKickedOffClass
:被踢出课堂onMemberJoinedClass
:成员加入课堂onMemberLeaveClass
:成员离开课堂onReceivedMessage
:收到消息beforeExitedClass
:退出课堂前(返回 false 可取消退出)beforeRenderMessage
:渲染消息前(返回 false 可不渲染)常见问题
1. 权限问题
Android 权限被拒绝:
检查
AndroidManifest.xml
中是否已添加相应权限。运行时权限需要在代码中动态申请。
某些权限(如相机、麦克风)需要用户手动授权。
iOS 权限被拒绝:
检查
Info.plist
中是否已添加权限描述。确保权限描述文本清晰明了。
某些权限首次使用时会弹出授权对话框。
2. 音视频问题
无法听到声音:
检查设备音量设置。
确认麦克风权限已授权。
检查音频设备连接状态。
无法看到视频:
检查相机权限已授权。
确认设备相机功能正常。
检查网络连接状态。
3. 网络问题
连接失败:
检查网络连接状态。
确认防火墙设置。
验证 SDKAppId 和 token 是否正确。
音视频卡顿:
检查网络带宽是否充足。
确认设备性能是否满足要求。
考虑降低音视频质量设置。
4. 白板问题
白板无法加载:
检查网络连接状态。
确认白板服务是否正常。
验证白板配置参数。
白板操作无响应:
检查触摸事件是否正常。
确认白板组件状态。
验证用户权限设置。
技术支持
如果您在使用过程中遇到问题,可以通过以下方式获取技术支持:
腾讯云开发者社区