会议管理
加入会议
joinConference
TangInterface.joinConference(context: Context, req: MeetingReq, callback: TangCallback<String>)
参数
参数 | 描述 |
---|---|
context | Android系统上下文对象(一般为Activity/Fragment实例) |
req | 进入SDK需要传递的参数,见下面的详细说明 |
callback | 入会相关回调 |
核心参数
参数 | 描述 |
---|---|
pcode | 入会码/入会链接 |
用户信息
参数 | 描述 |
---|---|
name | 入会的用户名称。name和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来源:
- 账号密码登录返回
- 调用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实现
- 不需要添加依赖:biz_cast_6.10.22092201.aar
- 通过类:CastManager实现相关功能
- 关于扫描投屏码,输入投屏码,自行实现相关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 |
字段类型: HOST - 主持人,使用该字段会替换原主持人姓名和复制会议信息中标题的主持人名称 LIVE_LINK - 直播链接,使用该字段会替换原直播链接 |
是 |
propertyName | 字段名称(例:会议ID) | 是 |
propertyValue | 字段名称(例:会议ID) | 是 |
visible | 在会中会议详情页是否可见 | 是 |
修改视频展示比例
接口:TangSdkApp.setVideoDisplayMode()
参数名 | 说明 | 必须 |
---|---|---|
displayMode | 0为占满屏幕,1为原始比例 | 是 |