会议管理

加入会议

joinConference

TangInterface.joinConference(context: Context, req: MeetingReq, callback: TangCallback<String>)

参数

参数 描述
context Android系统上下文对象(一般为Activity/Fragment实例)
req 进入SDK需要传递的参数,见下面的详细说明
callback 入会相关回调

核心参数

参数 描述
pcode 入会码/入会链接

用户信息

参数 描述
name 入会的用户名称。name和email可以二选一
email 入会的用户邮箱。name和email可以二选一
userID 用户ID,默认空,如果传入则为全时用户的用户名
iconUrl 头像链接,默认空,显示首字母头像,如果传入则为全时用户的头像

功能配置

参数 描述
isShowInvite true: (默认值)启用邀请参会人功能 false: 隐藏邀请参会人功能
isShowChat true: (默认值)启用聊天功能 false: 隐藏聊天功能
isJumpJoin false: (默认值)启用入会预览功能 true: 隐藏入会预览功能
isShowAudio true: (默认值)在入会预览时开启音频功能 false: 在入会预览时关闭共享音频功能
isShowVideo true: 在入会预览时开启视频功能 false: 在入会预览时关闭共享视频功能(和管理中心存在优先级问题)
extraInfoList 自定义扩展会议信息,详情参考下文
preferredVoiceType 设置默认入会语音连接方式
isShowLock true: (默认值)是否显示会中锁定会场,解除锁定功能

PreferredVoiceType参数说明

参数 描述
PreferredVoiceType.NONE(0) 默认值,VOIP(如果管理中心配置支持)
PreferredVoiceType.NO_VOICE(7) 不选语音方式入会
PreferredVoiceType.PSTN(6) 电话语音方式入会
PreferredVoiceType.VOIP(1) 以VoIP方式入会
参数 描述
callback 入会结果回调 0为成功 其他为失败

离开会议

exitConference

TangInterface.exitConference()

调用时机:用户在会中页面操作后,SDK中会自动调用该接口,用户正常流程无需使用。

结束会议

endConference

TangInterface.endConference()

调用时机:用户在会中页面操作后,SDK中会自动调用该接口,用户正常流程无需使用。

会议状态

MeetingStatusListener

SDK提供了会议状态的监听接口。注意,状态监听的添加与移除需要配对调用。

// 添加状态监听
TangInterface.addMeetingStatusListener(callback: TangCallback<MeetingStatus>)
// 移除状态监听
TangInterface.removeMeetingStatusListener(callback: TangCallback<MeetingStatus>)

enum class MeetingStatus {
    // 退会
    LEAVE,
    // 会议结束
    END,
    // 主持人结会
    HOST_END_MEETING,
}

错误码

错误码 说明
-1 会议密码获取失败
-200 入会userid传入与url链接解析获取的userid不一致
-1300 网络异常
15007 取消入会
17000 语音类型设置错误
17001 正在入会中,请不要重复入会
40001 没有麦克风权限
40010 会议入会调起串错误
40011 获取会议信息失败
40012 入会姓名格式不正确
40030 入会失败
其他 请使用ErrorCode.getCodeMessage()获取相关错误码信息

问题反馈

云会议已内置问题反馈功能,集成相应模块即可。

除此之外,用户也可直接调用反馈接口来反馈问题,参考代码如下:

 FeedbackSDK.submitFeedback(
                    context = requireContext(),
                    // 非正式问题反馈请前缀添加“TS忽略”
                    description = "TS忽略 来源:Android SDK DEMO 描述:$desc",
                    userConfig = UserConfig().apply {
                        mobile = phone
                    },
                    callback = object : UploadCallback() {

                        override fun onZipStart(totalNum: Int) {
                            updateStatus("开始压缩日志")
                        }

                        override fun onZipProgress(totalNum: Int, index: Int) {
                            updateStatus("正在压缩日志 第 $index/$totalNum 个")
                        }

                        override fun onUploadProgress(percent: Int) {
                            updateStatus("正在上传反馈 百分比:$percent")
                        }

                        override fun onUploadSuccess() {
                            updateStatus("上传反馈成功")
                        }

                        override fun onUploadFail(code: Int, message: String?) {
                            updateStatus("上传反馈失败 $message")
                        }
                    }
                )

 

投屏功能

