Android 接口FAQ
1 共性问题
术语解释
使用场景 |
技术归属(通俗) |
App + APPSDK |
移动客户端 + 移动SDK |
App + webview |
移动客户端 + web(网页)网页链接 |
微信、QQ、浏览器打开直播地址 |
Web(网页)网页链接 |
电脑端 |
Pc客户端(通过启动加入的) PcWeb(网页直接观看的) |
苹果电脑端 |
Mac 客户端(通过启动加入的)MacWeb(网页直接观看的) |
Android、Ios G直播 |
移动客户端 |
1.1 Demo 的导入
Android Studio
如果import会有配置的问题出现,请自行移植工程,通过Android Studio创建一个新的工程,将demo(app)里面的src、res、libs、AndroidManifest.xml分别移植到工程当中,并同样移植对应的资源库resourceLib或libresource(library)就可以了。
1、对于动态库如果打包的时候so没有打进apk里面,请检查工程的配置或so所在的位置,如果不清楚可以百度一下:
2、如果出现了多引用,请删除掉工程中的和library里面相同的jar,例如:gensee_expression.jar
Eclipse
分别导入demo工程和配备的library(playerdemo:libresource,GSDemo(rt-vod):resourceLib)工程,library主要是做聊天资源的管理和初始化使用,当然正式的工程也需要引用这个library(不用聊天功能可忽略)。
如果导入出现classpath的错误,请检查build path:
1.2 Demo参数怎么填写,参数从哪里来?
Demo的参数包括直播和点播的参数,样子基本一样,但归属不一样,来源与站点后台,如果没有站点后台,请找公司接口人获得。所有的demo要的基本参数都是一样的,请参照下图进行填写,填写时请注意不要带入空格。
Webcast
Training
如果提示参数类型的错误,请对应的对照上图。
1.3 InitParam 参数如何设置?
InitParam就是demo使用的参数。
Webcast:参数对照
Training:参数对照
webcast点播:参数对照
training 点播(录制件):参数对照
1.4 站点登录密码和登录密码是什么?
当向Gensee 申请站点时候,分配的登录帐号,也即由销售人员给的站点认证帐号和认证密码。例如webcast站点 http://demo.gensee.com/webcast/
再例如training站点 http://demo.gensee.com/training/
强调一下,这些帐号和密码都是用户自己使用和管理的,我们无权也无法得知这些帐号密码,请妥善保存并在适当的时候使用,不要再找我们的开发人员索要这些信息。
1.5 G直播源码是否提供?
G直播是本公司的移动产品,不以任何形式的理由,向外提供任何G直播源码,更不会对外做G直播的技术支持和维护。 对于视觉、图标一类的资源也不会向外提供,APP开发请自行设计属于自己的界面以及相应的交互功能。
1.6 监听或回调函数为什么没有回调?
有两种可能:
- 没有设置回调的句柄,例如聊天消息的回调,没有调用rtsdk.setChatCallbck(chatcallback)就没有设置chatcallback给sdk,因此不会回调。
- 回调里面操作了界面,因为sdk使用的不是主线程(ui线程),因此不要在回调函数里面操作界面,这里说的界面除了android平台的控件以外,还包括对话框、Toast这些通知,一些开发者往往视图在回调里面直接用Toast来验证是否回调,这是错误的。正确的做法是将toast post到主线程或仅打印日志进行验证。在回调里面直接擦操作ui的后果是某些设备上crash,有些设备不会crash,但不会回调出来。
1.7 sdk的日志以及G直播的日志在哪里?
日志路径:
Android:/sdcard/gensee/log目录
1. 通过手机文件管理软件(系统都自带)进行分享或发送到qq,app-xxx.log
2. 360等手机助手工具
Ios: /沙盒/Document/Diagnosis目录
1.8 运行demo时报ClassNotFoundException错误是什么原因?
这种原因是classpath不正确的缘故,也就是编译的时候能通过,但是打包apk的时候对应的jar没有压缩到apk,apk安装之后运行就找不到相应的类。
1. 检查classpath
如果是eclipse,如果没有下图中标出的1
那么需要将jar add to build path,然后勾选下图中的2,再打包运行(run)。
1.9 SDK的加入限制有哪些?
(1)Player SDK(仅可用普通参加者或学生客户端口令加入)加入直播的条件:
- 组织者已经开启了直播或讲课,如果没有直播或没有讲课,将一直是直播未开始。
- 并发足够(点数足够),如果人数已满,则无法加入
(2)RtSDK
RtSDK 如果是组织者或嘉宾(助教),那么随时可以加入,等同于PC客户端。
RtSDK 普通参加者受后台配置影响:
启用的话,随时可以加入,如果没有启用,则需要组织者先加入后才能加入,否则都是直播未开始。
1.10 SDK用户互踢规则是什么?
前提:用户id相同,再以级别为依据,平级互踢,高级踢低级,低级不能替高级。组织者不能被踢(只能抢夺)。
整个系统用户自上而下的高到低级别表:
组织者、老师用户(客户端、RtSDK) |
客户端(pc、mac)、RtSDK加入的用户 |
网页、PlayerSDK 加入的用户 |
客户端(pc、mac)和RtSDK加入的用户级别一样。
网页(手机、mac、pc)、PlayerSDK加入的用户级别一样。
- 平级互踢
例如一个学生或普通参与者都是客户端上加入会出现互踢,分别在客户端或通过RtSDK加入会互踢。
- 高级踢出低级
例如用户先在网页或player SDK加入,后又通过客户端或rtsdk加入,那么会出现网页被踢,反之用户已经加入。
1.11 聊天消息显示成了html(网页代码)<span>标签的样式怎么办?
聊天消息有富文本和纯文本。其中富文本就是html组织格式,也就是要显示聊天表情用的。纯文本是只包含文字,没有任何样式代码。
- 一般情况下都是用SDK里面封装好的MyTextView(继承TextView)来显示富文本,只需要布局好,通过setRichText就可以正常显示出聊天消息,切不可以用原有的setText设置富文本内容。
错误的例子:
- 其次是没有初始化表情资源,部分开发者比较粗心,不添加表情资源的library,即便添加了也不初始化。使用rtsdk要添加和demo一起的rtroutinelib library调用ChatResource. initChatResource(Context context)初始化;使用player sdk要添加libresource 调用ExpressionResource.initExpressionResource(Context context)。如果合用rtsdk和playersdk只需要后者即可。
1.12 SDK举手了怎样取消(放下手)?
不论是RtSDK还是PlayerSDK,都有举手的功能接口,加入直播间后随时可以调用进入举手状态。老师端都没有单独取消其中一个举手状态的控制功能(接口)。而且举手仅仅是一个状态,与其他音视频没有任何必然的联系,可以随意组合。
总的思路都是自己举,自己放。
例如A用户举手,自举手开始计时,1分钟后调用放手后变成非举手状态。
上述流程的实现可以参考网页或PlayerDemo当中的实现效果。
- Player SDK相关接口
Player:handUp(boolean isHand,OnTaskRet taskRet),isHand true举手,false 取消举手。
需要记录举手状态
- RtSDK 相关接口
RtSDK:roomHandup(String data, OnTaskRet taskRet) 举手
roomHanddown(boolean isAll, OnTaskRet taskRet)取消举手,isAll非组织者传false
IRoomCallBack:onRoomHandup(long userId, String data) 举手通知,userId为举手人的id
onRoomHanddown(long userId)取消举手通知
1.13 GSDocViewGx加载失败原因
- 由于需要动态库,在开发工具中预览布局可能会有错误报告,开发工具本身就没有加载动态库,所以请忽略。
- 运行时候加载失败,如下,主要是动态库缺失或不统一。
at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang.System.loadLibrary(System.java:535) at com.gensee.swf.SwfPlayer.loadLib(SwfPlayer.java:86) at com.gensee.swf.SwfPlayer.<clinit>(SwfPlayer.java:76) at com.gensee.swf.GLSwfRender.init(GLSwfRender.java:113) at com.gensee.swf.GLSwfRender.<init>(GLSwfRender.java:25) at com.gensee.view.GSDocViewEx.init(GSDocViewEx.java:54)
检查libs下面各架构中是否都包含了文档相关的动态库:
libandroid-swfplayer.so libSwfView.so libuctinyxml.so libucjpeg.so
并遵循2.5的规则。
2、Player SDK(直播观看相关问题)
2.1 Player SDK 能否修改聊天界面(问答界面、投票界面)?
Player SDK 为初级开发者或初级用户提供了一个聊天整合界面、问答整合界面、投票整合界面,提供的是什么样子就是什么样子,不做任何定制,不提供任何修改的技术支持,不要以“只改一点点什么地方”的理由来要求我们修改,再明确一下:既然不改,一点都不会改的。
这些界面能满足部分用户,但不可能满足所有用户,因为每个用户的设计和交互不一样。如果这几个界面能满足贵单位的设计效果和交互,那么尽管使用;如果不满足,那么请自行设计所需要的界面和交互,其中聊天数据通过OnChatListener 来监听(收取)聊天消息,然后将聊天消息与listview绑定显示出来。与表情相关的内容请仔细查阅文档上OnChatListener的介绍。同理问答、投票同样分别通过OnQaListener和OnVoteListener来监听(收取)对应的消息,然后自行设计界面将数据显示出来。
注意:使用了监听就不要再使用对应的view。例如要使用OnChatListener就不要使用GSImplChatView了,GSImplChatView是OnChatListener实现之一,若OnChatListener后设置给sdk,那么聊天数据会通过OnChatListener的函数回调出来,若GSImplChatView后设置给sdk,那么数据只会在GSImplChatView上面显示,不会通过OnChatListener回调出来的。
2.2 发送qa,自己为何会有两个问题显示?
Qa在组织者方是有审核、发布、回复的功能,因此在发送的时候表现的友好,在本地显示一次发送的内容。问题发出去后需要组织者审核发布以后,其他人才能收到这个内容,因此发送者会出现两条,第一条用“(我)”标识是自身发出的内容,其他的均为推送的内容,当取消发布的时候,推送的内容都不显示,此时只保留第一条记录。
发送 回复发布 取消发布
2.3 onErr 返回6是什么意思?
返回6是课堂或直播过期(失效)的意思,请检查该直播是否失(过期)。也就是现时间已经超过其有效期。
例如现在是2017.02.23 16:55:00,而直播设置的失效时间是2017.02.23 16:53:00,因此失效。
2.4 onJoin 返回12是什么意思?
响应12是并发满,也就是现在站点的人数已经达到上限,这种情况下需要找对应的销售人员申请扩充点数(人数),另外也可以看一下后台的实际并发,如果没有满,可以找我们这边的开发人员查一下(基本不会)。
注意,如果单个房间(直播间或课堂)设定了并发,也需要注意一下单个的设定是否已经满了。
2.5 加入直播一直加载是什么情况?
如果加入没有响应onjoin或onErr,一直处于加载中,那么基本上是动态库(so)没有加载成功。检验都可以通过PlayerEnv.loadLibrary()的返回值来判断,如果返回true,加载成功,false,加载失败。
加载失败(No implementation found for void com.gensee.common.PlayerEnv.initEnv)的原因2种:
1. 没有引入或引入的动态库不全
- 部分开发者在加载demo或自己根据接口文档开发的时候,忽略了动态库的引用
请注意动态库(so),参照各文档所列出的动态库。
- 部分开发者在使用多个sdk的时候没有保持一致的动态库
这种比较常见,请各位开发者注意,使用多个sdk的时候一定要保证armeabi、armeabi-v7a、arm64-v8a、x86的一致性。
例如某开发者只将gensee的armeabi目录的so copy到工程的armeabi目录,而工程中又包含armeabi-v7a、arm64-v8a、x86的话,那么在armeabi-v7a、arm64-v8a、x86这些架构的手机上会无法加载而进入一直加载。
也就是说如果工程中有armeabi,armeabi-v7a,arm64-v8a、x86,那么一定也需要把对应架构下的gensee的armeabi,armeabi-v7a,arm64-v8a、x86目录的动态库拷贝到工程中对应的位置。
libs -armeabi -sdk1.so //gensee的动态库(armeabi) -sdk2.so //其他sdk或自身的动态库 -armeabi-v7a -sdk1.so //gensee的动态库(armeabi-v7a) -sdk2.so //其他sdk或自身的动态库 -arm64-v8a -sdk1.so //gensee的动态库(arm64-v8a) -sdk2.so //其他sdk或自身动态库 -x86 -sdk1.so //gensee的动态库(x86) -sdk2.so //其他sdk或自身的动态库
如果工程当中只有armeabi这一架构,那只需要拷贝armeabi到工程里面即可
不一致或缺少都会出现加载失败而不能正确调用。
2. Android studio 打包问题
部分开发者在使用android studio打包的时候,由于自身工具的配置原因,导致apk没有将动态库so压缩进去,所以也会一直加载,确认方法为解压apk,查看lib目录,分别查看里面的动态库是否都齐全,包括armeabi、armeabi-v7a、arm64-v8a、x86。
如果没有lib目录:请各自结合baidu查找自身配置问题,
如果有lib目录,请继续查找lib目录下的armeabi、armeabi-v7a、arm64-v8a、x86架构是否包含gensee的动态库。
2.6 聊天消息输入时候,键盘盖住了输入框如何处理?
同2.1聊天界面是不支持定制,因此要处理掉键盘盖住输入框的情况,需要开发者自行开发聊天界面来取代,方法就是实现聊天监听,把监听到的消息绑定到界面上。问答同理。
3、RtSDK(直播相关问题)
3.1 麦克风打开失败是什么原因?
麦克风是涉及到了硬件,需要权限。如果在清单文件中没有添加上<uses-permission android:name="android.permission.RECORD_AUDIO" />那么必定打开失败;另外如果app的targetSdkVersion写的是23,那么在Android 6.0及以上的机器上是打不开的,因为6.0需要另行申请权限:
最后是设备本身的原因,有的设备mic被损坏导致不能打开,请自行通过系统的录音软件或通过写录音程序来验证设备是否正常。
3.2加入直播间的流程是怎样的?
RtSdk加入流程:
RtComp->initWithGensee -Callback->onErr 错误响应,终止加入流程 -Callback->onInited(rtparam) RtSDK->initWithParam(rtparam) -IRoomCallback->onInit(result) result 为false终止加入流程,true继续 RtSDK->join -IRoomCallback->onJoinConfirm(int result,UserInfo self,boolean failover)
result 参考文档 0为加入成功,其他结果则终止加入流程。
3.3 小班课如何上讲台,如何上提问席?
讲台和提问席的控制都是通过IRoomCallback.onRoomData(String key,long value) 响应的
例如:key为RTRoomDataKey.KEY_USER_ASKER的时候,
value 是某个用户的id,那么代表这个用户被设置为提问席,那么需要打开这个用户自主打开视频和音频,视频打开后就显示在了提问席区域。
value为0的时候代表提问席恢复了,此时之前在提问席显示的用户需要自主关闭视频和音频
同理key为RTRoomDataKey.KEY_USER_ROSTRUM的时候,
value是某个用户的id,那么代表这个用户被设置为讲台,那么需要打开这个用户自主打开视频和音频,视频打开后就显示在了讲台区域。
value为0的时候代表讲台的恢复了,此时之前在讲台显示的用户需要自主关闭视频和音频,如果被设置为提问席,该用户想自己取消,调用rtsdk.roomSetData(RTRoomDataKey.KEY_USER_ASKER,0, null)。
关于打开视频,需要摄像头权限,LocalVideoView进行预览和采集,详细流程请参考SDK压缩包里面的打开视频的流程,音频比较简单,具备权限后调用audioOpenMic(OnTaskRet taskRet)即可打开己方音频。
4、VodSDK(点播相关问题)
4.1点播(getChatHistory)为什么获取不到历史聊天记录?
点播聊天消息获取不到是空的,原因如下
1 刚生成的点播,刚生成的需要一小段时间来同步数据,可以通过网页端看一下。
2 点播生成已有一段时间,且确认当时是有聊天内容的,那么检查一下后台配置:开启聊天记录
3 没有响应(回调)
不要在回调onChathistory里面操作ui
响应了onErr :没有调用getVodObject的原因是没有正确调用。正确的调用方式:
VodSite->getVodObject - onVodObject - VodSite ->getChatHistory-onChathistory
4.2 点播播放几次后播放不了,过一会又能播放是为什么?
点播播放为了交互上面的体验,退出播放时候就停止了播放流程,服务端无法准确得知本次播放所占用的并发(点数)已经可以回收,因此要等待一小段时间(5分钟左右)可以再次观看。这种情况下SDK 响应给app的result 为12(并发不足),这种情况多出现在开发者测试阶段,由于是测试,申请的点播并发点数少(可以通过站点后台查看点播并发数)造成的,请在正式站点上申请足够的点播并发。
4.3 初始化的时候响应点播编号不存在或点播id不存在是为什么?
有如下原因:
1 Webcast 和 Training 没有弄清楚,这种出现在两种站点类型的用户,把training站点的点播当成是webcast站点的点播,反之一样。请确保serviceType 正确,如果是webcast站点的点播,一定传入WEBCAST 类型,是training的点播,一定传入TRAINING类型。
2 填写错误,有的用户是通过自身后台系统手工填写和配置的,出现的了差错,请找Gensee站点原始信息核对。
3 Demo输入框填写错误,有的输入法会在输入内容后面自动添加空格,请仔细检查。
4 直播和点播混淆,将直播的编号当成是点播的编号,或将直播的id当成点播id,因此不存在。
4.4 点播章节从哪里来?
App 点播的章节(文档目录)是点播播放初始化响应(onInit)和onDocInfo合力完成,初始化的时候最后一个参数就是章节列表,可能为空,当onDocInfo 响应的时候如果不为空,更新一下onInit响应的列表数据,再更新一下界面。
每一章节有对应的时间戳,用这个时间戳可以调用vodplayer 的seekTo函数,跳到该章节去播放。
4.5 点播下载的文件存放路径是否可以修改?
如果是下载(缓存),默认路径为:/sdcard/GSVod/DownLoad/0/点播id,如果需要更改,请在初始化的downloader的时候传入需要存储的路径和uuid,存储路径为 传入的路径/uuid/点播id。
4.6 点播播放seek失败的原因?
Seek操作是需要在播放过程中操作的,也就是播放开始到播放结束之间操作才是有效的,没有播放或已经播放结束,操作是无效的,无效的情况下响应的错误码是seek调用失败,开发者在调用过程中请保证在onInit和播放结束(手动结束或自然播放完成)之间调用。