学点云Android集成指南.html
46.4 KB
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
<!-- 插件官网地址:http://ruby-china.org/topics/17028 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学点云iOS集成指南</title>
<link rel="stylesheet" type="text/css" href="./markdownToc_files/github2-rightpart.css" media="all">
<link rel="stylesheet" type="text/css" href="./markdownToc_files/github1-contents.css">
<link rel="stylesheet" href="./markdownToc_files/zTreeStyle.css" type="text/css">
<style>
.ztree li a.curSelectedNode {
padding-top: 0px;
background-color: #FFE6B0;
color: black;
height: 16px;
border: 1px #FFB951 solid;
opacity: 0.8;
}
.ztree {
overflow: auto;
height: 100%;
min-height: 200px;
top: 0px;
}
.md-fences {
background: black;
}
</style>
</head>
<body style="">
<div>
<div style="width:30%;">
<ul id="tree" class="ztree" style="width: 260px; overflow: auto; position: fixed; z-index: 2147483647; border: 0px none; left: 0px; bottom: 0px;">
<!-- 目录内容在网页另存为之后将插入到此处 -->
</ul>
</div>
<div id="readme" style="width:70%;margin-left:25%;">
<article class="markdown-body">
<!-- ***********************************************************内容分割线****************************************************************** -->
<!-- 请把你的html正文部分粘贴到此处,在浏览器中打开之后将会自动生成目录。如果想要将目录保留并嵌入到此文档中,只需在浏览器中“另存为->网页,全部”即可 -->
<h1><a name='header-c5' class='md-header-anchor '></a>学点云Android集成指南</h1><h2><a name='header-c7' class='md-header-anchor '></a>使用说明</h2><h3><a name='header-c8' class='md-header-anchor '></a>配置工程</h3><h4><a name='header-c9' class='md-header-anchor '></a>导入到工程</h4><p><strong><em>将下载的aar包复制到您的工程当中</em></strong></p><p><img src='./imgs/aarimport.png' alt='aar导入' /></p><p></p><h4><a name='header-c16' class='md-header-anchor '></a>添加依赖库</h4><pre class='md-fences mock-cm' style='display:block;position:relative'>compile(name:'xdy_v1.0.1', ext:'aar')</pre><h4><a name='header-c18' class='md-header-anchor '></a>添加权限</h4><pre class='md-fences mock-cm' style='display:block;position:relative'><uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" /></pre><h3><a name='header-c20' class='md-header-anchor '></a>SDK使用</h3><h4><a name='header-c21' class='md-header-anchor '></a><strong>初始化SDk</strong></h4><pre class='md-fences mock-cm' style='display:block;position:relative'>在application中初始化sdk
XdySdk.init(this);</pre><h4><a name='header-c23' class='md-header-anchor '></a>具体方法使用</h4><pre class='md-fences mock-cm' style='display:block;position:relative'>//实例化sdk
XdySdk xdySdk = XdySdk.getXdyInstance();
//添加sdk返回数据的监听
xdySdk.add(new ObserverListener() {
@Override
public void observerUpData(String s, String s1) {
//收到sdk返回的数据(注意:这里收到的数据是在子线程中)
}
});
//发送消息
xdySdk.api("init", parameter);//发送命令parameter(标准json字符串) ,不使用时传入 "" 空双引号
xdySdk.api("publishVideo", "", mSurfaceView, VideoPlayActivity.this);//播放媒体资源的方法
xdysdk.removeAll();//结束时</pre><p></p><h3><a name='header-c27' class='md-header-anchor '></a> </h3><h2><a name='header-c28' class='md-header-anchor '></a>课堂模块</h2><h3><a name='header-c29' class='md-header-anchor '></a>初始化课堂</h3><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("init",parameter)</pre><p><strong>示例:</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("init",{
"classId":123456,
"portal":"127.0.0.1:80",
"userRole":"normal",
"userName":"",
"userId":0,
}</pre><p><strong>传入参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>classId</td><td>int</td><td><code>(必选)</code> 课堂号.</td></tr><tr><td>portal</td><td>String</td><td><code>(必选)</code> ip地址,格式"127.0.0.1:80".</td></tr><tr><td>userRole</td><td>String</td><td><code>(必选)</code>用户的身份类型,默认是normal ;host(主持人/老师)、presenter(主讲人)、assistant(助教)、normal(普通角色/学生),invisible(监课).</td></tr><tr><td>userId</td><td>int</td><td><code>(必选)</code>用户userId,如果没有就使用默认值0;</td></tr><tr><td>userName</td><td>String</td><td><code>(必选)</code>用户userName 如果没有就使用默认值"";</td></tr></tbody></table><h3><a name='header-c61' class='md-header-anchor '></a>初始化课堂成功</h3><p><strong>监听初始化课堂成功</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>class_init_success</pre><p><strong>示例:</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>
@Override
public void observerUpData(String type, String parameter) {
//收到sdk返回的数据(注意:这里收到的数据是在子线程中)
type: "class_init_success",function(callbackData){
parameter:
{
"siteId": "h5test",
"passwordRequired": true,
"userRole": "normal",
"classId":222333,
"userId": "0",
"userName": "用户001",
"classType": 1
}
}
</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>siteId</td><td>String</td><td>站点标识</td></tr><tr><td>passwordRequired</td><td>Boolean</td><td>加入课堂是否需要密码 <code>true(需要);false(不需要)</code></td></tr><tr><td>userRole</td><td>String</td><td>角色身份:查看<code>(角色身份对照表)</code></td></tr><tr><td>classId</td><td>int</td><td>课堂号</td></tr><tr><td>userId</td><td>String</td><td>用户userId</td></tr><tr><td>userName</td><td>String</td><td>用户名字</td></tr><tr><td>classType</td><td>int</td><td>课堂类型 <code>1:互动课堂; 2:直播课堂</code></td></tr></tbody></table><h3><a name='header-c103' class='md-header-anchor '></a>加入课堂</h3><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("joinClass",parameter)</pre><p><strong>示例:</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>paramter:
{
"userName":"小明",
"password":"123321",
"autoLogin":""
}</pre><p><strong>传入参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>userName</td><td>String</td><td><code>(必选)</code>用户的名字,如果userName不为空,可以直接使用,否则需要添加一个名字.</td></tr><tr><td>password可选</td><td>String</td><td>课堂密码,如果设置了密码需要验证,否则可以为空</td></tr><tr><td>autoLogin可选</td><td>String</td><td>自动登录验证,数据从浏览器地址栏参数中获取字段名称为m的参数,如果没有就不用传</td></tr></tbody></table><h3><a name='header-c127' class='md-header-anchor '></a>加入课堂成功</h3><p>监听加入课堂成功,直播互动和录制回放都会触发这个事件;</p><pre class='md-fences mock-cm' style='display:block;position:relative'>class_join_success</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>
{
"isRecordPlayBack": false,
"DOCServerIP": "127.0.0.1",
"DOCServerPort": "8080",
"classStatus": 2,
"classId": 23232112,
"className": "mcuClientSdk",
"maxAudioChannels": 2,
"maxVideoChannels": 2,
"nodeId": 140943244,
"password": "",
"passwordRequired": true,
"siteId": "h5dev",
"userId": "8ab3b0ed5a3a9220015a3a958f0d0003",
"userName": "base",
"userRole": "host",
"classType": 1,
"country": "中国",
"city": "北京",
"province": "北京",
"isp": "联通",
"classTimestamp": 122,
"recordPlaybackMaxTime": 0,
"fps": 16,
"gop": 4,
"videoQuality": 1
}</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>isRecordPlayBack</td><td>Boolean</td><td>当前是否是录制回放:<code>true:录制回放;false:不是录制回放</code></td></tr><tr><td>DOCServerIP</td><td>String</td><td>文档上传时请求的ip地址</td></tr><tr><td>DOCServerPort</td><td>String</td><td>文档上传时ip端口</td></tr><tr><td>classStatus</td><td>int</td><td>当前的课堂状态</td></tr><tr><td>classId</td><td>int</td><td>课堂号</td></tr><tr><td>className</td><td>String</td><td>课堂名称</td></tr><tr><td>maxAudioChannels</td><td>int</td><td>可以开启音频推流的最大值</td></tr><tr><td>maxVideoChannels</td><td>int</td><td>可以开启视频推流的最大值</td></tr><tr><td>nodeId</td><td>int</td><td>用户的nodeId</td></tr><tr><td>password</td><td>String</td><td>加入课堂的密码,如果课堂不需要密码该值为""</td></tr><tr><td>passwordRequired</td><td>Boolean</td><td>加入课堂是否需要密码<code>true:需要密码;false:不需要密码</code></td></tr><tr><td>siteId</td><td>String</td><td>站点标识</td></tr><tr><td>userId</td><td>String</td><td>用户的userId</td></tr><tr><td>userName</td><td>String</td><td>用户的名字</td></tr><tr><td>userRole</td><td>String</td><td>角色身份:查看<code>(角色身份对照表)</code></td></tr><tr><td>classType</td><td>int</td><td>课堂类型</td></tr><tr><td>classTimestamp</td><td>int</td><td>当前课堂进行的时间长度</td></tr><tr><td>recordPlaybackMaxTime</td><td>int</td><td>录制回放的总时间长度<code>(只有录制回放的时候才有值,单位(秒))</code></td></tr><tr><td>fps</td><td>int</td><td>推流时的帧频</td></tr><tr><td>gop</td><td>int</td><td>推流时的关键帧</td></tr><tr><td>videoQuality</td><td>int</td><td>推流时的画面质量 0-低;1-中;2-高</td></tr><tr><td>country</td><td>String</td><td>国家</td></tr><tr><td>city</td><td>String</td><td>城市</td></tr><tr><td>province</td><td>String</td><td>省份</td></tr><tr><td>isp</td><td>String</td><td>运营商</td></tr></tbody></table><h3><a name='header-c241' class='md-header-anchor '></a>离开课堂</h3><p>离开课堂,自己离开时调用;</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("leaveClass","")</pre><h3><a name='header-c245' class='md-header-anchor '></a>人员加入</h3><p>监听人员加入</p><pre class='md-fences mock-cm' style='display:block;position:relative'>class_insert_roster</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'> //返回值:
{
"nodeId": 398662189,
"nodeData": {
"nodeId": 398662189,
"name": "gust_398648708",
"role": 1,
"userId": "1483947664"
}
}
}</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>nodeId</td><td>int</td><td>加入人员的唯一标识nodeId</td></tr><tr><td>nodeData</td><td>list</td><td>人员的详细信息</td></tr><tr><td>userId</td><td>String</td><td>人员的userId</td></tr><tr><td>name</td><td>String</td><td>人员的名字</td></tr><tr><td>role</td><td>Int</td><td>人员的角色身份:查看<code>(角色身份对照表)</code></td></tr></tbody></table><h3><a name='header-c279' class='md-header-anchor '></a>人员离开</h3><p>监听人员离开</p><pre class='md-fences mock-cm' style='display:block;position:relative'>class_delete_roster</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>返回值:{"nodeId":1234}</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>nodeId</td><td>int</td><td>离开人员的唯一标识nodeId</td></tr></tbody></table><h3><a name='header-c297' class='md-header-anchor '></a>课堂关闭消息</h3><p>监听课堂关闭,收到这个消息时自己已经离开课堂,需要停止界面操作和隐藏界面</p><pre class='md-fences mock-cm' style='display:block;position:relative'>class_exit</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'> //返回值 {'type':1}</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>type</td><td>int</td><td>课堂关闭的类型:<code>type=0</code>是自己主动离开;<code>type=1</code>是被强制离开课堂(课堂已经结束或者被踢出)</td></tr></tbody></table><h3><a name='header-c315' class='md-header-anchor '></a>课堂时间更新</h3><p>监听课堂时间更新</p><pre class='md-fences mock-cm' style='display:block;position:relative'>class_update_timer</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'> //返回值: {"classTimestamp": 2320}</pre><p><strong>返回值参数</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>classTimestamp</td><td>int</td><td><code>单位(秒)</code>当前课堂已经进行的时间;录制回放的时候也使用这个时间长度来显示当前已经录制回放的时长;</td></tr></tbody></table><h3><a name='header-c333' class='md-header-anchor '></a>课堂状态更新</h3><p>监听课堂状态更新</p><pre class='md-fences mock-cm' style='display:block;position:relative'>class_update_status</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>返回值: {
"nodeId": 228632179,
"userId": "0",
"userName": "mcuTest1487228632",
"siteId": "h5test",
"classId": 1674214716,
"className": "mcuxdysdk",
"classType": 1,
"classStatus": 2,
"classStartTime": "2017-2-16-14-59-46",
"classStopTime": "2017-2-16-15-4-7",
"classTimestamp": 0,
"classBeginTime": "2017-02-16 14:00:00",
"classEndTime": "2017-02-28 16:00:00",
"recordStatus": false,
"recordTimestamp": 0,
"recordFileName": "",
"recordDownloadUrl": "",
"serverTimestamp": 228647800,
"activeDocId": 0,
"activeDocCurPage": 1
}</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>siteId</td><td>String</td><td>站点名称</td></tr><tr><td>classId</td><td>int</td><td>课堂号</td></tr><tr><td>className</td><td>String</td><td>课堂名称</td></tr><tr><td>classType</td><td>int</td><td><code>[重要]</code> 课堂类型 <code>1(互动课堂)</code> 、<code>2(直播课堂)</code></td></tr><tr><td>classStatus</td><td>String</td><td><code>[重要]</code> 当前课堂的状态<code>0(未开始)</code> 、<code>1(正在进行中)</code> <code>2(暂停中)</code></td></tr><tr><td>classStartTime</td><td>String</td><td>第一次点击开始上课的时间戳</td></tr><tr><td>classStopTime</td><td>String</td><td>最后一次点停止(暂停或结束)的时间戳</td></tr><tr><td>classTimestamp</td><td>int</td><td>课堂进行的累积时间</td></tr><tr><td>classBeginTime</td><td>String</td><td>课堂创建的时间</td></tr><tr><td>classEndTime</td><td>String</td><td>课堂到期的时间</td></tr><tr><td>recordStatus</td><td>Boolean</td><td>当前课堂的录制状态 true(录制)、false(没有录制)</td></tr><tr><td>recordTimestamp</td><td>int</td><td>录制的累积时间长</td></tr><tr><td>recordFileName</td><td>String</td><td>课堂录制的文件名</td></tr><tr><td>recordDownloadUrl</td><td>String</td><td>课堂录制的下载地址</td></tr><tr><td>serverTimestamp</td><td>int</td><td>当前系统时间戳</td></tr><tr><td>activeDocId</td><td>int</td><td>当前显示的文档的itemIdex</td></tr><tr><td>activeDocCurPage</td><td>int</td><td>当前显示的文档的页码</td></tr><tr><td>nodeId</td><td>int</td><td>课堂中更新课堂状态的用户的nodeId</td></tr><tr><td>userId</td><td>String</td><td>课堂中更新课堂状态的用户的userId</td></tr><tr><td>userName</td><td>String</td><td>课堂中更新课堂状态的用户的名称</td></tr></tbody></table><h2><a name='header-c427' class='md-header-anchor '></a>聊天模块</h2><h3><a name='header-c428' class='md-header-anchor '></a>接收聊天消息</h3><p>监听聊天消息</p><pre class='md-fences mock-cm' style='display:block;position:relative'>chat_receive_message</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>返回值: {
"fromNodeId": 1484207995,
"toNodeId": 0,
"message": "Hello world!",
"fromName": "MyName",
"fromRole": "normal"
}</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>fromNodeId</td><td>int</td><td>消息发送者的nodeId</td></tr><tr><td>toNodeId</td><td>int</td><td>发送给谁(0:所有人,非0的时候是指定的人nodeId)</td></tr><tr><td>message</td><td>String</td><td>消息的内容</td></tr><tr><td>fromName</td><td>String</td><td>发送者的名字</td></tr><tr><td>fromRole</td><td>String</td><td>发送者的角色身份</td></tr></tbody></table><h3><a name='header-c462' class='md-header-anchor '></a>发送聊天消息</h3><p>发送聊天消息</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("sendChatMsg", parameter); parameter(标准json字符串)</pre><p><strong>示例代码.</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("sendChatMsg",{
"message":"Hello world!",
"to":0
});</pre><p><strong>传入参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>message</td><td>String</td><td>(必选) 消息内容.</td></tr><tr><td>to可选</td><td>int</td><td>接收消息的人的ID(0是发给所有人,否则就是发给指定的人)默认值: 0</td></tr></tbody></table><h2><a name='header-c484' class='md-header-anchor '></a>文档模块</h2><h3><a name='header-c485' class='md-header-anchor '></a>删除文档消息</h3><p>监听删除文档消息,这个文档的数据已经被清除,如果有文档列表,需要从文档列表中移除.</p><pre class='md-fences mock-cm' style='display:block;position:relative'>document_delete</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>返回值: {
"itemIdx": 43386380
}</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>itemIdx</td><td></td><td>文档的唯一标识</td></tr></tbody></table><h3><a name='header-c503' class='md-header-anchor '></a>更新文档消息</h3><p>监听更新文档消息,每个文档都有唯一的标识itemIdx,通过返回值中的visible字段来判断是否要显示文档.如果需要显示文档列表,需要自己储存文档数据。</p><pre class='md-fences mock-cm' style='display:block;position:relative'>document_update</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'> {
"visible": true,
"itemIdx": 48941765,
"owner": 51346831,
"from": 51346831,
"curPageNo": 1,
"pageNum": 3,
"fileType": "pdf",
"creatUserId": "968228008",
"relativeUrl": "/DocSharing/data/1299232248/example.swf",
"url": "http://127.0.0.1/DocSharing/data/1299232248/example.swf",
"curV": 0,
"curH": 0,
"scale": 100,
"action": 0,
"docId": "8ab3b0ed5b5f23bc015b603b965d0552",
"fileName": "example.jpg",
"dynamicTS": "0",
"md5": "",
"showType": 0,
"images": [
"http://127.0.0.1/DocSharing/data/1299232248/1.jpg",
"http://127.0.0.1/DocSharing/data/1299232248/2.jpg",
"http://127.0.0.1/DocSharing/data/1299232248/3.jpg"
],
"pdf": "http://127.0.0.1/DocSharing/data/1299232248/example.pdf",
"html": ""
}</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>visible</td><td>Boolean</td><td>文档是否显示,收到文档数据<code>优先判断</code>这个值,如果为visible=false就不需要显示</td></tr><tr><td>images</td><td>list</td><td>文档的图片序列显示地址,和总页数的长度一致;<code>需要显示图片从这里获取</code></td></tr><tr><td>pdf</td><td>String</td><td>文档pdf显示地址;<code>上传时文件fileType类型为'pdf、docx、pptx',pdf才会值,如果上传的文件是图片类型,pdf值为""</code></td></tr><tr><td>html</td><td>String</td><td>动态ppt访问地址 <code>上传的文件类型为动态类型才有值,其他类型pdf值为""</code></td></tr><tr><td>itemIdx</td><td>int</td><td>文档的唯一id</td></tr><tr><td>curPageNo</td><td>int</td><td>当前页码</td></tr><tr><td>action</td><td>int</td><td>文档的操作类型</td></tr><tr><td>pageNum</td><td>int</td><td>文档的总页数</td></tr><tr><td>docId</td><td>int</td><td>文档的唯一资源标识</td></tr><tr><td>fileName</td><td>String</td><td>文档名称</td></tr><tr><td>fileType</td><td>String</td><td>文档上传时的文件类型</td></tr><tr><td>from</td><td>int</td><td>文档上传人的nodeId</td></tr><tr><td>relativeUrl</td><td>String</td><td>文档路径的相对地址</td></tr><tr><td>url</td><td>String</td><td>文档路径的完整地址</td></tr><tr><td>curV</td><td>int</td><td>文档垂直方向的滚动值</td></tr><tr><td>curH</td><td>int</td><td>文档水平方向的滚动值</td></tr><tr><td>scale</td><td>int</td><td>文档的缩放百分比(默认值100的时候就是100%,无缩放)</td></tr><tr><td>dynamicTS</td><td>int</td><td>文档是否动态转换</td></tr><tr><td>md5</td><td>String</td><td>文档的MD5码</td></tr><tr><td>creatUserId</td><td>String</td><td>创建文档的user</td></tr><tr><td>owner</td><td>int</td><td>owner</td></tr></tbody></table><h2><a name='header-c601' class='md-header-anchor '></a>标注模块</h2><h3><a name='header-c602' class='md-header-anchor '></a>标注更新消息</h3><p>监听标注更新</p><pre class='md-fences mock-cm' style='display:block;position:relative'>whiteboard_annotation_update</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>返回值:{
"isFresh": true,
"annotaionItems": [
{
"type": 0,
"itemIdx": 39638459,
"initiator": 39436467,
"parentId": 990261098,
"curPageNo": 22,
"pointGroup": [
{"w": 10,"h": 20},
{"w": 11,"h": 21},
{"w": 12, "h": 22}
],
"color": "#000000",
"thickness": 2
},
{
"type": 2,
"itemIdx": 39643378,
"initiator": 39436467,
"parentId": 990261098,
"curPageNo": 22,
"pointGroup": [
{"w": 10,"h": 10},{"w": 60,"h": 60}
],
"color": "#000000",
"thickness": 2
}
]
}
}</pre><p><strong>返回值参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>isFresh</td><td>Boolean</td><td>优先判断,这个字段用来判断是否先清除当前显示的数据;isFresh=true(先清除再绘制),isFresh=false(在现有的基础上添加绘制)</td></tr><tr><td>annotaionItems</td><td>List</td><td>需要绘制显示的标注内容数组(数据根据type类型解析),如果数组长度为0就不需绘制;</td></tr></tbody></table><h3><a name='header-c624' class='md-header-anchor '></a><strong>添加标注标注</strong></h3><p>添加标注标注,可以添加任意线段、直线、矩形、圆形、文本等等内容。下面的代码中将分别演示添加(任意线段、直线、矩形、圆形、文本)内容时调 用接口所要传入的参数</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("sendInsertAnnotaion",parameter);</pre><p><strong>示例代码:</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("sendInsertAnnotaion",{
"type": 0,
"pointGroup": [{"w":10,"h":20},{"w":11,"h":21},{"w":12,"h":22}],//有多个坐标点组成
"color": "#000000",
"thickness": 1
});</pre><p><strong>传入参数:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>type</td><td>int</td><td>(必选) 添加的内容类型0 (线段),1 (直线), 2(矩形), 3(圆形), 4(文本)</td></tr><tr><td>pointGroup</td><td>Array</td><td>(必选) 画布上的坐标点对象集合数组,数组中长度根据type的类型而定object对象的结构为{"w":0,"h":0},对象中的w,h的值分别是x,y坐标点相对于绘制区域宽度的百分比值(可保留2位小数 比如:65.23%),比如在(宽200 X 高100)的舞台上,坐标点{"x":20,"y":65},转换为百分比之后为{"w":20/200,"h":65/200} type=0 pointGroup的长度必须大于1 [{"w":10,"h":20},{"w":11.56,"h":21.23},{"w":12,"h":22},...,N],//有多个坐标点组成 type=1pointGroup的长度必须等于2 [{"w":10,"h":20},{"w":20,"h":70}],//只有两个坐标点 [起点,终点]type=2 pointGroup的长度必须等于2 [{"w":10,"h":10},{"w":60.22,"h":60.}],//矩形对角线 [左上角对角线坐标点,右下角对角线坐标点]type=3 pointGroup的长度必须等于1 [{"w":50,"h":50}],//只有一个坐标点[圆的中心坐标]type=4 pointGroup的长度必须等于1 [{"w":10,"h":20}],//只有一个坐标点[文本的左上角坐标]</td></tr><tr><td>text</td><td>String</td><td>(文本必选) 文本的内容,这个属性只有在type类型为文本的时候使用,其它类型的情况下不使用</td></tr><tr><td>radius</td><td>String</td><td>(圆形必选) 圆的半径(按画布宽度百分比计算),这个只在绘制圆的时候使用,其他type的时候不使用,这个值是一个相对 画布宽度大小的百分比,比如在画布宽度为400,要绘制一个半径为40的圆,计算的百分比值=40/400=10%,那么radius=10</td></tr><tr><td>color可选</td><td>String</td><td>颜色值默认值: #000000</td></tr><tr><td>hickness可选</td><td>int</td><td>线条的粗细度,除了文本之外的图像都有线条粗细默认值: 1</td></tr><tr><td>fontSize可选</td><td>int</td><td>文本的字体大小,这个属性只有在type类型为文本的时候使用,其它类型的情况下不使用默认值: 14</td></tr><tr><td>fontName可选</td><td>String</td><td>文本字体m,这个属性只有在type类型为文本的时候使用,其它类型的情况下不使用默认值: null</td></tr></tbody></table><h2><a name='header-c670' class='md-header-anchor '></a>视频模块</h2><h3><a name='header-c671' class='md-header-anchor '></a>播放视频的消息</h3><p>监听播放视频的消息,如果课堂中有人推流,就会触发这个事件;</p><pre class='md-fences mock-cm' style='display:block;position:relative'>video_play</pre><p>返回值参数:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>mediaId</td><td>String</td><td>需要播放的视频流id标识</td></tr></tbody></table><h3><a name='header-c686' class='md-header-anchor '></a> </h3><h4><a name='header-c687' class='md-header-anchor '></a>播放示例代码</h4><pre class='md-fences mock-cm' style='display:block;position:relative'> xdySdk.api("playVideo", mediaid, mSurfaceView, mActivity);</pre><p>返回字段</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>play_success</td><td>String</td><td>播放视频时已经显示画面</td></tr></tbody></table><h4><a name='header-c700' class='md-header-anchor '></a>停止视频的消息</h4><p> 监听消息中收到以下信息,需要主动关闭流信息</p><pre class='md-fences mock-cm' style='display:block;position:relative'>video_stop</pre><h4><a name='header-c704' class='md-header-anchor '></a>停止播放</h4><pre class='md-fences mock-cm' style='display:block;position:relative'> xdySdk.api("stopVideo", "");</pre><p><strong>暂停播放</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdySdk.onPlayStop(mediaid); //mediaid 正在播放视频的id</pre><h3><a name='header-c709' class='md-header-anchor '></a> </h3><pre class='md-fences mock-cm' style='display:block;position:relative'> // 视频播放加入的生命周期
@Override
protected void onPause() {
super.onPause();
xdySdk.onPlayStop(playVideoOrAudioId);
}
//重新播放
@Override
protected void onResume() {
super.onResume();
if(isVideoMode) {
playVideo(playVideoOrAudioId);
}else{
playAudio(playVideoOrAudioId);
}
}</pre><h4><a name='header-c711' class='md-header-anchor '></a>视频推流</h4><p>开启视频并推流</p><pre class='md-fences mock-cm' style='display:block;position:relative'> xdySdk.api("publishVideo", "", mSurfaceView, mActivity);</pre><p>返回</p><pre class='md-fences mock-cm' style='display:block;position:relative'>publishSuccess //推流成功</pre><h3><a name='header-c718' class='md-header-anchor '></a>停止推流</h3><p>开启视频并推流</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdySdk.api("unPublishVideo", "");</pre><p></p><p></p><h2><a name='header-c726' class='md-header-anchor '></a>音频模块</h2><h3><a name='header-c727' class='md-header-anchor '></a>播放音频的消息</h3><p>监听播放视频的消息,如果课堂中有人推流,就会触发这个事件;</p><pre class='md-fences mock-cm' style='display:block;position:relative'>audio_play</pre><p></p><p>返回值参数:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>mediaId</td><td>String</td><td>需要播放的视频流id标识</td></tr></tbody></table><h3><a name='header-c744' class='md-header-anchor '></a>停止音频的消息</h3><pre class='md-fences mock-cm' style='display:block;position:relative'>audio_stop</pre><p>收到消息提示后,调用</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("stopAudio","")//停止播放音频</pre><p> 暂停音频播放</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdySdk.onPlayStop(mediaid); //mediaid 正在播放视频的id</pre><p></p><h3><a name='header-c754' class='md-header-anchor '></a>音频推送</h3><p>开启音频并推流</p><pre class='md-fences mock-cm' style='display:block;position:relative'> xdySdk.api("publishAudio", "", null, mActivity);</pre><p></p><p></p><h3><a name='header-c762' class='md-header-anchor '></a>停止播放</h3><p>关闭视频并停止推流</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdySdk.api("unPublishVideo", "");</pre><h2><a name='header-c766' class='md-header-anchor '></a>录制回放</h2><h3><a name='header-c767' class='md-header-anchor '></a>初始化录制回放</h3><p>初始化录制回放</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("initRecordPlayback",parameter);</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("initRecordPlayback",{
"classId":123456,
"portal":"127.0.0.1:80"
});</pre><p>传入参数:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>classId</td><td>int</td><td>(必选) 课堂号.</td></tr><tr><td>portal</td><td>Stirng</td><td>(必选) ip地址,格式"127.0.0.1:80".</td></tr></tbody></table><h3><a name='header-c789' class='md-header-anchor '></a>开始回放</h3><p>播放录制内容</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("startRecordPlayback");</pre><h3><a name='header-c793' class='md-header-anchor '></a>暂停回放</h3><p>暂停播放</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("pauseRecordPlayback");</pre><h3><a name='header-c797' class='md-header-anchor '></a>停止回放</h3><p>停止播放录制内容</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("stopRecordPlayback");</pre><h3><a name='header-c801' class='md-header-anchor '></a>回放状态更新</h3><p>监听录制回放状态更新</p><pre class='md-fences mock-cm' style='display:block;position:relative'>record_playback_update</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>返回值:
{
"statuse": 0
}
}</pre><p>返回值参数:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>statuse</td><td>int</td><td>当前录制回放的状态0:(未开始),1:(回放中),2:(暂停中),3:(SEEK),4:(停止)</td></tr></tbody></table><h3><a name='header-c819' class='md-header-anchor '></a>更改回放时间点</h3><p>更改录制回放进度,从指定的时间点播放录制内容,录制回放的总时间长度在加入课堂成功返回的消息中-录制回放总时间(recordPlaybackMaxTime)</p><p>注意:调用这个接口的时候,需要先清除当前各个界面显示的数据后调用接口,sdk内部会重新返回当前时间点的所有数据,否则数据会重复;</p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("seekRecordPlayback",parameter)</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'>xdysdk.api("seekRecordPlayback",{"time":20})</pre><p>传入参数:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>time</td><td>int</td><td>必选要开始播放的时间点位置单位(秒)</td></tr></tbody></table><h2><a name='header-c839' class='md-header-anchor '></a>事件消息定义</h2><h3><a name='header-c840' class='md-header-anchor '></a>事件消息对照表</h3><pre class='md-fences mock-cm' style='display:block;position:relative'>//MessageId</pre><p>Class [课堂]:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>class_init_success</td><td>NSString</td><td>初始化课堂成功</td></tr><tr><td>class_join_success</td><td>NSString</td><td>加入课堂成功</td></tr><tr><td>class_update_roster_num</td><td>NSString</td><td>当前课堂人数更新</td></tr><tr><td>class_insert_roster</td><td>NSString</td><td>人员加入</td></tr><tr><td>class_delete_roster</td><td>NSString</td><td>人员离开</td></tr><tr><td>class_exit</td><td>NSString</td><td>课堂关闭</td></tr><tr><td>class_update_status</td><td>NSString</td><td>课堂信息更新</td></tr><tr><td>class_update_timer</td><td>NSString</td><td>课堂时间更新</td></tr><tr><td>class_record_start</td><td>NSString</td><td>课堂开始录制</td></tr></tbody></table><p>Chat [聊天]:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>chat_receive_message</td><td>NSString</td><td>接收聊天消息</td></tr></tbody></table><p>Video [视频]:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>video_play</td><td>NSString</td><td>播放视频</td></tr><tr><td>video_stop</td><td>NSString</td><td>关闭视频</td></tr><tr><td>video_broadcast</td><td>NSString</td><td>(视频)远程控制消息</td></tr></tbody></table><p>Audio [音频]:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>audio_play</td><td>NSString</td><td>播放音频</td></tr><tr><td>audio_stop</td><td>NSString</td><td>播放视频</td></tr><tr><td>audio_broadcast</td><td>NSString</td><td>(音频)远程控制消息</td></tr></tbody></table><p>Document [文档]:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>document_delete</td><td>NSString</td><td>文档删除</td></tr><tr><td>document_update</td><td>NSString</td><td>文档更新</td></tr></tbody></table><p>Whiteboard [标注]:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>whiteboard_annotation_update</td><td>NSString</td><td>标注更新</td></tr></tbody></table><p>Whiteboard [录制回放]:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>record_playback_update</td><td>NSString</td><td>录制回放状态更新</td></tr></tbody></table><p>Error [错误异常]:</p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>error_event</td><td>NSString</td><td>异常错误监听</td></tr></tbody></table><h2><a name='header-c982' class='md-header-anchor '></a>异常错误CODE</h2><h3><a name='header-c983' class='md-header-anchor '></a>ERROR异常消息</h3><p>监听异常错误消息</p><pre class='md-fences mock-cm' style='display:block;position:relative'>error_event</pre><p><strong>示例代码</strong></p><pre class='md-fences mock-cm' style='display:block;position:relative'></pre><h3><a name='header-c990' class='md-header-anchor '></a>错误码对照表</h3><pre class='md-fences mock-cm' style='display:block;position:relative'>//ErrorCode</pre><p>ErrorCode:</p><table><thead><tr><th style='text-align:left;' >字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td style='text-align:left;' >100</td><td>NSNumber</td><td>[初始化] 参数错误</td></tr><tr><td style='text-align:left;' >101</td><td>NSNumber</td><td>[初始化] 网络错误</td></tr><tr><td style='text-align:left;' >102</td><td>NSNumber</td><td>[初始化] 协议错误</td></tr><tr><td style='text-align:left;' >103</td><td>NSNumber</td><td>[初始化] 验证失败</td></tr><tr><td style='text-align:left;' >104</td><td>NSNumber</td><td>[初始化] 验证失败,课堂号必填</td></tr><tr><td style='text-align:left;' >105</td><td>NSNumber</td><td>[初始化] 验证失败,无效的课堂号</td></tr><tr><td style='text-align:left;' >106</td><td>NSNumber</td><td>[初始化] 验证失败,没有对应的站点</td></tr><tr><td style='text-align:left;' >107</td><td>NSNumber</td><td>[初始化] 验证失败,站点已过期</td></tr><tr><td style='text-align:left;' >200</td><td>NSNumber</td><td>[加入课堂] 网络错误</td></tr><tr><td style='text-align:left;' >201</td><td>NSNumber</td><td>[加入课堂] 协议错误</td></tr><tr><td style='text-align:left;' >202</td><td>NSNumber</td><td>[加入课堂] 异常错误</td></tr><tr><td style='text-align:left;' >203</td><td>NSNumber</td><td>[加入课堂] 参数错误</td></tr><tr><td style='text-align:left;' >204</td><td>NSNumber</td><td>[加入课堂] 人数已满</td></tr><tr><td style='text-align:left;' >205</td><td>NSNumber</td><td>[加入课堂] MD5验证失败</td></tr><tr><td style='text-align:left;' >206</td><td>NSNumber</td><td>[加入课堂] 密码错误</td></tr><tr><td style='text-align:left;' >207</td><td>NSNumber</td><td>[加入课堂] 已经在其它地方登陆</td></tr><tr><td style='text-align:left;' >208</td><td>NSNumber</td><td>[加入课堂] 有相同身份的人员加入课堂,自己被踢出课堂</td></tr><tr><td style='text-align:left;' >300</td><td>NSNumber</td><td>[课堂] 获取classDetail失败</td></tr><tr><td style='text-align:left;' >301</td><td>NSNumber</td><td>[课堂] 获取ClassParam失败</td></tr><tr><td style='text-align:left;' >500</td><td>NSNumber</td><td>[APE] 在sdk为初始化或未加入课堂之前调用发送数据接口</td></tr><tr><td style='text-align:left;' >501</td><td>NSNumber</td><td>[APE] 在接口调用时参数错误</td></tr><tr><td style='text-align:left;' >600</td><td>Number</td><td>[DOC] 删除文档失败</td></tr><tr><td style='text-align:left;' >601</td><td>NSNumber</td><td>[DOC] 删除文档失败,参数错误</td></tr><tr><td style='text-align:left;' >700</td><td>NSNumber</td><td>sdk还没初始化</td></tr><tr><td style='text-align:left;' >701</td><td>NSNumber</td><td>调用的接口不存在</td></tr><tr><td style='text-align:left;' >702</td><td>NSNumber</td><td>调用的接口,传递的参数不正确</td></tr><tr><td style='text-align:left;' >804</td><td>NSNumber</td><td>视频推流失败</td></tr><tr><td style='text-align:left;' >910</td><td>NSNumber</td><td>初始化录制回放失败</td></tr><tr><td style='text-align:left;' >911</td><td>NSNumber</td><td>获取录制回放数据失败</td></tr><tr><td style='text-align:left;' >10000</td><td>NSNumber</td><td>网络错误</td></tr><tr><td style='text-align:left;' >10001</td><td>NSNumber</td><td>未知错误</td></tr><tr><td style='text-align:left;' >20000</td><td>NSNumber</td><td>MCU断开连接,已经离开课堂</td></tr></tbody></table><h2><a name='header-c1127' class='md-header-anchor '></a>角色身份对照表</h2><h3><a name='header-c1128' class='md-header-anchor '></a>角色身份对照表</h3><pre class='md-fences mock-cm' style='display:block;position:relative'>//userRole</pre><p><strong>userRole [角色身份]:</strong></p><table><thead><tr><th>字段</th><th>类型</th><th>描述</th></tr></thead><tbody><tr><td>normal</td><td>NSString</td><td>role=1 (普通人/学生)</td></tr><tr><td>record</td><td>NSString</td><td>role=2 (管理)</td></tr><tr><td>host</td><td>NSString</td><td>role=4(主持人/老师)</td></tr><tr><td>presenter</td><td>NSString</td><td>role=8(主讲人)</td></tr><tr><td>assistant</td><td>NSString</td><td>role=16(助教)</td></tr><tr><td>invisible</td><td>NSString</td><td>role=32(监课)</td></tr></tbody></table><p></p>
<!-- ***********************************************************内容分割线****************************************************************** -->
</article>
</div>
</div>
<script src="./markdownToc_files/jquery-1.10.2.min.js"></script>
<script src="./markdownToc_files/jquery.ztree.all-3.5.min.js"></script>
<script src="./markdownToc_files/jquery.ztree_toc.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#tree').ztree_toc({
is_auto_number: false,
documment_selector: '.markdown-body',
is_expand_all: true
});
});
</script>
</body>
</html>