跳转至
400-881-9892

文档中心

官方文档,可查阅产品介绍、快速入门、用户指南、开发指南、API参考、SDK参考、帮助等信息。

文档中心 互动课堂

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

1
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

1
default void onWarning(int code)

教室内运行过程中的告警回调。

code 含义
1 没有视频权限
2 没有音频权限

onClassBegin

1
default void onClassBegin()

课堂开始的回调。主播开始直播时触发。


onClassDismiss

1
default void onClassDismiss()

课堂结束的回调。主播结束直播时触发。


onLeftRoomComplete

1
default void onLeftRoomComplete()

离开课堂成功后的回调。本地主动调用 leaveRoom 或被踢出后房间资源清理完成时触发。


onEnterRoomFailed

1
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.xmltkapp_checkmeeting_error_* 系列。


joinRoomComplete

1
default void joinRoomComplete()

进入课堂成功后的回调。SDK 内部完成进房、加入信令、白板初始化等流程后触发,此时可执行 UI 状态切换、本地房间记录保存等操作。


onCameraDidOpenError

1
default void onCameraDidOpenError()

摄像头打开失败的回调。通常因权限未授予或摄像头被其他应用占用。


onOpenEyeProtection

1
default void onOpenEyeProtection(boolean isOpen)

是否打开护眼模式的回调。

参数 类型 说明
isOpen boolean true 已开启护眼模式;false 已关闭

onJoinBlocked

1
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 拦截原因:上一轮进房仍在进行中,重复进房可能破坏白板 / 课件状态

注册方式

1
2
3
4
5
6
7
8
// 同时实现 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) 也会携带进房校验阶段的错误码(如 634110 等),两者配合处理更完整

完整示例

 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;
}