暂仅支持Android5.0及以上机型,Android5.0以下隐藏该入口。

添加投屏功能依赖

具体版本号以实际提供的版本为准

名称 描述
sdk_im_1.0.7.aar 【必选】消息模块
sdk_auth_6.10.22092201.aar 【必选】用户身份认证模块
sdk_cast_core_6.10.22092201.aar 【必选】投屏业务模块
biz_cast_6.10.22092201.aar 【可选】投屏UI:扫描投屏码、扫描投屏码错误提示、输入投屏码、投屏中

初始化SDK

初始化SDK,添加全局监听

当未登录、或登录未连接状态,投屏功能不可用

UserManager.init(applicationContext, object : LoginStateListener {
     override fun onLogin() {
          LogUtil.i(TAG, "onLogin ----> 登录成功回调")
     }
     override fun onLogout() {
          LogUtil.i(TAG, "onLogout ----> 退出登录成功回调")
     }
     override fun onConnectedStatus(state: Int) {
          LogUtil.i(TAG, "onConnectedStatus(连接状态) ----> state = $state")
     }
})

参数说明:

参数 说明
state 0-未连接;1-正在连接(重连);2-已连接;3-session过期

身份认证

用户登录

提供umsUserId和token登录

umsUserId、token来源:

  1. 账号密码登录返回
  2. 调用OpenApi获取(SDK集成方式)
UserManager.auth(
    sdkToken = SDKToken(umsUserId = umsUserId, token = token),
    clean = CLEAN_NO_CHECK,
    result = { resp ->
        log("登录结果:${resp.isOk()}")
    }
)

参数说明:

参数 说明
sdkToken 用户信息:umsUserId、token
clean 登录方式:0-【默认】不检测也不踢出,不限制同平台登录数;1-同平台进行检测(已有登录则报错);2-强行登录,直接踢出其余已登录的同平台账号
result 结果回调:true:成功,false:失败

退出登录

UserManager.logout(object : ResultListener {
    override fun onFailure(code: Int) {
        LogUtil.i(TAG, "onFailure ----> code = $code")
    }

    override fun onSuccess() {
        LogUtil.i(TAG, "onSuccess ---->")
    }
})

开始投屏

使用SDK UI组件

需要添加依赖:biz_cast_6.10.22092201.aar 类:CastUI

// 启动扫描投屏码界面
CastUI.startScanActivity(context: Context, callback: ((State) -> Unit?)? = null)

// 启动输入投屏码界面
CastUI.startInputActivity(context: Context, callback: ((State) -> Unit?)? = null)

// 打开投屏界面
CastUI.startCastActivity(context: Context, link: String?, callback: ((State) -> Unit?)? = null)

 

方法 返回值 说明
startScanActivity(context: Context, callback: ((State) -> Unit?)? = null) 返回值:-2-没有悬浮窗权限,去授权;-1-未登录;0-未连接;1-正在连接(重连);2-已连接(成功:启动相应界面); 打开扫描投屏码界面
startInputActivity(context: Context, callback: ((State) -> Unit?)? = null) 同上 打开输入投屏码界面
startCastActivity(context: Context, link: String?, callback: ((State) -> Unit?)? = null) -1:未登录;-2:没有悬浮窗权限;-3: 链接格式不正确;0:未连接;1:正在连接;2:已连接(启动成功) 打开投屏界面

自定义UI实现

  1. 不需要添加依赖:biz_cast_6.10.22092201.aar
  2. 通过类:CastManager实现相关功能
  3. 关于扫描投屏码,输入投屏码,自行实现相关UI接口,与投屏逻辑无太大关系,也可参照sdk demo提供的代码实现。
