Android -RT SDK
1 文档目的
众多客户希望能拥有更多的app设计能力,特别是对于希望拥有自己风格的UI, 开发人员资源的公司。为此,特提供android实时 SDK,以便客户可以针对自己的业务场景设计最符合自己业务场景的客户端。
本sdk是实时的,与web有本质的区别。
其中sdk中对一路视频的实现,如果只需要观看直播或者听课,可以使用RtSimpleIMPL来加入直播,该路视频的内容包含直播视频、桌面共享、插播。
2 SDK使用准备
2.1 开发环境要求
pc操作系统:64位windows系统
jdk:1.5以上
eclipse:3.5以上 建议使用官方已经集成adt的eclipse, android studio
android:4.0及以上
设备:设备操作系统4.0以上,需要访问硬件,请不要使用模拟器进行开发
2.2 需要导入的jar
gensee_common.jar
gensee_hb.jar
gensee_rt_audio.jar
gensee_rtsdk.jar
gensee_doc.jar
gensee_expression.jar
gensee_video.jar
如果有聊天,请添加聊天资源RTRoutineLib库,并在聊天消息要显示或输入前初始化聊天资源:ChatResource.initChatResource(Context context),调用一次即可。
2.3 需要添加的动态库
libandroid_routine.so
libAVCDecoder.so
libH264Android.so
libstlport_shared.so
libRtRoutine.so
libspeex.so
libucbase.so
libucnet.so
libucpdu.so
libucpingpdu.so
libucwcc.so
libwebrtc_audio_preprocessing.so
libgensee-log.so
libucrtp.so(3.5 rtsdk增加)
//文档需要,如果没有文档(ppt)功能,可以不用添加下面的库
libandroid-swfplayer.so
libSwfView.so
libucjpeg.so
libuctinyxml.so
将上述动态库文件添加到工程libs armeabi 目录下,如果没有该文件夹则新加libs armeabi文件夹。x86同理。若有armeabi-v7a也从armeabi-v7a复制一份到里面。
2.4 配置与信息
2.4.1 权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.camera.flash" /> <uses-permission android:name="android.permission.RECORD_VIDEO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
2.4.2version
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
2.4.3OnTaskRet 辅助接口
下文中OnTaskRet辅助接口,每一次调用执行结果通知,onTaskRet(boolean ret, int id, String desc)中ret为true代表执行成功,false执行失败,id和desc目前没有意义。
2.4.4InitParam说明
setDomain(String domain) //设置站点域名 如demo.gensee.com 不能为空 setNumber(String number) //设置站点编号 “8位”数字字符串,没有liveId时必填 setLoginAccount(String loginAccount) //设置站点登录帐号(若后台设置需要登录,必填) setLoginPwd(String loginPwd) //设置站点登录密码(若后台设置需要登录,必填) setNickName(String nickName) //设置加入昵称 用于显示和统计(不要填空) setJoinPwd(String joinPwd) //设置加入口令(和后台设置的对应角色口令保持一直,没有设置口令一定要填写 “”) setLiveId(String liveId)//设置直播id,等价于setNumber,如果设置了直播id,就不用number setUserId(long userId)//设置自定义用户id,使用的情况下请保证大于1000000000,否则无效 setUserData(String userData)//设置用户信息,若使用,请保证key和后台一致 setK(String k)//设置第三方认证K值,如果启用认证,请填写有效的K,没启用忽略
2.4.5Userinfo说明
getId() //用户id getName //用户昵称 getRole() //用户角色(复合角色) IsHost() //是否老师/组织者 IsPresentor() //是否主讲 IsPanelist() //是否嘉宾/助教 IsAttendee() //是否为客户端普通参与者/学生 IsAttendeeWeb() //是否为web端普通参与者/学生 IsHandup() //是否举手
2.4.6混淆打包事项
如果app打包需要混淆,请添加混淆代码
-dontwarn com.gensee.** -keep class com.gensee.**{*;}
2.5快速接入gensee直播间(课堂)
2.5.1使用RtSimpleImpl加入直播间(课堂)
Step1、创建好RtSimpleImpl实例。
这里要实现抽象函数,并可重写其他函数来接收直播间的所有通知信息。onGetContext必须返回有效的app context。否则无声音。
RtSimpleImpl simpleImpl = new RtSimpleImpl() {…} //可参考demo
设置视频显示的view
simpleImpl.setVideoView(gsVideoView);
设置文档显示的view
simpleImpl.setDocView(gsDocView);
Step2、获取直播的相关信息,调用RtComp的initWithGensee(initParam)进行初始化,随后RtComp.Callback中onInited(String rtParam)响应并返回直播加入参数rtParam。
Webcast 直播间信息和参数对照图:
Training课堂信息和参数对照图:
Step3、使用rtParam和simpleImpl加入直播间(课堂)
public void onInited(String rtParam) {
simpleImpl.joinWithParam("", rtParam);
}
正常加入后sdk会进行直播间状态、人员等信息的通知,可以根据需要重写RtSimpleImpl的相关函数来接收直播间的通知,RtSimpleImpl实现了IRoomCallback,因此可参考IRoomCallback说明来重写对应函数。
2.5.2RtSdk扩展更多功能
如果要实现聊天、问答、投票等更多功能,可获取rtSdk句柄进行扩展,下述回调设置代码尽可能在加入直播间(simpleImpl.joinWithParam())之前进行调用,以保证直播间通知的及时性、完整性。
RtSdk rtSdk = simpleImpl.getRtSdk(); //获取rtSdk实例
rtSdk.setLocalVideoView(localVideoView); //设置本地视频预览view,观看端不需要
设置事件回调
rtSdk.setLodCallBack(lodCallback); //设置插播(媒体共享)模块回调
rtSdk.setChatCallback(chatCallback); //设置聊天模块回调
rtSdk.setVoteCallback(voteCallback); //设置投票模块回调
rtSdk.setQACallback(qaCallback); //设置问答回调
聊天功能调用
rtSdk.chatWithPublic(“公共聊天消息”, null); //发送公共聊天消息
rtSdk.chatWithPersion(“私聊消息”,receiveUserId,null); //发送私聊消息
音频功能调用
rtSdk.audioOpenMic(null); //打开麦克风
rtSdk.audioCloseMic(null); //关闭麦克风
rtSdk.audioCloseSpeaker(null); //关闭扬声器
rtSdk.audioOpenSpeaker(null); //打开扬声器
…
更多功能调用参考文档关于RtSdk的介绍。
3回调(代理)响应
3.1初始化响应回调RtComp.Callback
本接口是RtComp中initWithGensee 被调用后的结果响应。
3.1.1onInited(String joinParam)
说明:initWithGensee调用成功,joinParam作为后续api的参数。
3.1.2onErr(int errCode)
说明:initWithGensee调用失败,并将错误结果返回。errCode即为错误码。其中错误码定义在Callback中。
使用:RtComp.Callback.ERR_NUMBER_UNEXIST //直播间不存在
错误码:
int ERR_JSON_ERROR = -1; //响应数据格式不正确,请检查网络或参数 int ERR_DOMAIN = -100; // ip(domain)不正确 int ERR_TIME_OUT = -101; // 超时 int ERR_UNKNOWN = -102; // 未知错误 int ERR_SITE_UNUSED = -103; // 站点不可用 int ERR_UN_NET = -104; // 无网络 int ERR_DATA_TIMEOUT = -105; // 数据过期 int ERR_SERVICE = -106; // 服务不正确 int ERR_PARAM = -107; // 参数不正确 int ERR_THIRD_CERTIFICATION_AUTHORITY = -108;//第三方认证(用户权限校验)失败 int ERR_UN_CONNECTED = -109; //无法连接 请检查网络 int RESULT_SUCCESS = 1; // 成功
int ERR_NUMBER_UNEXIST = 0; // 直播间不存在 int ERR_TOKEN = 4; // 口令错误 int ERR_LOGIN = 5; // 用户名或密码错误 int ERR_FAIL_WEBCAST = 3; // 直播id不正确 int ERR_WEBCAST_UNSTART = 6; // 直播未开始//课堂过期 int ERR_ISONLY_WEB = 7; // 只支持web int ERR_ROOM_UNEABLE = 8; // 直播间不可用 int ERR_ROOM_OVERDUE = 11; // 过期 int ERR_AUTHORIZATION_NOT_ENOUGH = 12; // 授权不够 int ERR_UNTIMELY = 13; // 太早
3.2直播间响应回调IRoomCallBack
说明:主要用作直播(课堂)相关状态的回调,如加入状态、直播状态、录制状态、用户加入离开。
3.2.1onInit(boolean result)直播间初始化响应
回调说明:直播(课堂)初始化,result为true代表成功,false代表失败。
返回false时请注意:
1、onGetContext 没有返回正确的App Context;
2、动态库没有加载或本身不存在,请检查各架构对应的so,也可以从日志里面查看缺少了什么。
3.2.2onRoomJoin(int result, UserInfo self, boolean svrFailover)直播间加入响应
回调说明:加入直播(课堂)响应,result为0代表加入成功,self为当前用户的用户信息。svrFailover 是否是server重启恢复。
result 非0代表加入失败,参考IRTEvent.IRoomEvent.JoinResult中join code。
int JR_OK = 0; //加入成功 int JR_ERROR = JR_OK + 1; //加入错误 int JR_ERROR_LOCKED = JR_OK + 2; //直播间(课堂)被锁定 int JR_ERROR_HOST = JR_OK + 3; //组织者(老师)已经加入 int JR_ERROR_LICENSE = JR_OK + 4; //当前课堂人数已满,无法加入 int JR_ERROR_CODEC = JR_OK + 5; //音频编码不匹配,请取消AAC配置 int JR_ERROR_TIMESUP = JR_OK + 6; //超时 int JR_ERROR_IP_DENY = JR_OK + 7; //IP被封禁 int JR_ERROR_TOO_EARLY = JR_OK + 8; //加入过早。受后台(直播前加入)配置影响 int JR_ERROR_GETPARAM = JR_OK - 1; //参数获取失败(页面启动) int JR_ERROR_LIB_DISABLE = JR_OK - 2;//动态库(so)缺失或加载失败
3.2.3onRoomLeave(int reason)直播间退出响应
回调说明:当前用户退出直播(课堂)。reason为原因如被踢出、主动退出等。
其中reason取值定义在IRTEvent.IRoomEvent.LeaveReason中:
int LR_NORMAL = 0; //用户自行退出 int LR_EJECTED = LR_NORMAL + 1; //被踢出 int LR_TIMESUP = LR_NORMAL + 2; //时间 int LR_CLOSED = LR_NORMAL + 3; //直播(课堂)已经结束(被组织者结束) int LR_EJECTED_IP_DENY = LR_NORMAL + 4; //因ip被封禁而被踢出
一旦该函数被调用的时候可以进行数据清理和相关的对象释放,RtSdk中release。
3.2.4onRoomReconnecting()直播间重连通知
回调说明:正在重连,网络条件不好或网络断开后会被调用。重新连上等同于一次加入直播,因此会重新通知加入结果onRoomJoin。
3.2.5onRoomLock(boolean locked)直播间锁定通知
回调说明:直播锁定状态。true为锁定,fasle未锁定
3.2.6onRoomUserJoin(UserInfo userInfo)直播间新用户加入通知
回调说明:有新用户加入。
3.2.7onRoomUserUpdate(UserInfo userInfo)直播间用户信息变化通知
回调说明:用户状态更新。
3.2.8onRoomUserLeave(UserInfo userInfo)直播间用户退出通知
回调说明:用户退出。
3.2.9onRoomPublish(State s)直播状态通知
回调说明:直播状态变化。
状态定义在State中:
S_NONE //默认 直播未开始 S_RUNNING //直播中 S_STOPPED //直播停止 S_PAUSED //直播暂停
3.2.10onRoomRecord(State s)录制状态通知
回调说明:录制状态变化。
3.2.11onRoomData(String key, long value)直播间数据通知
回调说明:附加状态通知,例如课堂中上讲台、上提问席等,根据具体情况处理。
3.2.12onRoomBroadcastMsg(String msg)直播间广播消息
回调说明:广播消息
3.2.13onRoomRollcall(int timeout)直播间点名
回调说明:点名开始,timeout为点名有效时间。
3.2.14onRoomRollcallAck(long userId)用户应答点名后组织者收到的通知
回调说明:userId已经对本次点名做出了应答,由组织者客户端处理这个回调。
3.2.15onRoomHandup(long userId, String data)直播间用户举手通知
回调说明:userId对应的用户举手了。
3.2.16onRoomHanddown(long userId)直播间用户取消举手的通知
回调说明:userId对应的用户取消了举手。
3.2.17getServiceType()返回站点类型
回调说明:返回service类型如castline、training、meeting。定义在ServiceType中。
3.2.18onGetContext()返回app context
回调说明:android 客户端返回app context。
3.2.19onChatMode(int chatMode)聊天模式切换通知
回调说明:直播间内聊天模式通知,即聊天权限变化通知。默认为CHAT_MODE_ALLOW_ALL
chatMode 取值定义在IChatCallBack当中:
int CHAT_MODE_DENY = 0;// 禁止聊天,禁止后要控制当前用户不能发送聊天消息 int CHAT_MODE_ALLOW_ALL = 1; // 允许任何形式的聊天 int CHAT_MODE_ALLOW_PUBLIC = 2; // 允许进行公共聊天 int CHAT_MODE_ALLOW_PRIVATE = 3; // 允许进行私人聊天
3.2.20onLottery(byte step, String userlist)抽奖流程通知
回调说明:抽奖进行的步骤通知,其中step取值定义在IRoomCallback中:
byte LOTTERY_BEGIN = 1;//抽奖开始 byte LOTTERY_END = 2;//抽奖结束,userlist为被抽中人员名称 byte LOTTERY_CANCEL = 3;抽奖取消
3.2.21onSettingSet(String key, int val)直播间int类配置信息
回调说明:sdk将直播间配置以key-value的对应关系告知app应用层,原则上应用层需要存储一份,因为后续操作当中可能再次向应用层要回配置信息,这个函数主要针对int类的配置,例如视频分辨率和帧率。Key 定义在RTSharedPref里面:
String KEY_VIDEO_W = "save.video.width"; //视频采集宽,默认val 320 String KEY_VIDEO_H = "save.video.height"; //视频采集高,默认val 240 String KEY_VIDEO_FPS = "save.video.fps"; //视频采集帧率,默认val 15,不要随意更改 String KEY_CHAT_DISABLE_ATTENDEE_PRIVATE = "chat.disable.attendee.private"; //0:enabled [default]; 1: disabled 请将这个聊天配置和onChatMode的聊天权限合并使用(都可以私聊的条件下才可发送私聊消息) val为对应的值。
3.2.22onSettingSet(String key, String val)直播间String类配置信息
回调说明:同onSettingSet(String,int),sdk将直播间配置以key-value的对应关系告知app应用层, 这个函数主要针对String类的配置。Key 定义在RTSharedPref里面:
String KEY_CLASS_NAME = "training.class.name";//直播间名称 ,取代原有的onRoomSubject。
val 为对应的值。
3.2.23int onSettingQuery(String key, int val)直播间取回int类配置信息
回调说明:主要取回int类配置信息,一般学生端用不上,请按需返回,默认请返回0,例如取回分辨率宽(仅举例):
int onSettingQuery(String key, int val){ if(KEY_VIDEO_W.equals(key)){ return 320; } //默认返回0 return 0; }
3.2.24String onSettingQuery(String key)直播间取回String类配置信息
回调说明:主要取回String类配置信息,一般学生端用不上,请按需返回,默认请返回null,例如返回直播间名称(仅举例):
String onSettingQuery(String key,){ if(KEY_CLASS_NAME.equals(key)){ return 已经存储的名称; } //默认返回null return null; }
3.2.25onNetworkReport(byte level)网络质量通知
回调说明:网络质量通知,level 取值0-100 (差-好)。
3.2.26onNetworkBandwidth(int bpsSend, int bpsRecv) 带宽通知
回调说明:上下行带宽通知bpsSend 发送带宽,bpsRecv接收带宽
3.3音频回调IAudioCallBack
本接口是音频相关回调,基本上不需要处理,一般可能会处理的是电频值。
3.3.1onAudioJoinConfirm(boolean ok)音频模块加载通知
回调说明:音频模块加快成功。
3.3.2onAudioMicAvailable(boolean isAvailable)mic设备“可用”通知
回调说明:音频mic可用度。isAvailable 为true可用。
3.3.3onAudioMicOpened()mic被打开通知
回调说明:mic已开启。
3.3.4onAudioMicClosed()mic被关闭通知
回调说明:mic已关闭。
3.3.5onAudioSpeakerOpened()扬声器被打开通知
回调说明:扬声器已打开。
3.3.6onAudioSpeakerClosed()扬声器被关闭通知
回调说明:扬声器已关闭。
3.3.7onGetContext()返回 appContext
回调说明:android客户端获取app上下文。
3.3.8onAudioLevel(int level, long userId)用户扬声器电频通知
回调说明:userId 对应用户的音频电频值,注:电频值不是音量大小,大小在0-100之间。
3.4视频回调IVideoCallBack
本接口是视频相关状态回调,以及用户视频数据接收。
3.4.1onVideoJoinConfirm(boolean ok)视频模块加载通知
回调说明:ok标识视频模块加载是否成功,true代表成功,false代表失败。
3.4.2onVideoCameraAvailiable(boolean ok)摄像头可用通知
回调说明:设备摄像机可用状态,ok为true表示可用,false不可用。
3.4.3onVideoCameraOpened()摄像头被打开通知
回调说明:摄像机已经打开。
3.4.4onVideoCameraClosed()摄像头被关闭通知
回调说明:摄像机已经关闭。
3.4.5onVideoJoin(UserInfo user)用户视频开启通知
回调说明:用户视频开启通知,如果需要显示某用户的视频,可以调用rtsdk的displayvideo来订阅该用户的视频,同时也可以取消订阅,从而达到数据流量的节省。
注:userId == UserInfo.LOD_USER_ID代表插播,其他是具体的某个用户
3.4.6onVideoLeave(long userId)用户视频关闭通知
回调说明:用户视频关闭,此时可以取消该用户的视频。
3.4.7onVideoActived(UserInfo user, boolean bActived)直播视频启用通知
回调说明:bActived为true代表直播视频开启,false代表直播视频取消,本质上是某个用户的视频,需要显示该用户视频的话,则要订阅该用户的视频数据。
3.4.8onVideoDisplay(UserInfo user)观看user视频响应
回调说明:观看(displayVideo)user用户视频响应。
3.4.9onVideoUndisplay(long userId)取消观看userId视频响应
回调说明:停止观看(unDisplayVideo)userId用户视频的响应。
3.4.10onVideoDataRender(long userId, int width, int height,int frameFormat, float displayRatio, byte[] data)视频数据流通知
回调说明:userId对应的用户视频数据,其中该数据传递给GSVideoView就能显示其视频,请将GSVideoView和用户对应起来,不要交错的把不同用户数据传递给GSVideoView。
3.5桌面共享回调IAsCallBack
本接口是做桌面共享回调使用的,通知共享状态极其数据。
3.5.1onAsJoinConfirm(boolean ok)桌面共享模块加载通知
回调说明:桌面共享加载状态,ok为true代表加载成功,false为失败。
3.5.2onAsBegin(long owner)桌面共享开启通知
回调说明:桌面共享开始,owner启用桌面共享的userId。
3.5.3onAsEnd()桌面共享结束通知
回调说明:桌面共享结束。
3.5.4onAsData(byte[] data, int width, int height)桌面共享数据流通知
回调说明:桌面共享数据,使用GSVideoView来显示,将data传递给GSVideoView。
3.6插播(媒体共享)回调ILodCallBack
本接口是用作插播播放状态通知使用的,包括播放开始、结束、进度等状态。
3.6.1onLodFailed(String id)插播(媒体共享)失败通知
回调说明:播放失败。
3.6.2onLodStart(LiveodItem liveodItem) 插播(媒体共享)开始通知
回调说明:插播(liveodItem)播放开始。
3.6.3onLodSkip(LiveodItem liveodItem) 插播(媒体共享)跳跃通知
回调说明:插播进度变化。
3.6.4onLodPause(LiveodItem liveodItem); 插播(媒体共享)暂停通知
回调说明:插播暂停。
3.6.5onLodStop(LiveodItem liveodItem); 插播(媒体共享)停止通知
回调说明:插播停止。
3.6.6onLodPlaying(LiveodItem liveodItem); 插播(媒体共享)播放中
回调说明:插播正在播放,进度变更。
3.6.7onLodAdd(LiveodItem liveodItem); 插播(媒体共享)被添加通知
回调说明:添加了一个插播。一般是由pc客户端主动添加。
3.6.8onLodRemove(String id); 插播(媒体共享)被移除通知
回调说明:插播被删除,id对应于liveodItem的url。一般由pc客户端主动删除。
3.7聊天回调IChatCallBack
本接口为接收聊天消息,包括私聊、公聊消息。注:聊天表情显示需要添加聊天资源RTRoutineLib库,并在聊天消息要显示或输入前初始化聊天资源:ChatResource.initChatResource(Context context),调用一次即可。表情处理:
1、优先初始化聊天资源ChatResource.initChatResource(Context context)
2、用MyTextViewEx显示一条聊天消息的富文本。MyTextViewEx.setRichText(richText);
3、表情选择面板:
(1)SpanResource.getBrowMap取到所有的表情Map<key,value>,即Map<String, Drawable>,一个表情对应一个key-value,取出(map.entrySet())所有的value就是所有的表情Drawable,绑定到界面上。
(2)界面上选择一个表情,得到对应的key,将key传递到ChatEditText输入框即可。
4、编辑发送聊天消息用ChatEditText接收上面3-(2)中的key: ChatEditText.insertAvatar(key,0)
5、发送聊天消息,取出输入框ChatEditText的纯文本(getChatText())和富文本(getRichText())作为公聊或私聊的参数进行发送。发送接口请在本文中查找公聊和私聊详细说明。
增加回调函数onChatMessage(ChatMsg msg);公聊、私聊消息的回调,取代原有的onChatWithPublic和onChatWithPersion。
3.7.1onChatJoinConfirm(boolean bRet)聊天模块加载通知
回调说明:聊天模块加载状态,bRet 为true代表成功,false代表失败。
3.7.2onChatMessage(ChatMsg msg)聊天消息回调
公聊、私聊消息的回调:(注意聊天时间都是收到消息时的系统时间)
int msgType = msg.getChatMsgType();//消息类型 公聊、私聊 String id = msg.getId();//消息id String senderName = msg.getSender();//发送者昵称 String text = msg.getContent();//聊天纯文本 String richText = msg.getRichText();//聊天富文本 long senderId = msg.getSenderId();//发送者id int role = msg.getSenderRole(); //发送者角色 switch (msgType) {//消息类型 公共聊天/私聊 case ChatMsg.CHAT_MSG_TYPE_PUBLIC: //公共聊天 //老用户更新处理:调用原有代码的onChatWithPublic 去掉“@verride” 再加上一个role,没有用到role忽略role onChatWithPublic(senderId, senderName, text, richText, id); break; case ChatMsg.CHAT_MSG_TYPE_PRIVATE://私聊 //老用户更新处理:调用原有代码的onChatWithPersion 去掉“@verride” 再加上一个role,没有用到role忽略role onChatWithPersion(senderId, text, richText,id); break; default: break; }
去掉onChatToPersion,即发出的私聊消息不再回调,修改
String msgId = UUID.randomUUID().toString();//消息id,即加上uuid ChatMsg msg = new ChatMsg(text,rich,ChatMsg.CHAT_MSG_TYPE_PRIVATE,msgId); msg.setReceiverId(userId);//接收人的id //私聊消息msgId,text,rich都不为空且接收人id正确才有效 mRtSdk.chatWithPersion(msg,new OnTaskRet() { @Override public void onTaskRet(boolean ret, int arg1, String arg2) { if(ret){ //自己发送的私聊消息添加到列表,如果有其他处理方式,忽略。 onChatToPersion(userId, text, rich,msgId); } } });
附老回调接口,仅供老用户更新参考:
onChatWithPersion(UserInfo userInfo, String msg, String richText)收到私聊消息
回调说明:收到userInfo发来的私人聊天消息,msg为文本消息,richText为对应的富文本消息。
onChatWithPublic(UserInfo userInfo, String msg, String richText)收到公聊消息
回调说明:收到userInfo发来的公共聊天消息,msg为文本消息,richText为对应的富文本消息
onChatToPersion(long userId, String msg, String richText)发出私聊消息回送
回调说明:自己发送的私聊发送回传,msg为文本消息,richText为对应的富文本消息
3.7.3onChatEnable(boolean enable)聊天禁言通知
回调说明:聊天权限被控制通知,enable 为true代表可以进行聊天,false不能聊天,客户端需要由此来控制聊天功能。本通知要结合IRoomCallback中onChatMode “与”的关系使用,两处都要同事满足聊天才能发送消息。
3.7.4onChatCensor(long userId, String msgId)聊天审核删除通知
回调说明:当组织者或有权限的人发出删除该条消息或某一人的所有消息时候回调,接收方应对应的去删除聊天消息,已达到审核的目的。userId 不等于0的时候代表删除userId用户的所有聊天消息。当userId 等于0而msgId 不为空的时候,对应删除消息id等于msgId的聊天消息。
3.8投票、试卷、答题卡回调IVoteCallBack
本接口为投票调查(试卷)接收使用的,需要接收则需要注册该回调,rtsdk中setVoteCallBack。
投票调查的数据结构:
VoteGroup 投票调查结构: getM_strId() //投票调查的id getM_strText() //投票调查的主题 getM_questions() //投票调查问题列表(List<VoteQuestion>) isM_bForce() //是否为强制投票 isM_bPublish()//是否已经发布 isM_bDeadline()//是否已经终止答题 isM_bPublishResult()//是否已经发布最终结果(公布) VoteQuestion 投票调查问题结构: getM_strId() //问题id getM_strText()//问题的内容(题目) getM_strType()//问题类型("multi"//多选 "single"//单选 "text"//问答题,VoteQuestionType中)
getM_nScore()//问题的得分数(如10分) getM_nResultUser()//参与该问题的人数 getM_strAnwser()//如果是问答题,该函数返回文字答案 setM_strAnwser(String anwser)//如果是问答题,用户填写的答案通过该函数设置 getM_answers()//如果是单选或多选题,那么选项从这里返回(List<VoteAnswer>) VoteAnswer 问题选项结构: getM_strId()//选项id getM_strText()//选项内容(选项答案) getM_nResultUser()//发布结果时候,选择该选项的人数 isM_bCorrect()//是否是正确答案 setM_bChoose(boolean m_bChoose)//根据界面上用户是否选择该选项来设置true/false isM_bChoose()//返回setM_bChoose设置的值
对于投票调查:不需要重新构造一个VoteGroup,只要将响应回来的VoteGroup对应的绑定到界面上,随着界面的操作调用setM_strAnwser(String anwser)或setM_bChoose(boolean m_bChoose)之后,就可以将这个VoteGroup提交(voteSubmit(VoteGroup voteGroup, OnTaskRet taskRet))。至于其他的交互根据响应来即可,例如强制投票是一定需要参与的,不能关闭,发布结果的时候,就显示最终结果。
3.8.1onVoteJoinConfirm(boolean bRet)投票模块加载通知
回调说明:投票模块加载状态,bRet为true代表成功,反之失败。
3.8.2onVoteAdd(VoteGroup voteGroup)投票被添加通知
回调说明:新添加了一个投票调查voteGroup。
3.8.3onVoteDel(VoteGroup voteGroup)投票被删除通知
回调说明:一个投票调查voteGroup被删除了。
3.8.4onVotePublish(VoteGroup voteGroup)投票发布通知
回调说明:一个投票调查voteGroup被发布了(开始答题)。
3.8.5onVotePublishResult(VoteGroup voteGroup)投票发布结果通知
回调说明:一个投票调查结果发布了(答题结束,公布结果)。
3.8.6onVoteSubmit(VoteGroup voteGroup)投票被回复通知
回调说明:某个用户提交了投票(提交了答案)。
3.8.7onVoteDeadline(VoteGroup voteGroup)投票结束通知
回调说明:投票voteGroup终止,停止答题。
3.8.8onVotePostUrl(String strURL, long optUserId)第三方投票通知
回调说明:第三方投票,strURL是一个第三方投票的链接地址,调用浏览器打开;optUserId 操作者用户id。
3.8.9onCardPublish(Card card)答题卡发布通知
回调说明:小班课老师发答题卡时候回调,一般是学生端处理,显示答题卡进行选择答题
Card:
//答题卡类型,单选:Card.CARD_SINGLE_OPTION,多选:Card.CARD_MULTI_OPTION int type = card.getType(); int timeout = card.getTimeout();//答题时间 int[ ] itemIds = card.getItemIds();//选项id的集合数组 String[ ] itemTexts = card.getItemTexts();//选项的文本表示集合数组,对应itemIds,如A,B,C,D。
3.8.10onCardSubmit(long userId, int[] itemids)答题卡答题通知
回调说明:有人提交答题卡通知,一般是老师端处理,用于统计答题情况。
userId:答题人用户id
itemids:答题人选择的选项id集合
3.8.11onCardEnd()答题结束通知
回调说明:小班课中老师终止答题时学生端响应的事件,学生端应该终止答题。
3.8.12onCardResultPublish(int type, int totalSubmitted, int[] itemSubmitted, int[] itemOptions)答题卡结果通知
回调说明:小班课老师发布最后的统计结果。
type:答题卡类型,多选和单选
totalSubmitted:参与了答题的人数,也就是提交答题卡的人数。
itemSubmitted:选项所对应的选择人数
itemOptions:所有选项的正确性,数组中的值是0错误或1正确。
itemSubmitted和itemOptions 数组长度和card中的选项数目是完全一样的。且是对应关系,
如itemOptions[0] == 1,代表card中第一个选项是正确选项,0为错误选项,以此类推;
itemSubmitted[0] 代表选择了第一个选项的人数,itemSubmitted[1]为选择了第二个选项的人数,以此类推。
3.9问答回调IQACallback
本接口是作为问答通信使用的,使用问答功能则要进行回调注册,通过rtsdk中setQACallback(IQACallback qaCallback)来注册。
3.9.1onQaJoinConfirm(int isOk) 问答模块加载通知
问答模块加载结果,isOk 为true代表加载成功,false加载失败。
3.9.2onQaSettingUpdate(boolean isAutoDispatchQuestion,boolean isAutoPublishQuestion, boolean isQAEnable) 问答权限通知
问答权限通知,当组织者调用qaSetState的时候,其他客户端的onQaSettingUpdate被调用。App要处理好这个权限,isQAEnable为false的时候禁止用户提问。
3.9.3onQaQuestion(QaQuestion qaQuestion, int state) 问答通知
问答通知包括新问题、新回复、回复状态、发布、推送的通知,其中通知类型使用state来区分,qaQuestion 为当前的问题及答案:
String questId = qaQuestion.getStrQuestionId();// 问题id String question = qaQuestion.getStrQuestionContent();// 问题内容 String quester = qaQuestion.getStrQuestionOwnerName();// 提问者名字 String questerFixer = qaQuestion.getStrTaggedUserName();// 问题处理人名字 long qTime = qaQuestion.getDwQuestionTime();// 提问时间(秒) List<QaAnswer> answers = qaQuestion.getQaAnswerList();// 答案列表 if (answers != null) { for (QaAnswer answer : answers) { if (answer != null) { String answerId = answer.getStrAnswerId();// 答案id String answerContent = answer.getStrAnswerContent();// 答案内容 String answerOwner = answer.getStrAnswerOwnerName();// 答案回复者名字 long answerOwnerId = answer.getLlAnswerOwnerId();// 答案回复者id long anwerTime = answer.getDwAnswerTime();// 回复时间(秒) } } }
state定义在IQACallback中,取值如下:
int QA_STATE_QUESTION = 0;//新问题 int QA_STATE_ANSWER = QA_STATE_QUESTION + 1;//新回复 int QA_STATE_PUBLISH = QA_STATE_QUESTION + 2;//发布 int QA_STATE_CANCEL_PUBLISH = QA_STATE_QUESTION + 3;//取消发布 int QA_STATE_PUSH = QA_STATE_QUESTION + 4;//推送 int QA_STATE_ASSIGN = QA_STATE_QUESTION + 5;//指派 int QA_STATE_VOICE_REPLY = QA_STATE_QUESTION + 6; //语音回复 int QA_STATE_VOICE_REPLYING = QA_STATE_QUESTION + 7; //正在语音回复 int QA_STATE_TEXT_REPLYING = QA_STATE_QUESTION + 8; //正在文字回复
3.10GSDocViewGx事件回调接口OnDocViewEventListener
OnDocViewEventListener主要是为了app能够根据GSDocViewGx的事件来处理一些事情,例如全屏切换、隐藏显示其他ui元素。因此,app需要实现这个回调并将其句柄设置给GSDocViewGx。注:这个回调只有在GSDocViewGx处于观看模式的时候才会被调用,编辑模式是无效的。
3.10.1onDoubleClicked(GSDocView docView)
回调说明:双击事件。app处理了这个事件之后返回true,表示该事件已经被处理。
3.10.2onSingleClicked(GSDocView docView)
回调说明:点击事件。app处理了这个事件之后返回true,表示该事件已经被处理。
3.10.3onEndHDirection(GSDocView docView,int type,int eventType)
回调说明:GSDocView水平方向拖到边界。
type匹配:
GSDocView.DRAG_END_LEFT = 1; //左边界
GSDocView.DRAG_END_RIGHT = 2;//右边界
eventType:手势 拖拽或放开
3.11文档事件回调IDocCallBack
IDocCallBack是文档模块的相关事件回调,包括文档打开、关闭、翻页、动画等。
3.11.1onDocJoinConfirm模块加载通知
文档模块加载完成
3.11.2onDocOpened(PduDoc doc)文档打开
一个文档打开,所有人会响应这个函数,代码打开了文档,但打开仅仅是文档信息,不(training小班)一定代表翻页动作,因此这种情况下其他人或自己不会显示的,具体看pc客户端的表现。
doc为打开的文档,可能是ppt、pdf、word等支持的类型的一种。
3.11.3onDocClosed(int docId)文档关闭通知
id为docId的文档被关闭,有一个关闭了,所有人都会响应。
3.11.4onDocGotoPage(int docId, int pageId,int aniStep)翻页
翻页响应,一般情况下收到翻页动作才会显示翻到的这一页,所有人都会响应。
docId 文档id。
pageId 文档中被翻页的页的id。
aniStep 动画步数,ppt类型的文档有效。
3.11.5onDocPageReady(int docId, PduPage page, byte[] data)文档某页数据响应
当文档打开后,会随着翻页或翻页之前把对应的文档实际内容返回,有了返回后才能显示。
onDocReceiveAnno(int docId, int pageId, AbsAnno anno)收到标注响应
老师或组织者做标注时,其他人收到的标注。这部分是自动渲染到GSDocViewGx上的,不用理会
docId 文档id。
page 所属页,
anno 具体标注内容。
3.11.6onDocRemoveAnno(int docId, int pageId, long annoId)移除标注
组织者或老师删除标注的时候响应,实际上也同时会在GSDocViewGx上取消渲染,不用理会
docId 文档id。
pageId 所属页id,
annoId 具体标注的id
3.11.7onDocPageSize(int width, int height)当前页的分辨率
当翻页的时候,会响应当前页的分辨率,需要的情况可以使用
width 宽
height 高
3.11.8onDocUploadStatus(int docId, int status)文档(jpeg图片上传结果通知)
如果有打开调用openDoc来增加文档的情况下,可以根据这个响应来更新上传情况。
docId 上传的文档id
status 上传结果:定义在IDocCallback中
int DOC_UPLOAD_BEGIN = 1;//上传开始
int DOC_UPLOAD_END = 3;//上传完成
int DOC_UPLOAD_GOING = 2;//正在上传
int DOC_UPLOAD_FAILURE = 0;//上传失败
4RTSDK API
4.1RtComp
说明:首先要domain、number等参数获取RtSdk的加入参数。先调用initWithGensee,响应为Callback的onInited。 其参数就是RtSdk需要使用的参数。
4.1.1initWithGensee(InitParam p) 直播参数初始化
调用说明:InitParam设置如下:
InitParam p = new InitParam(); //domain,必填项,如:demo.gensee.com p.setDomain(""); //编号(直播间号)必填项,如:93857580,与liveId至少填一个 p.setNumber(""); //直播(课堂)id,必填项,与编号至少填一个 p.setLiveId(""); //站点认证帐号,根据情况可以填"" p.setLoginAccount(""); //站点认证密码,根据情况可以填"" p.setLoginPwd(""); //昵称,供显示用 p.setNickName(""); //加入口令,没有则填"" p.setJoinPwd(""); //站点类型ServiceType.WEBCAST 直播webcast站点类型, // ServiceType.TRAINING 培训 training站点类型 p.setServiceType(ServiceType.TRAINING);
相关的参数可以参照下图:
直播
Traning:
调用响应:Callbak,即4.1.1或4.1.2。在得到rtsdk的加入参数即可以进入加入直播的流程。
4.2RtSdk
RtSdk包含了直播中的基本操作,加入、退出以及相关控制操作。聊天、音频、视频、投票等,可以按需要进行回调的设置。
4.2.1initWithParam(String logFileName, String joinParam,IRoomCallBack roomCallBack) 直播间初始化
RtSdk初始化,logFileName可以传入一个有效的文件路径或者传””,joinParam即为4.1.1响应的结果“joinParam”,roomCallBack是接收直播(课堂)流程状态的必需参数,由app自行实现。
调用结果由roomCallBack的onInit(4.2.1)返回,app处理其结果,若结果是调用成功,可以继续调用join(5.2.2)。
4.2.2initWithLaunchCode(String logFileName, String launchCode,IRoomCallBack roomCallBack) 直播间初始化
RtSdk 初始化,使用于网页启动时候调用。logFileName logFileName可以传入一个有效的文件路径或者传””, launchCode为网页传过来的一个字符串。样例:
6170693d687474703a2f2f64656d6f2e67656e7365652e636f6d2f636c69656e746170692f6170696368616e6e656c0a65767449443d36343334376435313232653834366363623361643537353739323962623162320a7573657249443d343038363131320a7369746549443d330a757064617465526f6f743d0a70726f647563744e616d653d436173744c696e650a70726f647563744c616e673d7a685f434e3b0a
响应流程同5.2.1。
4.2.3join(OnTaskRet taskRet) 加入直播间
加入直播(课堂)。一般在rtsdk初始化(5.2.1)成功后再调用。app响应为onRoomJoin (4.2.2),若结果是加入成功,那么各个模块如音频、视频、投票、插播、桌面共享等会相应地加载,且相关的状态和控制操作将在各自的回调里面通知,正式开启了直播的所有交互。如果失败则无后续响应。taskRet可以传入null,也可以实现之。
4.2.4leave(boolean isClose, OnTaskRet taskRet) 退出直播间
退出直播(课堂)。加入直播(课堂)成功后退出时调用,isClose(true)是代表结束整个直播(课堂)只有组织者有这样的结束权限,其他参与者只能够退出而不能结束,因此非组织者只能传入false,组织者用户可根据实际情况“结束”或“仅退出”。
响应为4.2.3,得到4.2.3后可以进行一些数据清理,对象释放。如RtSdk的release。便于下次加入。
注:直播(课堂)里面的相关操作接口均应该在加入与退出之间进行,其他时间均视为无效。
4.2.5release(OnTaskRet taskRet) 销毁本地直播间资源
释放对象,销毁本次加入创建的相关数据。一般在onRoomLeave回调里面在调用,app也可以选择一个适当的时机调用。taskRet响应后说明释放完成。调用如下:
// 释放房间实例,onTask响应之后才能重新加入
rtSdk.release(new OnTaskRet() { @Override public void onTask(boolean ret, int id, String desc) { // 房间从init-join-leave-release 到此结束 toast("释放完成,你可以重新加入"); // app应该在此时关闭界面,至于触发退出到响应执行到此的时间间隔,app可//以做一个对话框来增加交互的友好性 } });
4.2.6getAllUsers()获取用户列表
获取用户列表。RtSdk简单维护了用户列表,app可以在加入成功后取得该列表,用户加入、退出、状态变更会同步到该列表中。app也可以自行维护用户列表,参考4.2.6、4.2.7、4.2.8。
4.2.7getUserById(long userId) 获取用户
获取userId对应的用户信息。
4.2.8getSelfUserInfo()获取个人用户信息
获取当前用户的用户信息。需要加入成功后获取有效。
4.2.9roomHandup(String data, OnTaskRet taskRet) 直播间举手
举手操作。当前客户端举手,data没有实际意义,传入”” 就行。其他客户端响应为4.2.15。
4.2.10roomHanddown(boolean isAll, OnTaskRet taskRet) 直播间取消举手
取消举手。isAll为false时仅当前客户端的举手状态,isAll为true时将会取消直播间(课堂)的所有举手状态。
4.2.11setVideoCallBack(IVideoCallBack videoCallBack) 设置视频回调句柄
设置视频回调,一般在join之前设置。设置以后一旦有视频相关的消息通知就会回调给app,app可以做相应的处理。具体的回调参考IVideoCallBack。
4.2.12setLocalVideoView(ILocalVideoView localVideoView) 设置本地视频采集的UI
设置本地视频采集的UI句柄localVideoView。如果只做观看端,请忽略掉该接口,如果需要进行视频交流,一定得调用并传递一个LocalVideoViewEx。
4.2.13displayVideo(long userId,OnTaskRet onTaskRet) 观看某用户视频
观看userId的视频。当userId的视频(摄像头)打开以后,所有客户端包括本客户端可以观看它(useId)的视频数据。不调用观看,是不会显示该用户的视频的。
4.2.14unDisplayVideo(long userId, OnTaskRet onTaskRet) 取消观看某用户视频
取消对userId视频的观看,服务端不发送userId的视频数据,本质上减少视频数据的网络流量,与displayVideo成对调用。
4.2.15setAsCallBack(IAsCallBack asCallBack) 设置桌面共享回调句柄
设置桌面共享回调。一般在join之前调用。若有与桌面共享相关的消息,则会通过回调通知app,app根据自身功能处理回调。详情参考IAsCallBack。
4.2.16setLodCallBack(ILodCallBack lodCallBack) 设置插播(媒体共享)回调句柄
设置插播回调,一般在join之前调用。若有与插播相关的消息,则会通过回调通知app,app自行处理。详情参考ILodCallBack。
4.2.17setAudioCallback(IAudioCallBack audioCallBack) 设置音频回调句柄
设置音频回调,一般在join之前调用。当有音频相关的消息时,sdk通过回调通知app,app自行处理。详情参考IAudioCallBack。
4.2.18audioOpenMic(OnTaskRet taskRet)打开设备mic
打开本客户端的音频设备mic。一种情况是本客户端需要进行语音交流时调用打开mic;另一种情况是被要求打开,如直播中被组织者请求打开mic的时候需要本客户端调用该函数来打开mic。
4.2.19audioCloseMic(OnTaskRet taskRet)关闭设备mic
关闭本客户端的音频设备mic,和openSelfAudio成对调用,客户端自身关闭或被请求关闭的时候调用。与audioOpenMic成对调用。
如:
public void onClick(View v) { if (isMicOpened) { //调用返回基本上为true,要通过onTaskRet来判断最终结果 if (!rtSdk.audioCloseMic(new OnTaskRet() { @Override public void onTask(boolean ret, int id, String desc) { if (ret) { isMicOpened = false; toast("关闭mic成功"); } else { toast("关闭mic失败"); } } })) { toast("关闭mic失败"); } } else { if (!rtSdk.audioOpenMic(new OnTaskRet() { @Override public void onTask(boolean ret, int id, String desc) { if (ret) { isMicOpened = true; toast("打开mic成功"); } else { toast("打开mic失败"); } } })) { toast("打开mic失败"); } }
4.2.20audioOpenSpeaker(OnTaskRet taskRet)打开设备扬声器
打开当前设备的扬声器,sdk默认是开启扬声器的。如果用户要调节音量,由app自行通过android sdk相关api来控制媒体音量。由taskRet返回真正操作结果。
4.2.21audioCloseSpeaker(OnTaskRet taskRet)关闭扬声器
关闭当前设备的扬声器。与打开对应,一开一关,由taskRet返回真正操作结果。
如:
public void onClick(View v) { if (isSpeekerOpened) { // 关闭扬声器 调用返回基本上为true,要通过onTaskRet来判断最终结果 if (!rtSdk.audioCloseSpeaker(new OnTaskRet() { @Override public void onTask(boolean ret, int id, String desc) { if (ret) { isSpeekerOpened = false; toast("关闭扬声器成功"); } else { toast("关闭扬声器失败"); } } })) { toast("关闭扬声器失败"); } } else { // 打开扬声器 if (!rtSdk.audioOpenSpeaker(new OnTaskRet() { @Override public void onTask(boolean ret, int id, String desc) { if (ret) { isSpeekerOpened = true; toast("打开扬声器成功"); } else { toast("打开扬声器失败"); } } })) { toast("打开扬声器失败"); } } }
4.2.22openUserAudio(long userId, OnTaskRet taskRet) 打开用户音频
请求打开userId对应用户的音频,即音频设备mic。
4.2.23closeUserAudio(long userId, OnTaskRet taskRet) 关闭用户音频
请求关闭userId对应用户的音频,即音频设备mic。
4.2.24videoOpenCamera(OnTaskRet taskRet)打开本地摄像头
打开本地相机进行视频采集,一般由本客户端主动调用或者组织者要求打开的时候调用,两种情况都需要客户端调用videoOpenCamera来进行视频采集,前提是LocalVideoViewEx已经设置好。
4.2.25videoCloseCamera(OnTaskRet taskRet)关闭本地摄像头
关闭相机停止视频采集,与videoOpenCamera同样的两种情况下都需要调用videoCloseCamera来关闭视频。返回值基本上为true,要根据taskRet来准确判断操作的结果,与videoOpenCamera成对调用。
如:
public void onClick(View v) { if (isVideoOpened) { if (!rtSdk.videoCloseCamera(new OnTaskRet() { @Override public void onTask(boolean ret, int id, String desc) { if (ret) { toast("关闭本地视频成功"); isVideoOpened = false; } else { toast("关闭本地视频失败"); } } })) { toast("关闭本地视频失败"); } } else { if (!rtSdk.videoOpenCamera(new OnTaskRet() { @Override public void onTask(boolean ret, int id, String desc) { if (ret) { isVideoOpened = true; toast("打开本地视频成功"); } else { toast("打开本地视频失败"); } } })) { toast("打开本地视频失败"); } } }
4.2.26videoActive(long userId, boolean isActive, OnTaskRet taskRet)设置直播视频
在直播(webcast)中用户视频打开的情况下,可以将该用户设置为直播视频此时isActive传值true,相反,取消直播视频传false。
在training中,如果老师上讲台打开视频的时候将老师的视频进行active作为直播视频,此时isActive传值是true;当老师关闭视频的时候,应当取消直播视频,此时isActive传值为false。
4.2.27setChatCallback(IChatCallBack chatCallBack)设置聊天回调
设置聊天回调。设置后sdk收到聊天消息后会以回调通知app新消息。详情参考IChatCallBack。
4.2.28chatWithPublic(ChatMsg msg, OnTaskRet taskRet)发送公共聊天消息
发送公共聊天消息,房间里面所有人都能收到。chatText(ChatEditText.getChatText())为要发送的文本消息内容,richText(ChatEditText.getRichText())为要发送的富文本消息内容。如下构造一个聊天消息:
String msgId = UUID.randomUUID().toString();//消息id,即加上uuid
//公聊消息msgId,chatText,richText都不为空才有效
ChatMsg msg = new ChatMsg(chatText , richText , ChatMsg.CHAT_MSG_TYPE_PUBLIC,msgId);
注:聊天输入与显示需要添加聊天资源库RTRoutineLib,并在聊天消息要显示或输入前初始化聊天资源:ChatResource.initChatResource(Context context),调用一次即可。
4.2.29chatWithPersion(ChatMsg msg,OnTaskRet taskRet)发送私人聊天消息
向指定用户发送私人消息。chatText(ChatEditText.getChatText())为要发送的文本消息内容,richText(ChatEditText.getRichText())为要发送的富文本消息内容。userId接收消息的用户Id。
String msgId = UUID.randomUUID().toString();//消息id,即加上uuid即可
//私聊消息msgId,chatText,richText都不为空且接收人id正确才有效
ChatMsg msg = new ChatMsg(chatText,richText,ChatMsg.CHAT_MSG_TYPE_PRIVATE,msgId);
msg.setReceiverId(userId);//接收人的用户id
注:聊天输入与显示需要添加聊天资源库RTRoutineLib,并在聊天消息要显示或输入前初始化聊天资源:ChatResource.initChatResource(Context context),调用一次即可
4.2.30setVoteCallback(IVoteCallBack voteCallBack)设置投票、试卷回调句柄
设置投票调查(试卷)回调。设置后sdk会将投票调查(试卷)相关的消息以回调通知app,app自行处理相关回调事件。
4.2.31voteAdd(VoteGroup voteGroup, final OnTaskRet taskRet)添加一个投票
添加一个投票问卷(试卷),其他客户端则会响应4.8.2。
4.2.32voteDel(String strVoteID, OnTaskRet taskRet)删除一个投票
删除一个投票调查,其他客户端则响应4.8.3。
4.2.33votePublish(String strVoteID, OnTaskRet taskRet)发布投票
发布投票。答题开始,其他客户端响应4.8.4。
4.2.34votePublishResult(String strVoteID, OnTaskRet taskRet)发布投票结果
发布投票结果。结果公布,其他客户端响应4.8.5。
4.2.35voteSubmit(VoteGroup voteGroup, OnTaskRet taskRet)提交(参与)投票
提交答案。完成投票问卷或试卷的时候提交,组织者或老师会响应4.8.6。
4.2.36voteDeadline(String strID, OnTaskRet taskRet)终止投票
终止答题。答题时间到,所有答题的客户端会响应4.8.7,app终止答题。
4.2.37votePostUrl(String strURL, OnTaskRet taskRet)第三方投票
发起第三方投票。strURL为第三方投票地址。答题客户端响应4.8.8。
4.2.38setDocView(GSDocView docView)设置文档显示的UI
设置文档显示UI,如果需要显示文档,则将docView传递给sdk,app可以自由布局和控制其大小。
4.2.39setGSDocViewGx(GSDocViewGx docView) 设置支持ppt动画的显示文档的UI
设置支持ppt动画的文档显示控件,与setDocView不同的是能够支持ppt动画。往后将逐步废除GSDocView的使用,而采用新的GSDocViewGx。
4.2.40getDocModule()获取文档模块操作句柄
获取文档通信句柄,返回IDocModule句柄。App可以使用该句柄来操作文档,如翻页、同步、拍照上传等。
4.2.41setQACallback(IQACallback qaCallback)设置问答回调
可以根据需要设置问答回调,使得app可以接收新提问、提问回复、提问发布等。
4.2.42qaAddQuestion(String question, OnTaskRet taskRet) QA提问
提问,即发送一个问题给组织者,由组织者分配问题的回复。question为提出的问题。taskRet可传空,需要监听发送结果则需要一个有效的实例。
4.2.43qaAddAnswer(String questId, String answer, OnTaskRet taskRet) QA回复
提问回复,当有人提问后,组织者对提问进行文字回复或者文字解答,即发送回复。questId为问题id,answer为回复内容。taskRet可传空,需要监听发送结果则传有效实例。
4.2.44qaPublish(String questId,boolean isPublish,OnTaskRet taskRet) QA发布
发布提问,当有人提问后,组织者把问题发布给web用户。questId 问题id,isPublish 是否发布。taskRet可传空,需要监听执行结果则传有效实例。
4.2.45qaPush2Panelist(String questId, OnTaskRet taskRet) QA推送嘉宾
推送给嘉宾,当有人提问后,组织者把问题推送给嘉宾。questId 问题id。taskRet可传空,需要监听执行结果则传有效实例。
4.2.46qaAssign2Panelist(String questId, long userId, OnTaskRet taskRet) QA指派给嘉宾
指派给嘉宾,当有人提问后,组织者把问题指派给嘉宾进行回复。questId 问题id,userId 为被指派嘉宾的用户id,taskRet可传空,需要监听执行结果则传有效实例。
4.2.47qaSetReplyByVoice(String questId, OnTaskRet taskRet) 将提问置为语音回复
将提问置为语音回复,当有人提问后,回复者可以将该问题设置为语音回复。questId 问题id,taskRet可传空,需要监听执行结果则传有效实例。
4.2.48qaNowReplyingByVoice(String questId, boolean isNowReplying,OnTaskRet taskRet) 将问题置为语音回复状态
将问题置为语音回复状态,回复者在语音回复的时候设置回复状态。questId问题id,isNowReplying true为“正在进行语音回复”,false 为“取消语音回复”即回复完成,taskRet可传空,需要监听执行结果则传有效实例。
4.2.49qaNowReplyingByText(String questId, int duration, OnTaskRet taskRet) 将问题置为正在进行文本回复
将问题置为正在进行文本回复,回复者在文字回复的时候设置回复状态。questId问题id,duration回复时间,一般客户端不使用这个值,askRet可传空,需要监听执行结果则传有效实例。
4.2.50qaSetState(boolean isAutoPushQuestion, boolean isAutoPublishQuestion, boolean isQAEnable, OnTaskRet taskRet) 问答权限通知
组织者对问答操作的控制,isAutoPushQuestion自动推送问答,组织者需要关注,如果为true则自动将收到的提问进行推送,否则在适当时间推送,isAutoPublishQuestion 自动发布问答,isQAEnable 提问允许 true, 允许提问,false 禁止提问。组织者调用后,其他客户端响应IQACallback的onQaSettingUpdate函数。
注:isQAEnable为false的时候,app要禁止用户提问,当为true的时候允许用户提问。
4.2.51loadLibrarys() 加载动态库(提高加入速度)
优先加载动态库,在程序启动的适当时机优先加载动态库,可以提高直播的加入速度。
4.2.52roomRollcall(int duration, OnTaskRet taskRet) 发起点名
本接口针对老师或组织者的,用于向直播间发起点名。duration为点名时间,即duration秒后结束本次点名。
4.2.53roomRollcallAck(OnTaskRet taskRet) 点名应答
当收到组织者或老师发起的点名时候,在点名的时间范围内进行应答,超时后请不要再应答。
将被认为没有答到。
4.2.54roomSaveRollcallResult(OnTaskRet taskRet) 发布点名统计
本接口针对老师或组织者的,点名完成后发布的点名统计。
4.2.55roomPublish(byte state, OnTaskRet taskRet) 直播控制
控制类型:开启直播、暂停直播、恢复直播、停止直播。
例如:开启直播 State.S_RUNNING(恢复直播)
暂停直播State.S_PAUSED
停止直播 State.S_STOPPED
//开启/恢复直播
rtSdk.roomPublish(State.S_RUNNING.getValue(), null);
4.2.56roomRecord(byte state, OnTaskRet taskRet) 录制控制
控制类型:开启录制、暂停录制、恢复录制、停止录制。
例如:开启录制 State.S_RUNNING (恢复录制)
暂停录制State.S_PAUSED
停止录制 State.S_STOPPED
//开启/恢复录制
rtSdk.roomRecord (State.S_RUNNING.getValue(), null)
4.2.57roomRename(long userId, String newName, OnTaskRet taskRet)修改用户名
修改用户名,userId为对应要修改的,一般情况下app提供修改自己用户名称的功能。
4.2.58roomGrantHost(long userId, OnTaskRet taskRet) 设置组织者(老师)
将用户(userId)设置(授权)为组织者或老师,不适用于小班课。
4.2.59roomGrantPresentor(long userId, OnTaskRet taskRet)设置主讲
将用户(userId)设置为主讲,不适用于小班课。
4.2.60roomPushUserCount2Web(boolean isPush, OnTaskRet taskRet)向web用户推送在线人数
调用后可以让web加入的用户显示在线人数。
4.2.61roomPushUserList2Web(boolean isPush, OnTaskRet taskRet)向web用户推送用户列表
调用后可以让web加入的用户显示用来列表。
4.2.62roomNotifyBroadcastMsg(String msg, boolean isNeedCache,OnTaskRet taskRet) 发送广播消息
发送系统广播消息,msg 消息内容,isNeedCache 是否缓存。缓存,消息发后加入的web用户会收到,不缓存收不到。
4.2.63roomSetData(String key, long value, OnTaskRet taskRet) training课堂席位、状态等控制
只用在training站点小班课当中,调用之后所有用户会响应onRoomData(String key,long value)。控制讲台、提问席、聊天等操作。其中key的取值定义在RTRoomDataKey当中:
String KEY_USER_ROSTRUM = "user.rostrum"; //讲台 String KEY_USER_ASKER = "user.asker"; //提问席1 String KEY_USER_ASKER_1 = "user.asker.1"; //提问席2 String KEY_USER_ASKER_2 = "user.asker.2"; //提问席2 String KEY_USER_ASKER_3 = "user.asker.3"; //提问席3 String KEY_CLASS_MODE = "class.mode"; //班级类别(小班)一般用不着 String KEY_CHAT_MODE = "chat.mode"; //聊天模式 学生一般用不着
例:key为KEY_USER_ROSTRUM 代表讲台操作,对应的value 不为0则表示用户id为value的用户上讲台,为0则表示此前讲台上的用户下讲台。同理提问席1-4以此类推。
4.2.64roomEjectUser (long userId, boolean isForbidIp, OnTaskRet taskRet)踢人
直播间或课堂踢人操作,userId为被踢人id。isForbidIp true 代表踢人且封禁ip,封禁后不能再次加入,false 普通踢人,可再次加入。
4.2.65getIDCs() 优选网络选择列表
做网络优选功能使用,取到可以选择的列表IDCInfo[],然后进行界面上的展示。
IDCInfo {
private String id; //网络id
private String name; //网络名称
}
4.2.66getCurIDC()获取当前正在使用的网络id
做网络优选列表时候匹配当前使用的网络,只返回正在使用的网络id。
4.2.67setCurIDC(String idcId, OnTaskRet taskRet)设置新的网络id
选择新的网络后进行调用,idcId请保证是从getIDCs里面取到的idcId且有效。taskRet可为null。设置新的网络后会重连(onRoomReconecting)
4.2.68roomOpenUserVideo(long userId,OnTaskRet taskRet)打开他人视频命令
一般组织者或老师才具备向他人发出打开他人视频的命令,和openUserAudio都属于直播间内的命令。注意仅向他人发出这个命令,需要他人具备能打开的条件。
A打开B的视频:
-
B需要事先设置localvideoview给sdk,随时待命被打开;
-
A 调用roomOpenUserVideo(B.getId(),null);
-
B会响应onVideoCameraOpened onVideoJoin(B)
-
A同时也会响应 onVideoJoin(B)
-
A在4的条件下订阅B的视频(displayVideo(B.getId(),null)),A用GSVideoView就能看到B的视频。
4.2.69roomCloseUserVideo(long userId,OnTaskRet taskRet)关闭他人视频命令
同样是组织者或老师才具备调用条件或者其他特殊场景时调用。和roomOpenUserVideo是对应关系,需要在他人视频已经打开的情况下操作。
4.3GSVideoView
GSVideoView是视频显示的UI,app可以通过布局文件布局,也可以用代码创建。也可以任意改变其大小。可以显示的内容有:视频、插播视频、桌面共享。其中画面会自动适应其大小显示。
4.3.1setDefColor(int color)视频显示设置
设置视频底色,其中默认是黑色。
4.3.2onReceiveFrame(byte[] data, int width, int height)视频显示UI接收数据
接收并显示相关数据data,width为视频宽,height为视频高,这些参数都由IVideoCallBack和IAsCallBack回调给出,app只需将数据往GSVideoView的该函数填入即可。
4.3.3renderDefault()视频UI清屏
清除视频画面使用的,一般app希望清除视频最后一帧的时候可以调用,而有的app则期望保留最后一帧。因此清除画面后视频会显示为5.3.1所给的颜色。
4.3.4setRenderMode(RenderMode renderMode)设置视频显示模式
设置视频显示模式:
enum RenderMode{
RM_FILL_XY, //填充显示即充满窗口
RM_ADPT_XY, //适应窗口显示
RM_CENTER, //居中显示,这种只有视频分辨率小于窗口本身的时候设置有效果
RM_FILL_CENTER_CROP //以小边放大或缩小 并裁剪后充满窗口(一般用将不同分辨率统一成一定分辨率的情况)
}
4.3.5getRenderMode()获取视频显示模式
和setRenderMode(RenderMode renderMode)配合使用。
4.3.6renderDrawble(Bitmap defBitmap,boolean isFillXY)渲染默认图片
一般为默认图片即初始图片的渲染,一旦有真正的视频渲染后失效。
4.3.7getVideoWidth()获取视频宽度
返回视频宽度。
4.3.8getVideoHeight()获取视频高度
返回视频高度。
4.4 GSDocViewGx
GSDocViewGx是用来显示文档的。默认为观看模式。可以在布局文件中使用,也可以在代码中创建。最后将其传递给SDK。若需要做文档标注,如画直线、矩形、自由曲线等,就要调用GSDocViewGx的相关api来切换操作类型;若只是接收其他客户端的文档显示,则只要将其传递给SDK即可。文档的显示方式(内容与view的适应)可根据需要选取或app自由变换,已达到想要的显示效果。注意GSDocViewGx与GSVideoView(SurfaceView)重叠(画中画)显示会有屏幕共用的现象,因此请尽量避免两个重叠显示的设计,若GSVideoView显示的时候总在GSDocViewGx Z方向上方显示的话,这种画中画是可以支持的。
4.4.1setPaintColor(int color)设置文档画笔工具的颜色
设置文档即将要使用的画笔颜色,颜色为argb位序。
4.4.2setStrokeWidth(LINE_SIZE width)设置文档画笔工具的线粗
设置文档即将使用的画笔粗细。
其中enum LINE_SIZE {
L, //1像素
M, //3 像素
H; //6像素
}
4.4.3setAnnoMakeType(DrawMode mode)设置即将开始的文档标注类型
设置文档的标注类型。注意文档标注只有组织者(直播)、嘉宾(直播)、老师(training)、助教(training)这些角色或经批准的其他角色才有权限进行操作。
其中enum DrawMode { PEN, //画笔画图模式 ERASE, //橡皮擦模式 ERASE_ALL, //全部清除 DOC_TIP, //文档指示(圆圈或鼠标箭头) RECT, //矩形 LINE, //直线 HLIGHT; //荧光笔 }
4.4.4setCtrlMode(CtrlMode mode)设置文档UI的控制模式
设置文档操作控制模式。控制有两种,“观看”和“编辑”。默认为观看模式,可以缩放和拖动文档。编辑则是指进行标注的添加修改,调用setAnnoMakeType会自动切换为编辑模式,当标注完成或角色失去标注的功能后需要调用setCtrlMode(CtrlMode.SIGHT)恢复到观看模式。
enum CtrlMode { EDIT, //编辑模式,拖拉无效,标注有效 SIGHT //观看模式,拖拉有效,标注无效 }
4.4.5setOnDocViewClickedListener(OnDocViewEventListener l)
设置文档view的事件监听,具体的事件参考OnDocViewEventListener。
4.4.6undo(long userId)文档注释撤销
撤销自身添加的标注。
4.4.7showFillView()文档内容充满docview显示
文档显示方式,文档内容填充满文档view。如果文档长宽比例和文档view长宽比例不一致的情况会有不同程度的拉伸。
4.4.8showAdaptView()文档内容适应docview显示
文档显示方式,文档内容会根据文档view的大小来适合显示,这种方式能够保证内容等比拉伸,而不会变形。
4.4.9showSourceScall()文档内容原始大小显示
文档显示方式,文档内容按照原始大小显示,如果内容过大,则只显示部分,可以随意拖动。
4.4.10showAdaptViewWidth()文档内容适应docview宽度显示
文档显示方式,文档内容充满文档view的宽度显示,如果高度比过大则可上下拖动,否则Y方向居中显示。
4.4.11showAdaptViewHeight()文档内容适应docview高度显示
文档显示方式,文档内容充满文档view的高度显示,如果宽度比过大则可左右拖动,否则X方向居中显示。
4.4.12setBackgroundColor(int color)设置文档背景色
文档背景色设置,在文档不足的地方(即文档内容与docview之间的地方)显示。color为argb位序,如果是定义资源文件中则需要通过转换,不能传入resId。
4.4.13forbidZoomGestrue(boolean isFobid)手势禁用
如果不需要文档view的缩放或拖拽,可以禁用掉手势。
4.5IDocModule 文档操作句柄
SDK里面文档模块的通信操作句柄(RtSdk 的getDocModule()获取),加入直播(课堂)成功后可以使用。可以得到当前打开的文档和已经打开的文档,并可以切换文档的显示。
PduDoc:代表一个ppt、word、png、pdf等任意类型的文档,主要调用函数如下:
- getDocName() //返回文档的名称
- getDocType() //返回文档类型
- getPageCount() //返回文档总页数
- getPages() //返回文档内所有页的信息列表(List<PduPage>)
- getCurPage() //返回这个文档正在显示的那一页(PduPage),默认是第一页。
- getCurrentPageIndex() //返回这个文档当前显示页的页码
- getNextPage() //返回当前页对应的下一页(PduPage) ,用于翻页gotoPage,返回null说明当前是最后一页(此时可以找下一个文档PduDoc的当前页并翻到该页)
- getPrePage() //返回当前页对应的上一页(PduPage),用于翻页gotoPage,返回null说明当前是第一页
PduPage:代表一个文档中一页。getPageName()返回该页的名称。
4.5.1getDocs()获取文档列表
获取当前已经打开的文档。这个的作用一般是做界面使用。返回List<PduDoc>。
4.5.2getCurrentDoc() 获取当前显示的文档
获取当前正在显示的文档。用处一般是显示文档标题。返回PduDoc。
4.5.3isCurrentDoc(PduDoc doc)
判断doc是否为当前正在显示的文档。
4.5.4gotoPage(PduPage page,boolean syn,OnTaskRet taskRet)翻页
切换文档。page为要切换到的文档页,即为任意文档的任何一页。syn 为true会同步切换其他客户端,即直播间里面其他人会一起翻页,false只在本地切换显示,其他人不会一起翻页。syn注意,一般是有权限(老师、组织者、主讲)的操作者才能传true,例如traning里面上讲台的人需要同步自己的当前文档。
- 当前文档取出对应的下一页,翻到下一页page = currentDoc.getNextPage()。
- 当前文档取出对应的上一页,翻到上一页page = currentDoc.getPrePage()。
4.5.5openDoc(String name, Bitmap bitmap)打开、上传文档
打开文档。主要做拍照、相册上传使用的,name为文档名称如 xxx.拍照(1).jpeg(拍照:规则为userName + .拍照 + (拍照计数)+ .jpeg;相册:规则为文件原是名称包含扩展名),注意:图片的大小限制在512000个像素以内。
如果是老接口openDoc(String name, byte[] data, int w, int h)data为图片jpeg格式的数据,w为图片宽,h为图片高。
4.5.6synCurrentDoc()同步文档
同步文档。当得到做标注权限的时候调用。如training中插播完成、老师、助教上讲台。
4.5.7getPhotoCount()图片、照片计数
拍照计数。配合拍照上传使用。
4.6RtSimpleImpl
RtSimpleImpl是一个抽象类,实现了音、视频相关的回调,并将所有视频(直播视频、媒体共享(插播)视频、桌面共享)处理为一路视频。如果只做直播观看或听课的功能,那么这个是最佳选择,因为只需要简单的调用和实现就能够达到目的,参数也和RtSdk的一样。
即 :abstract class RtSimpleImpl implements IRoomCallBack, IVideoCallBack,
ILodCallBack, IAsCallBack, IAudioCallBack。除了音视频的其他回调通过RtSdk rtsdk = rtSimpleImpl.getRtSdk()后,用rtsdk进行设置,例如聊天:rtsdk.setChatCallback(chatCallback)。
4.6.1setVideoView(GSVideoView)设置视频显示的UI
设置显示视频的GSVideoView,布局大小可随意变更,显示内容和web是一样的。
4.6.2setDocView(GSDocView docView)设置文档显示的UI
设置文档显示UI。
4.6.3setGSDocViewGx(GSDocView docView) 设置支持ppt动画的文档显示控件
设置文档显示UI,支持ppt动画,3.1过后启用。
4.6.4join(String logFileName,String joinParam)加入直播间
加入直播(课堂),logFileName可以填为””, joinParam就是4.1.1响应的结果。可以重写RtSimpleImpl的onInit来确认加入状态。
4.6.5leave(boolean isClose)退出直播间
退出直播(课堂),isClose 为true 结束,false 仅离开退出。
4.6.6onVideoStart()视频开始,视频加载成功
视频开始播放,抽象函数。
4.6.7onVideoEnd()视频结束
视频停止播放,抽象函数。
4.6.8onGetContext()
获取appcontext,抽象函数。而且必须返回。
4.6.9RtSdk getRtSdk()获取RtSdk句柄
获取rtsdk句柄,可以做其他的操作。
4.7ChatEditText 聊天输入框
继承自EditText聊天输入框主要是针对聊天表情显示使用的,如果不需要聊天或不需要表情功能的请忽略。前提要加入表情资源库的引用且初始化聊天的表情资源。
4.7.1insertAvatar(String avatar, int resId)向输入框插入一个表情
在表情选择完成后,将表情字符串和资源id传入即可在输入框内显示,实例:
public void selectAvatar(String avatar, int resId) {
chatEditText.insert(avatar, resId);
}
4.8 MyTextViewEx 聊天消息富文本显示
继承自TextView,主要支持聊天表情的显示,如果不需要聊天或不需要表情功能的请忽略。前提要加入表情资源库的引用且初始化聊天的表情资源。
4.8.1setRichText(String richText)富文本显示
设置富文本消息内容,其中richText来自IChatCallback的响应,例如onChatWithPersion(UserInfo userInfo, String msg, String richText)。
4.9 GSLocalVideoView视频采集预览UI
这些view是为用户进行视频采集预览使用的。如果有打开摄像头的需求,这个view必须要用上,且要优先设置给Sdk。注意,如果targetSdkVeresion >= 23的情况下,app应当要在调用sdk加直播接口之前申请好视频录制相关权限(android.permission.CAMERA android.permission.RECORD_VIDEO)。
GSLocalVideoView 相对于LocalVideoViewEx的特性:
- 采集时可以做到美颜效果,同时多了美颜的开关函数
- 对设备要求更高,
- 内存占用要高
4.9.1doCameraSwitch切换前后摄像头
在视频打开的情况下,可以进行前后摄像头切换。
4.9.2setOrientation(int orientation)设置视频采集模式
默认是横屏采集,如果应用处于竖屏时设置相关的采集模式。
orientation取值:
ILocalVideoView.ORIENTATION_PORTRAIT //竖屏采集会裁剪(app竖屏),这种模式与gensee其他客户端配套使用时设置。宽比高要大
ILocalVideoView.ORIENTATION_LANDSCAPE //横屏采集(app横屏)
ILocalVideoView.ORIENTATION_PORTRAIT_UNCROP//竖屏采集不裁剪(app横屏),这种效果是宽比高要小。纯移动端发直播和观看的场景比较合适。
ILocalVideoView.ORIENTATION_PORTRAIT_9_16//竖屏采集裁剪9:16。采集时会将采集到的图像以中心为参考,最大化的裁剪成为9:16,app请保持竖屏采集,至于分辨率可以设置为640*480效果最好,最终图像是旋转之后采集成为360*640。(只有GSLocalVideoView支持此模式)
ILocalVideoView.ORIENTATION_PORTRAIT_16_9//横屏采集裁剪16:9。采集时会将采集到的图像以中心为参考,最大化的裁剪成为16:9,app请保持横屏采集,至于分辨率可以设置为640*480效果最好,最终图像是裁剪成为640*360。(只有GSLocalVideoView支持此模式)
4.9.3setVideoSize(int width,int height)设置采集分辨率
设置视频采集的分辨率。注意:若正在采集(视频已打开)的情况下,需要先videoCloseCamera之后再setVideoSize,接着videoOpenCamera 才有效。不要视图在视频已经打开的情况下随意setVideoSize;不同的设备采集的能力不一样,请根据实际情况选择合适的分辨率。
一般入参为320*240,640*480,1280*720,不同的设备实际的大小不一定是设置的大小。若需要,可通过setOnCameraInfoListener监听实际采集的尺寸。
4.9.4switchBeauty(boolean isOpen) 美颜切换
这个函数是美颜效果的开关切换,只有GSLocalVideoView才有这个函数。默认就是开美颜效果的。
4.10GenseeLog GenseeSDK日志工具
GenseeLog 是sdk中的日志工具类,其中包括日志的处理和上传。注意工具类能做的是sdk内部流程日志,至于app的日志以及crash的日志需要由app自行处理和收集。
4.10.1reportDiagonse(Context context, String desc,ServiceType serviceType)上传日志
该函数将sdk的日志上传到服务端。返回值是上传后日志的下载地址。已经有日志文件的情况下可以在任何时候进行上传
context:app context,日志的描述
desc:该日志的描述或表现描述
serviceType:和加入一样,webcast站点填写ServiceType.WEBCAST,training站点填写ServiceType.TRAINING
返回值:日志的下载路径
5代码实例
说明:这部分代码只供参考,具体还需要根据具体业务调整。
5.1Domain等参数初始化代码实例
InitParam p = new InitParam(); //domain p.setDomain("demo.gensee.com"); //编号(直播间号) p.setNumber("93857580"); //站点认证帐号,根据情况可以填"" p.setLoginAccount("站点认证帐号"); //站点认证密码,根据情况可以填"" p.setLoginPwd("站点认证密码"); //昵称,供显示用 p.setNickName("昵称"); //加入口令,没有则填"" p.setJoinPwd("加入口令"); //站点类型ServiceType.ST_CASTLINE 直播, //ServiceType.ST_MEETING 会议, //ServiceType.ST_TRAINING 培训 p.setServiceType(ServiceType.ST_TRAINING); p.setK(“你们的K值”);//启用第三方认证的时候必须有效,没启用时忽略 RtComp comp = new RtComp(getApplicationContext(),callback); comp.initWithGensee(p);
5.2响应处理
5.2.1RtComp.Callback onInited
// RtComp.Callback 响应,得到joinParam后进行rtsdk的初始化 @Override public void onInited(String joinParam) { //直播(课堂)初始化 rtSdk.initWithParam ("", joinParam, roomCalBack); }
5.2.2IRoomCallBack onInit
//直播(课堂)初始化响应
@Override public void onInit(boolean result) { RTLog.d(TAG, "OnInit = " + result); //this 是实现了各个callback的,因此以this作为参数 if (result) { rtSdk.setVideoCallBack(this); rtSdk.setAudioCallback(this); rtSdk.setLodCallBack(this); rtSdk.setChatCallback(this); rtSdk.setVoteCallback(this); rtSdk.setAsCallBack(this); //调用加入 rtSdk.join(new OnTaskRet() { @Override public void onTask(boolean ret, int id, String desc) { RTLog.i("join ret = " + ret); } }); } else { //加入失败 } }
5.2.3IVideoCallBack onVideoJoin
@Override public void onVideoJoin(UserInfo user) { if (user ! = null) { long userId = user.getId(); // 插播视频打开 if (UserInfo.LOD_USER_ID == userId) { rtSdk.displayVideo(userId, null); } } }
5.2.4IVideoCallBack onVideoJoin
@Override public void onVideoLeave(long userId) { // 插播视频关闭 if (UserInfo.LOD_USER_ID == userId) { rtSdk.unDisplayVideo(userId, null); } }
5.2.5IVideoCallBack onVideoDataRender
@Override public void onVideoDataRender(long userId, int width, int height, int frameFormat, float displayRatio, byte[] data) { //插播视频 If (UserInfo.LOD_USER_ID == userId){ videoViewLod.onReceiveFrame(data, width, height); } //用户视频 else { videoViewCast.onReceiveFrame(data, width, height); } }
5.2.6IAsCallBack onAsData
@Override public void onAsData(byte[] data, int width, int height) { //桌面共享 videoViewAs.onReceiveFrame(data, width, height); }
5.3RtSimpleImpl
/**
* 初始化一个RTSDK简单实现,重新定义一个类继承RtSimpleImpl也是可以的,
* 并实现其3个抽象函数,其中onGetContext必须要返回app context,音视频最佳选择。
* 注:这里是在onCreate中创建的simpleImpl,如果有屏幕变化引起simpleImpl 重新被* 创建需要自行处理;回调线程为非UI线程,更新ui请在UI线程中处理。
*/ simpleImpl = new RtSimpleImpl() { @Override public Context onGetContext() { return getBaseContext(); } @Override protected void onVideoStart() { GenseeLog.d(TAG, "onVideoStart"); } @Override protected void onVideoEnd() { GenseeLog.d(TAG, "onVideoEnd"); } /** * result true 表示加入房间(直播间、会议室、课堂)成功 */ @Override public void onRoomJoin(boolean result, UserInfo self) { super.onRoomJoin(result, self); GenseeLog.d(TAG, "onRoomJoin"); } /** * 直播状态 s.getValue() 0 默认直播未开始 1、直播中, 2、直播停止,3、直播暂停 */ @Override public void onRoomPublish(State s) { super.onRoomPublish(s); byte castState = s.getValue(); } };