MeetingNotify 接口
TKLiveUISDK 进教室事件通知接口。客户实现该接口并通过 TkLiveEngine.getInstance().regiestInterface(notify, callBack) 注册后,SDK 会在进教室过程与教室内生命周期事件发生时回调对应方法。
包路径:com.cloudlive.interfaces.MeetingNotify
接口性质:所有方法均为 Java 8 default 方法,客户可按需选择性重写,未重写的方法为空实现,不影响编译与运行。
配套接口:进教室结果回调请同时实现 JoinmeetingCallBack(同一注册入口一并传入)。
方法速查
| 方法 |
触发时机 |
必须重写 |
onKickOut(int res, String fromID) |
被踢出教室 |
推荐 |
onWarning(int code) |
教室内运行告警 |
可选 |
onClassBegin() |
课堂开始 |
可选 |
onClassDismiss() |
课堂结束 |
可选 |
onLeftRoomComplete() |
离开课堂成功 |
推荐 |
onEnterRoomFailed(int result, String desc) |
进入房间失败 |
必须 |
joinRoomComplete() |
进入课堂成功 |
必须 |
onCameraDidOpenError() |
摄像头打开失败 |
可选 |
onOpenEyeProtection(boolean isOpen) |
护眼模式开关 |
可选 |
onJoinBlocked(int reason, String desc) |
进房请求被重入保护拦截 |
可选 |
方法详细说明
onKickOut
| default void onKickOut(int res, String fromID)
|
被踢出教室时回调。
参数
| 参数 |
类型 |
说明 |
res |
int |
被踢出原因代码,取值见下表 |
fromID |
String |
触发踢出操作的发起方用户 ID(用于在花名册中查找用户信息展示昵称) |
res 取值对照
| res 值 |
TkLiveVariable 常量 |
含义 |
建议处理 |
0 |
Kickout_ChairmanKickout |
被主播(老师)踢出房间 |
弹窗"您已被老师请出教室"并退出 |
1 |
Kickout_Repeat |
有相同身份的用户进入(互踢) |
弹窗提示相同身份已登录,可展示对方昵称 |
401 |
Kickout_ClassFinsh |
当前直播已结束 |
Toast"课程已结束"并退出 |
402 |
Kickout_ClassCancel |
当前直播已被取消 |
Toast"课程已取消"并退出 |
常量定义在 com.cloudlive.room.TkLiveVariable,客户可引用常量名避免硬编码。
onWarning
| default void onWarning(int code)
|
教室内运行过程中的告警回调。
| code |
含义 |
1 |
没有视频权限 |
2 |
没有音频权限 |
onClassBegin
| default void onClassBegin()
|
课堂开始的回调。主播开始直播时触发。
onClassDismiss
| default void onClassDismiss()
|
课堂结束的回调。主播结束直播时触发。
onLeftRoomComplete
| default void onLeftRoomComplete()
|
离开课堂成功后的回调。本地主动调用 leaveRoom 或被踢出后房间资源清理完成时触发。
onEnterRoomFailed
| default void onEnterRoomFailed(int result, String desc)
|
进入房间失败的回调。
| 参数 |
类型 |
说明 |
result |
int |
失败原因代码(见常见错误码表) |
desc |
String |
失败的原因描述 |
常见 result 错误码
| result |
含义 |
-1 |
获取房间信息失败 |
-2 / 3 / 11 / 801 / 802 |
网络异常,等待重连 |
2 |
未知错误,建议 leaveRoom 后退出 |
63 |
房间号 / 用户身份参数缺失 |
100 |
被踢出(黑名单) |
101 |
房间不存在或已过期 |
-235 |
鉴权失败 |
1002 / 4002 / 4008 / 4012 / 4110 |
房间密码错误 / 鉴权失败类 |
4007 |
房间已锁定 |
3001 ~ 3004 |
房间状态异常 |
4109 / 4111 / 4112 / 4113 / 4116 |
房间配置/权限类错误 |
4020 |
房间类型不支持 |
4103 |
设备权限未授予 |
4117 |
未到上课时间 |
1502 |
推流失败 |
5300 |
角色限制(旁听生/管理员进房受限) |
7002 |
不支持该角色进入 |
完整错误码与对应文案请参考 app/src/main/res/values/strings.xml 中 tkapp_checkmeeting_error_* 系列。
joinRoomComplete
| default void joinRoomComplete()
|
进入课堂成功后的回调。SDK 内部完成进房、加入信令、白板初始化等流程后触发,此时可执行 UI 状态切换、本地房间记录保存等操作。
onCameraDidOpenError
| default void onCameraDidOpenError()
|
摄像头打开失败的回调。通常因权限未授予或摄像头被其他应用占用。
onOpenEyeProtection
| default void onOpenEyeProtection(boolean isOpen)
|
是否打开护眼模式的回调。
| 参数 |
类型 |
说明 |
isOpen |
boolean |
true 已开启护眼模式;false 已关闭 |
onJoinBlocked
| default void onJoinBlocked(int reason, String desc)
|
进房请求被重入保护拦截时回调。本次 joinRoom / joinPlayBackRoom 调用未生效。
参数
| 参数 |
类型 |
说明 |
reason |
int |
拦截原因代码,取值见下表 |
desc |
String |
描述信息(含入口标识与时间,便于日志排查) |
reason 取值对照
| reason 值 |
常量 |
含义 |
1 |
JOIN_BLOCKED_DEBOUNCE |
距上次触发不足 3 秒(防连点 / 重复回调) |
2 |
JOIN_BLOCKED_IN_PROGRESS |
上一轮进房仍在进行中,重复进房可能破坏白板 / 课件状态 |
典型用法
关心拦截体验的客户可重写本方法弹"正在进房请勿重复操作"提示;不关心则保持空实现,SDK 静默拦截不影响其他逻辑。
接口常量
| 常量 |
值 |
说明 |
JOIN_BLOCKED_DEBOUNCE |
1 |
拦截原因:距上次触发不足 3 秒(防连点 / 重复回调) |
JOIN_BLOCKED_IN_PROGRESS |
2 |
拦截原因:上一轮进房仍在进行中,重复进房可能破坏白板 / 课件状态 |
注册方式
| // 同时实现 MeetingNotify 与 JoinmeetingCallBack
public class XxxCallBack implements MeetingNotify, JoinmeetingCallBack {
// ... 重写需要的方法
}
// 进入教室前注册
TkLiveEngine.getInstance().regiestInterface(xxxCallBack, xxxCallBack);
TkLiveEngine.getInstance().joinRoom(activity, params);
|
注意事项
regiestInterface 必须在 joinRoom / joinPlayBackRoom 调用之前完成注册
- 多页面进入教室(A 页面 → B 页面)需在 A 页面重新注册监听,B 页面无需重复调用
regiestInterface,但退出教室场景建议调用 TkLiveEngine.getInstance().resetInstance() 重置单例状态
- 进房失败的回调除
onEnterRoomFailed 外,JoinmeetingCallBack.callBack(int nRet) 也会携带进房校验阶段的错误码(如 63、4110 等),两者配合处理更完整
完整示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 | package com.talkcloud.plus.util;
import android.app.Activity;
import android.widget.Toast;
import com.cloudlive.interfaces.JoinmeetingCallBack;
import com.cloudlive.interfaces.MeetingNotify;
import com.cloudlive.room.TkLiveEngine;
import com.cloudlive.room.TkLiveVariable;
import com.cloudlive.tools.TKToast;
import com.cloudlive.tools.Tools;
import com.talkcloud.room.TKRoomManager;
import com.talkcloud.room.entity.RoomUser;
public class AppCallBack implements MeetingNotify, JoinmeetingCallBack {
private Activity activity;
public AppCallBack(Activity activity) {
this.activity = activity;
}
// ===== MeetingNotify =====
@Override
public void onKickOut(int res, String fromID) {
if (res == TkLiveVariable.Kickout_Repeat) {
// 相同身份用户进入,互踢
RoomUser user = TKRoomManager.getInstance().getUser(fromID);
String name = user != null ? user.getNickName() : "";
Tools.showDialogOneButton(activity, "提示",
"相同身份的用户 " + name + " 已登录", dialog -> dialog.dismiss());
} else if (res == TkLiveVariable.Kickout_ChairmanKickout) {
// 被主播踢出
Tools.showDialogOneButton(activity, "提示", "您已被老师请出教室",
dialog -> dialog.dismiss());
} else if (res == TkLiveVariable.Kickout_ClassFinsh) {
// 401 直播已结束
TKToast.showToast(activity, "当前课程已结束", Toast.LENGTH_LONG);
} else if (res == TkLiveVariable.Kickout_ClassCancel) {
// 402 直播已取消
TKToast.showToast(activity, "当前课程已被取消", Toast.LENGTH_LONG);
}
}
@Override
public void onWarning(int code) {
// 1: 没有视频权限 2: 没有音频权限
}
@Override
public void onClassBegin() {
// 课堂开始
}
@Override
public void onClassDismiss() {
// 课堂结束
}
@Override
public void onLeftRoomComplete() {
// 离开课堂成功
}
@Override
public void onEnterRoomFailed(int result, String desc) {
// 进入房间失败
TKToast.showToast(activity, "进房失败(" + result + "):" + desc, Toast.LENGTH_LONG);
}
@Override
public void joinRoomComplete() {
// 进入课堂成功
}
@Override
public void onCameraDidOpenError() {
// 摄像头打开失败
}
@Override
public void onOpenEyeProtection(boolean isOpen) {
// 护眼模式开关
}
@Override
public void onJoinBlocked(int reason, String desc) {
// 进房被重入保护拦截
if (reason == MeetingNotify.JOIN_BLOCKED_DEBOUNCE
|| reason == MeetingNotify.JOIN_BLOCKED_IN_PROGRESS) {
TKToast.showToast(activity, "正在进入教室,请勿重复操作", Toast.LENGTH_SHORT);
}
}
}
|
接口源码(参考)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 | package com.cloudlive.interfaces;
public interface MeetingNotify {
/** 被踢出教室 res: 1 被人提出房间 0 被主播踢出房间 401 直播已结束 402 直播已取消 */
default void onKickOut(int res, String fromID) {}
/** 报错 code: 1 没有视频权限 2 没有音频权限 */
default void onWarning(int code) {}
/** 课堂开始的回调 */
default void onClassBegin() {}
/** 课堂结束的回调 */
default void onClassDismiss() {}
/** 离开课堂成功后的回调 */
default void onLeftRoomComplete() {}
/** 失败的原因描述 */
default void onEnterRoomFailed(int result, String desc) {}
/** 进入课堂成功后的回调 */
default void joinRoomComplete() {}
/** 摄像头打开失败回调 */
default void onCameraDidOpenError() {}
/** 是否打开护眼模式 */
default void onOpenEyeProtection(boolean isOpen) {}
/**
* 进房请求被重入保护拦截(本次 joinRoom/joinPlayBackRoom 调用未生效)
* @param reason 拦截原因:JOIN_BLOCKED_DEBOUNCE / JOIN_BLOCKED_IN_PROGRESS
* @param desc 描述信息(含入口标识与时间,便于日志排查)
*/
default void onJoinBlocked(int reason, String desc) {}
/** 拦截原因:距上次触发不足 3 秒(防连点/重复回调) */
int JOIN_BLOCKED_DEBOUNCE = 1;
/** 拦截原因:上一轮进房仍在进行中,重复进房可能破坏白板/课件状态 */
int JOIN_BLOCKED_IN_PROGRESS = 2;
}
|