class CastActivity : AppCompatActivity(), CastCallback {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        castCode = extras?.getString(EXTRA_CODE, "") ?: ""
        // 设置投屏代理,并申请投屏权限
        CastManager.attachDelegate(this)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        // 处理投屏权限授权结果
        CastManager.processActivityResult(requestCode, resultCode, data) {
            if(it){
                // 开始投屏
                CastManager.start(castCode = castCode, callback = this)
            } else {
                finish()
            }
        }
    }

    override fun initListener() {
        // 停止投屏
        mStopBtn.setOnClickListener {
            if (CastManager.stop() == true) {
                logI(TAG, "stop result ---> true")
            }
        }
    }

    override fun onConnectedStatus(isConnected: Boolean) {
        log(TAG, "onMeetingConnectedStatus: isConnected = $isConnected")
    }

    // 监听投屏结果
    override fun onState(state: State, boxInfo: BoxInfoResult?) {
        log(TAG, "onState: state = $state, boxInfo = $boxInfo")
        if (state == State.SUCCESS) {
            logI(TAG, "投屏成功")
        } else if (state is State.FAILED) {
            finish()
        }
    }

    // 注销投屏代理
    override fun onDestroy() {
        CastManager.dettachDelegate()
        super.onDestroy()
    }
}

相关接口说明

方法 说明 参数
attachDelegate 设置投屏代理,并申请投屏权限 activity
processActivityResult 处理投屏权限授权结果 透传onActivityResult(requestCode, resultCode, data)参数
start 开始投屏 castCode:投屏码, timeout:超时时间(默认15s,值范围5s-30s), callback:结果回调
stop 停止投屏
dettachDelegate 注销投屏代理

CastCallback回调说明

方法 说明 参数
onConnectedStatus 监听投屏中连接状态 isConnected:true-正常,false-断线
onState 投屏结果回调 state:状态值, boxInfo: 设备信息

State值说明

  • State.SUCCESS: 投屏成功
  • State.FAILED:投屏失败
错误码(FAILED.code) 说明
200 取消投屏
201 无法连接到会议室设备
202 投屏参数校验失败
203 建立投屏过程失败
204 当前设备正在开会或投屏
205 等待投屏设备响应超时
206 建立投屏过程失败
207 建立投屏过程失败
208 投屏码为空

代码混淆配置

如果您的工程开启的代码混淆,请在您的配置中添加如下配置

# sdk_auth
-keep class com.gnet.account.data.**{*;}
-keep class com.gnet.account.api.request.**{*;}
-keep class com.gnet.account.api.response.**{*;}
# sdk_cast_core
-keep class com.gnet.cast.core.bean.**{*;}
# lib_im
-keep class com.gnet.imlib.thrift.** {*;}

自定义邀请配置

接口:TangInterface.invitationCall = IInvitationCall()

提供给宿主APP单独设置邀请UI的接口,用户可实现IInvitationCall类进行相应设置。

// inviteDataBean:包含最大邀请和已邀请的人数等
// callback:宿主方需要通过此回调,把选择的人员回调给SDK处理
void inviteWithAttendList(Context context, HadInviteListBean hadInviteListBean , TangCallback> callback);

// 会中已邀请人数的变化
// count:已邀请的人数是不断变化的,宿主APP需要不断改变可以邀请的数量
void onHadAttendCountChanged(int count);

public class HadInviteListBean{
    // 邀请最大限制人数
    private int totalCount;
    // 已邀请的人数
    private int invitedCount;
    // (参会人pcode)
    private int pcode;
    // 吊起串中cid
    private int conferenceId;
    // 吊起串中 conf_id
    private int tempConferenceId;
    // 已邀请人列表
    private List attendeeList;
}
public class InvitationBean{
    // 邀请人的姓名
    private String name;
    // 邀请人的手机号码
    private String phoneNumber;
    // 邀请人的id(非必填)
    private String userId;
}

参会人开放邀请配置

接口:TangInterface.openJoinerInvite= true

在实现自定义邀请前提下,我们还开放了参会人邀请权限,注意,参会人使用该权限无法正常外呼。

会议信息扩展配置

接口说明参考上一节进入和退出会议,在入会接口中可以填充extraInfoList字段

参数名 说明 必须
type

字段类型:
TYPE DESC - 文本信息(默认)
LINK - 入会链接,使用该字段会替换原入会链接
PCODE - 入会码,使用该字段会替换原入会码

HOST - 主持人,使用该字段会替换原主持人姓名和复制会议信息中标题的主持人名称

LIVE_LINK - 直播链接,使用该字段会替换原直播链接

propertyName 字段名称(例:会议ID)
propertyValue 字段名称(例:会议ID)
visible 在会中会议详情页是否可见

 

修改视频展示比例

接口:TangSdkApp.setVideoDisplayMode()

参数名 说明 必须
displayMode 0为占满屏幕,1为原始比例