#  关于如何接入SDK回放功能

本文主要介绍如何接入SDK回放功能，包括两大部分，核心功能和其他功能

- [关于如何接入SDK回放功能](#关于如何接入sdk回放功能)
  - [1. 回放核心功能](#1-回放核心功能)
    - [1.1 回放登录](#11-回放登录)
      - [1.1.1 主动调用api](#111-主动调用api)
      - [1.1.2 回调事件api](#112-回调事件api)
    - [1.2 回放播放视频和文档](#12-回放播放视频和文档)
      - [1.2.1 主动调用api](#121-主动调用api)
      - [1.2.2 回调事件api](#122-回调事件api)
      - [1.2.3 关键代码示例](#123-关键代码示例)
      - [1.2.4 集成说明](#124-集成说明)
  - [2. 回放其他功能](#2-回放其他功能)
    - [2.1 聊天功能](#21-聊天功能)
    - [2.2 问答功能](#22-问答功能)
    - [2.3 广播功能](#23-广播功能)
    - [2.4 回放页面信息](#24-回放页面信息)
    - [2.5 切换线路功能 (2021年10月08日之后不再进行维护)](#25-切换线路功能-2021年10月08日之后不再进行维护)
    - [2.6 清晰度切换](#26-清晰度切换)
    - [2.7 线路切换](#27-线路切换)
    - [2.8 音视频播放模式切换](#28-音视频播放模式切换)
    - [2.9 回放打点功能](#29-回放打点功能)
    - [3.0 回放随堂测功能](#30-回放随堂测功能)
    - [3.1 回放试看](#31-回放试看)

## 1. 回放核心功能

### 1.1 回放登录

#### 1.1.1 主动调用api

回放登录需要主动调用方法在DWLiveReplay.java（DWLiveReplay为单例）中，如下

| 方法                                                         | 说明                               |
| :----------------------------------------------------------- | :--------------------------------- |
| getInstance()                                                | 获取DWLiveReplay单例               |
| setLoginParams(DWLiveLoginListener dwLiveLoginListener, LoginInfo loginInfo) | (过时) 设置回放登录参数            |
| startLogin()                                                 | (过时) 开始登录                    |
| startLogin(ReplayLoginInfo, final DWLiveReplayLoginListener) | （>=3.14.0）设置登录参数并开始登录 |

登录所需参数ReplayLoginInfo如下

```java
// 用户ID  
private String userId;    
// 直播间ID
private String roomId;                 
// 直播ID                                                   
private String liveId;               
// 回放ID                                                 
private String recordId;               
// 观众名称                                                
private String viewerName;              
// 观众密码                                                
private String viewerToken;             
// 用户分组ID                                                
private String groupId;  
//自定义参数UA
private String userCustomUa; 
//自定义参数
private String userCustomInfo;
//主次验证标识 1：次验证 默认主验证
private int secondaryVerify;
```

#### 1.1.2 回调事件api

DWLiveReplayLoginListener

| 方法                                                | 说明                                       |
| --------------------------------------------------- | ------------------------------------------ |
| ~~onException(DWLiveException exception)~~          | ~~登录失败，4.10.0 版本过时~~              |
| onLogin(TemplateInfo templateInfo)                  | 登录成功                                   |
| onLogin(TemplateInfo templateInfo, Marquee marquee) | 登录成功 附带跑马灯信息Marquee（重写方法） |
| onLogin(TemplateInfo templateInfo, Viewer viewer)   | 登录成功 附个人信息Viewer（重写方法）      |
| onLoginFailed(int code, String message)             | 登录失败，4.10.0 版本新增                  |

返回信息同直播相同，登录成功可监听onLogin任意一个互调

onLogin(TemplateInfo templateInfo, Marquee marquee)为定制方法，如需使用到界面跑马灯可单独实现该回调

错误码枚举：

| 错误码   | 描述                                                 | 备注                           |
| -------- | ---------------------------------------------------- | ------------------------------ |
| 10000000 | 请求参数不正确，请检查后重试。                       |                                |
| 20270008 | 您的Token不存在，请重新登录。                        |                                |
| 10000001 | 系统出现异常，请稍后再试。                           |                                |
| 20200002 | 您的账户已过期，请联系客服处理。                     |                                |
| 10000034 | 您还未登录，请先登录后再试。                         |                                |
| 10000005 | 该回放不存在或已被删除，请检查后重试。               |                                |
| 10000007 | 该直播不存在或已被删除，请检查后重试。               |                                |
| 10000006 | 该直播间不存在或已被删除，请检查后重试。             |                                |
| 20290005 | 请求参数错误，请检查后重试。                         |                                |
| 20270000 | api登录调用失败，请检查网络连接后重试。              |                                |
| 20270011 | api登录调用超时，请检查网络连接后重试。              |                                |
| 20270002 | 名称或密码错误，请检查后重试。                       |                                |
| 20270001 | 请求参数错误，请检查后重试。                         |                                |
| 20270003 | 登录失败，请联系管理员添加你至白名单                 |                                |
| 20270004 | 该视频不属于当前账户，请联系客服。                   |                                |
| 20270005 | 该视频不可用，请联系客服。                           |                                |
| 20270006 | 获取播放地址失败，请检查网络连接后重试。             |                                |
| 20270010 | 获取打点信息失败，请联系客服。                       |                                |
| 20270007 | 该播放地址不存在或已被删除，请联系客服。             |                                |
| 20290009 | 不合法的产品线，请联系客服。                         |                                |
| 20270012 | 手机号验证失败，请检查输入后重试。                   |                                |
| 20270013 | 登记观看失败，请联系客服。                           |                                |
| 20270014 | 手机号验证失败，请检查输入后重试。                   |                                |
| 20270015 | 发送短信失败，请稍后再试。                           |                                |
| 20270016 | 该直播间未开启直播转回放功能，请联系客服。           |                                |
| 20270017 | 回放直播间与登录直播间不符，请联系客服。             |                                |
| 20270018 | 批量获取视频信息失败，请联系客服。                   |                                |
| 20270019 | 视频信息错误，请联系客服。                           |                                |
| 20270020 | 该极速回放视频没有内容，请联系客服。                 |                                |
| 20290015 | 企微绑定已失效，请重新绑定。                         |                                |
| 20290016 | 非法的企微绑定关系，请重新绑定。                     |                                |
| 20290017 | 该企微用户未在当前直播间下被授权，请联系管理员授权。 |                                |
| 20290001 | -                                                    | 接口验证返回 message，直接展示 |

### 1.2 回放播放视频和文档

#### 1.2.1 主动调用api

回放核心类代码在DWLiveReplay.java（DWLiveReplay为单例）如下

| 方法                                                         | 说明                                                  |
| ------------------------------------------------------------ | ----------------------------------------------------- |
| setReplayListener(DWLiveReplayListener replayListener)       | 设置在线回放回调                                    |
| setReplayPlayerListener(ReplayPlayerListener replayPlayerListener) | 设置播放器回调                                            |
| setReplayDocView(DocView docView)                            | 设置文档                                              |
| start(Context context)                                       | 开始播放                                              |
| stop()                                                       | 停止播放                                              |
| pause()                                                      | 暂停播放                                              |
| resume()                                                     | 恢复播放                                              |
| onDestroy()                                                  | 释放资源                                              |

视频相关的API

主动设置相关

| 方法                                                         | 说明                                                  |
| ------------------------------------------------------------ | ----------------------------------------------------- |
| setLastPosition(long position)                               | 设置开始播放位置，需在start之前调用                   |
| retryReplay(long position, boolean updateStream)             | 重试播放 <br />positon:播放位置updateStream更换流地址 |
| setSpeed(float speed)                                        | 设置播放速率                                          |
| changeLineWithPlayParameter(ReplayLineConfig ,ReplayLineSwitchListener) | (过时) 切换线路                                       |
| changeLineWithNum(int line, ReplayLineSwitchListener changeLineCallback) | (过时) 切换线路                                       |
| changeLine(int lineIndex, ReplayChangeSourceListener changeCallBack) | （>=3.13.0）切换线路                                  |
| changeQuality(int quality, ReplayChangeSourceListener)       | （>=3.13.0）切换清晰度                                |
| changePlayMode(PlayMode, ReplayChangeSourceListener )        | （>=3.13.0）切换音视频播放模式                        |
| setVideoType(CCBasePlayer.VideoType videoType)               | 设置视频视图显示类型(只有多人连麦的低延迟模式有效)                                     |
| disableVideo()                                               | 设置默认禁用视频(start前设置)                                      |

主动获取相关

| 方法                                                         | 说明                                                  |
| ------------------------------------------------------------ | ----------------------------------------------------- |
| getDuration()                              | 获取视频时长                   |
| getSpeed()             | 获取当前的倍速 |
| getPlayStatus()                                        | 获取当前的播放状态                                        |
| getCurrentPosition() | 获取当前的播放进度                                    |
| isPlaying() | 是否是播放中                                    |
| changeLine(int lineIndex, ReplayChangeSourceListener changeCallBack) | （>=3.13.0）切换线路                                  |
| changeQuality(int quality, ReplayChangeSourceListener)       | （>=3.13.0）切换清晰度                                |
| changePlayMode(PlayMode, ReplayChangeSourceListener )        | （>=3.13.0）切换音视频播放模式                        |
| setVideoType(CCBasePlayer.VideoType videoType)               | 设置视频视图显示类型(只有多人连麦的低延迟模式有效)                                     |
| disableVideo()                                               | 设置默认禁用视频(start前设置)                                      |


文档相关的API

主动设置相关

| 方法                                                         | 说明                                                  |
| ------------------------------------------------------------ | ----------------------------------------------------- |
| setDocScaleType(DocView.ScaleType type)                              | 设置文档拉伸模式                   |
| changeDocBackgroundColor(String color)             | 更改文档空白区颜色值 |


主动获取相关

| 方法                                                         | 说明                                                  |
| ------------------------------------------------------------ | ----------------------------------------------------- |
| isDocSupport()                              | 是否支持文档                   |

#### 1.2.2 回调事件api

回调事件同直播

#### 1.2.3 关键代码示例



设置文档展示的控件布局：

```xml
<com.bokecc.sdk.mobile.live.widget.DocView
    android:id="@+id/doc_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```

设置播放参数

```java      
...
                       
 // 1. 获取单例                                                                               
 dwLiveReplay = DWLiveReplay.getInstance();        
 // 2. 设置回调监听
 dwLiveReplay.setReplayListener(dwLiveReplayListener);
 // 3. 设置播放器状态回调                                                                     
 dwLiveReplay.setReplayPlayerListener(replayPlayerListener);  
 // 4. 设置文档
 dwLiveReplay.setReplayDocView(docView);   
 // 5. 开始观看
 dwLiveReplay.start(context);  
...
```

播放器回调

```java      
...
                       
 // 6. 监听DwLiveReplayListener会收到onPlayBackStreamViewPrepared(HDMediaView hdMediaView)                                                                              
 // 将hdMediaView添加到view上
...
```

#### 1.2.4 集成说明

完成上面的步骤后，基本上我们就能够观看到直播回放的视频画面和文档画面了，也就基本完成了获得场景视频直播回放的核心功能的集成，即观看回放视频和观看回放文档的功能。

## 2. 回放其他功能

功能使用时相关的核心类：DWLiveReplayListener（回放回调接口类），DWLiveReplay（回放核心类）。

### 2.1 聊天功能

回放的聊天功能只包括公共聊天内容，此功能为方法回调功能，相关类DWLiveReplayListener，相关方法如下：

| 方法                                                 | 说明             |
| ---------------------------------------------------- | ---------------- |
| onChatMessage(TreeSet<ReplayChatMsg> replayChatMsgs) | 收到回放聊天信息 |

其中回调回来的对象ReplayChatMsg属性信息如下

```java
// 聊天消息内容
private String content; 
// 分组ID
private String groupId;
// 聊天消息时间 秒
private int time;        
// 发送人用户名
private String userName;     
// 发送人userId
private String userId;     
// 发送人头像
private String avatar;
// 用户角色 
// 主讲（publisher）、助教（teacher）、主持人（host）、学生或观众（student）、其他没有角色（unknow）
private String userRole;
//发送人自定义标记
private String userCustomMark;
//是否显示此条消息（0: 不显示 1:显示）
private String status;
//发送人的角色 已过时
private int classRole;
```

主动获取聊天数据 相关类DWLiveReplay

| 方法                                                         | 说明                                     |
| ------------------------------------------------------------ | ---------------------------------------- |
| getAllChats(final BaseFunction<TreeSet<ReplayChatMsg>> func) | 获取回放聊天信息（需在播放成功之后调用） |

### 2.2 问答功能

回放的问答的功能包括已公开回答问答和已发布的答案，此功能为方法回调功能，相关类DWLiveReplayListener相关方法如下：

| 方法                                          | 说明             |
| --------------------------------------------- | ---------------- |
| onQuestionAnswer(TreeSet<ReplayQAMsg> qaMsgs) | 获取回放问答信息 |

返回对象ReplayQAMsg包含问题和回答列表，如何操作该类消息，请查看demo

主动获取问答数据 相关类DWLiveReplay

| 方法                                                     | 说明               |
| -------------------------------------------------------- | ------------------ |
| getAllQAs(final BaseFunction<TreeSet<ReplayQAMsg>> func) | 获取所有的问答数据 |

其中 ReplayQuestionMsg 数据中包含的字段信息如下：

```java
//问答ID
private String questionId;
//问答内容
private String content;
//分组ID
private String groupId;
//问答发布时间 秒 （相对时间）
private int time;
//发送人ID
private String questionUserId;
//发送人昵称
private String questionUserName;
//发送人头像
private String questionUserAvatar;
// 是否是发布的问题
private int isPublish; 
```

其中 ReplayAnswerMsg 数据中包含的字段信息如下：

```java
//回复内容
private String content;
//分组ID
private String groupId;
//发布回复的时间 秒 （相对时间）
private int time;
//发送人昵称
private String userName;
//发送人ID
private String userId;
//发送人头像
private String userAvatar;
//发送人角色 （具体参考 回放用到的 “角色” 字段含义）
private String userRole;

```

### 2.3 广播功能

回放的广播的功能是直播时发布的广播信息列表，此功能为方法回调功能，相关类DWLiveReplayListener，相关方法如下：

| 方法                                                         | 说明         |
| ------------------------------------------------------------ | ------------ |
| onBroadCastMessage(ArrayList<ReplayBroadCastMsg> broadCastMsgList) | 获取广播信息 |

返回对象ReplayBroadCastMsg属性信息如下

```java
// 广播内容   
private String content;                                 
//  广播时间（单位：秒）                                                                     
private int time;                                
// 发广播的人的ID                                                                     
private String publisherId;                           
// 发广播的人的名字                                                                    
private String publisherName;                          
 // 发广播的人的角色                                                                     
//主讲（publisher）、助教（teacher）、主持人（host）、学生或观众（student）、其他没有角色（unknow）
private String publisherRole;                        
```

主动获取广播数据 相关类DWLiveReplay

| 方法                                                         | 说明               |
| ------------------------------------------------------------ | ------------------ |
| getAllBoardCasts(final BaseFunction<ArrayList<ReplayBroadCastMsg>> func) | 获取所有的广播数据 |

### 2.4 回放页面信息

回放页面信息是通过回调返回给上层调用，此功能为回调功能，相关类是DWLiveReplayListener，相关方法如下

| 方法                                                         | 说明               |
| ------------------------------------------------------------ | ------------------ |
| onPageInfoList(ArrayList<ReplayPageInfo> infoList)           | 回放页面信息       |
| onPageChange(String docId, String docName, int docWidth ,int docHeight, int pageNum, int docTotalPage); | 回调当前翻页的信息 |

返回列表对象ReplayPageInfo属性信息如下：

```java
// 当前文档名称               
private String docName;     
// 当前文档页面的标题  
private String pageTitle;      
// 当前文档页面的链接  
private String url;       
// 当前文档页面的翻页时间（单位：S） 
private int time;       
```

### 2.5 切换线路功能 (2021年10月08日之后不再进行维护)

由于该方法不兼容清晰度的切换，故废弃该方法，使用**2.6清晰度切换**和**2.7线路切换**替代

回放可根据返回的线路索引进行线路切换

主动调用方法

| 方法                                                         | 说明               |
| ------------------------------------------------------------ | ------------------ |
| changeLineWithPlayParameter(ReplayLineConfig config, ReplayLineSwitchListener callback) | 切换音视频线路、清晰度方法,已过时 |

监听回调方法在DWLiveReplayListener中

| 方法                                                         | 说明                                 |
| ------------------------------------------------------------ | ------------------------------------ |
| numberOfReceivedLines(int lines)                             | 回放线路回调，已过时                 |
| numberOfReceivedLinesWithVideoAndAudio(List<ReplayVideoLineParams> videoLines, ReplayAudioLineParams audioLines) | 回放线路 清晰度回调,已过时 |

参数属性信息如下：

- 主动调用方法中ReplayLineConfig属性信息如下

  ```java
  //是否启用视频
  private boolean disableVideo = false;
  //线路索引  音频是视频都存在多条线路
  private ReplayLineParams replayLineConfig;
  ```

  ReplayLineParams属性信息如下

  ```java
  //线路 对应ReplayVideoLineParams ReplayAudioLineParams中的lines
  private int lineNum = 0;
  //清晰度  如果是音频模式 设置无效
  private int quality = 0;
  ```

- 回调方法中ReplayVideoLineParams属性信息如下

  **注意**  lines 该属性信息代表的是线路列表，如0，1；0代表线路1，1代表线路2，对应主动调用方法中的lineNum

  ```java
  //线路列表
  private List<Integer> lines ;
  //清晰度
  private int quality = 0;
  //清晰度描述
  private String desp;
  ```

  ReplayAudioLineParams属性信息如下

  ```java
  //线路列表
  private List<Integer> lines;
  ```



### 2.6 清晰度切换

回放可根据返回的清晰度列表进行清晰度切换

主动调用方法

| 方法                                                         | 说明                       |
| ------------------------------------------------------------ | -------------------------- |
| changeQuality(int quality, ReplayChangeSourceListener changeCallBack) | 切换清晰度 |

监听回调方法在DWLiveReplayListener中，该api会存在多次回调  如：切换清晰度、调用开始播放api、从音频切回到视频模式

| 方法                                                         | 说明                                 |
| ------------------------------------------------------------ | ------------------------------------ |
| onHDReceivedVideoQuality(List<ReplayQualityinfo> videoQuality, ReplayQualityinfo currentQuality) | 回调清晰度列表和当前播放的清晰度              |

主动调用方法中ReplayChangeSourceListener类说明如下

```java
 public interface ReplayChangeSourceListener {
    /**
     * 切换回调
     * @param success 是否成功
     *                -2：切换时间间隔小于3s
     *                -1：切换的数据不正确
     *                0 ：切换成功
     */
    void onChange(int success);
}
```

回调方法中ReplayQualityinfo类属性信息如下：

```java
 /**
  * 清晰度的code值，对应主动调用方法中的quality参数
  */
private int quality;
 /**
  * 清晰度描述
  */
private String desc;
```



### 2.7 线路切换

回放可根据返回的线路列表进行线路切换

主动调用方法

| 方法                                                         | 说明     |
| ------------------------------------------------------------ | -------- |
| changeLine(int index,ReplayChangeSourceListener changeCallBack) | 切换线路 |

监听回调方法在DWLiveReplayListener中，该api会存在多次回调  如：切换清晰度、调用开始播放api、音频/视频模式切换

| 方法                                                         | 说明                             |
| ------------------------------------------------------------ | -------------------------------- |
| onHDReceivedVideoAudioLines(List<ReplayLineInfo> lines, int currentLineIndex) | 回调清晰度列表和当前播放的清晰度 |

主动调用方法中ReplayChangeSourceListener类说明如下

```java
 public interface ReplayChangeSourceListener {
    /**
     * 切换回调
     * @param success 是否成功
     *                -2：切换时间间隔小于3s
     *                -1：切换的数据不正确
     *                0 ：切换成功
     */
    void onChange(int success);
}
```

回调方法中ReplayLineInfo参数属性信息如下：

```java
   /**
    * 线路名称，该属性参数表示线路代号，如：line1、line2 ...
    * 主动调用时传入List<ReplayLineInfo>的索引
    */
 private String line;

```

### 2.8 音视频播放模式切换

回放可切换播放模式

主动调用方法

| 方法                                                         | 说明         |
| ------------------------------------------------------------ | ------------ |
| changePlayMode(PlayMode playMode,ReplayChangeSourceListener changeCallBack) | 切换播放模式 |

监听回调方法在DWLiveReplayListener中， 该api会存在多次回调  如：调用开始播放api、音频/视频模式切换

| 方法                          | 说明             |
| ----------------------------- | ---------------- |
| onHDAudioMode(Audio hasAudio) | 是否开启音频模式 |

主动调用方法中PlayMode 参数属性信息如下：

```java
  /**
     * 播放模式
     * VIDEO: 视频播放模式
     * SOUND: 音频播放模式
     */
    public enum PlayMode {
        VIDEO, SOUND
    }
```

ReplayChangeSourceListener详细说明如下

```java
public interface ReplayChangeSourceListener {
    /**
     * 切换回调
     * @param success 是否成功
     *                -2：切换时间间隔小于3s
     *                -1：切换的数据不正确
     *                0 ：切换成功
     */
    void onChange(int success);
}
```

回调方法中Audio类参数信息如下：

```java
   /**
     * 音频模式
     * HAVE_AUDIO_LINE_TURE: 有音频模式
     * HAVE_AUDIO_LINE_FALSE: 无音频模式
     */
    public enum Audio {
        HAVE_AUDIO_LINE_TURE, HAVE_AUDIO_LINE_FALSE
    }
```

### 2.9 回放打点功能

回放打点功能，可根据返回的打点数据展示打点数据，界面显示请参考demo

DWLiveReplayListener类监听回调方法

| 方法                                       | 说明             |
| ------------------------------------------ | ---------------- |
| onHDReplayDotList(List<ReplayDot> dotList) | 回放打点数据列表 |

其中ReplayDot类属性如下

```java
// 对应回放的时间 单位（秒）                  
private int time;    
// 打点描述                
private String desc; 
```

### 3.0 回放随堂测功能

回放随堂测功能

DWLiveReplay类主动获取

| 方法                                                         | 说明               |
| ------------------------------------------------------------ | ------------------ |
| getAllPractices(final BaseFunction<ArrayList<ReplayPracticeInfo>> func) | 回放随堂测数据列表 |

其中ReplayPracticeInfo类属性如下

```java
//随堂测统计数据
private PracticeStatisInfo statisInfo;
//随堂测排名数据
private PracticeRankInfo rankInfo;
//回放随堂测数据
private ReplayPracticeInfoBase replayPracticeInfoBase;

public class PracticeStatisInfo {
    private String id;             // 随堂测ID
    private int type;              // 随堂测类型: 0 判断 1 单选 2 多选
    private int status;            // 随堂测状态  1 发布中 2 停止发布
    private int answerPersonNum;   // 回答该随堂测的人数
    private int correctPersonNum;  // 回答正确的人数
    private String correctRate;    // 正确率
    private int stopTime;          // 停止时间
    private ArrayList<OptionStatis> optionStatis; // 选项的统计信息
  	public static class OptionStatis {
        private String id;  		//  选项ID
        private int index; 			// 选项编号
        private int count; 			// 选择该选项的人数
        private String percent; 	// 选择的比例
        private int isCorrect;  	// 是否为正确选项 1 正确 0 错误
  	}
}
public class PracticeRankInfo {
    // 排名id:暂不可用
    private String id;
    // 排名人员信息
    private ArrayList<ViewerRankInfo> rankList = new ArrayList<>();
  	public class ViewerRankInfo {
            //提交者的用户id
    		private String viewerId;
        	//提交者的名称
    		private String viewerName;
        	//提交答案的时间与随堂测发布的时间的差值
    		private int costTime;				
  	}
}
public static class ReplayPracticeInfoBase {
        private String id;              //随堂测ID
        private int type;               //随堂测类型（判断：0，单选：1，多选：2）
        private int status;             //状态（正在发布：1  已停止：2）
        private String publishTime;     //发布时间
        private long recordId;          //回放ID
        private int recordTime;         //相对于回放开始时长
        private int stopRecordTime;     //相对于回放开始停止时长
        private int closeRecordTime;    //相对于回放开始关闭时长
        private List<Option> options;   //选项
  	public static class Option {
            private double index;       //选项（0,1,2,3）
            private String id;          //选项ID
            private double isCorrect;   //是否正确（1：正确0：错误）
    }
}
```

### 3.1 回放试看

回放试看功能

DWLiveReplayListener类监听回调方法

| 方法                                                         | 说明               |
| ------------------------------------------------------------ | ------------------ |
| onTrialDuration(int trialDuration) | 回放试看时间点（trialDuration单位为秒） |



### 3.2 课件下载

版本：>=4.18.0

使用说明：

进入房间，调用`getIsAllowCoursewareDownload`获取课件下载开关，开关打开状态下， 调用`getCoursewareList`获取当前可供下载的课件列表，当点击下载按钮时，调用`getCoursewareDownUrl`获取下载链接（具有时效性，请立即开始下载）。

回放新增API（DWLiveReplay）：

```java
 
    /**
     * 获取是否允许下载课件
     * @return false不允许，true允许
     */
    public abstract boolean getIsAllowCoursewareDownload();
		/**
     * 获取课件下载列表
     *
     * @param pageNum   页码，从1开始
     * @param pageCount 每页数量，最多50
     * @param callback  回调
     */
    public abstract void getCoursewareList(int pageNum, int pageCount, BaseLiveCallback<CoursewareInfo, Integer> callback);

    /**
     * 获取课件下载地址
     *
     * @param docId    课件ID
     * @param callback 回调
     */
    public abstract void getCoursewareDownUrl(String docId, BaseLiveCallback<String, Integer> callback);

```



CoursewareInfo：

```java
public class CoursewareInfo {

    /**
     * 文件类型
     */
    public static final int FILE_TYPE_PDF = 0; // pdf
    public static final int FILE_TYPE_DOC = 1; // word
    public static final int FILE_TYPE_PPT = 2; // ppt
    public static final int FILE_TYPE_IMAGE = 3; // 图片jpg
    public static final int FILE_TYPE_GIF = 4; // 图片gif
    public static final int FILE_TYPE_HTML = 5; //H5课件
    public static final int FILE_TYPE_H5_ZIP = 6; //H5课件,ZIP包格式


    /**
     * 文档信息
     */
    private List<DocsDTO> docs;
    /**
     * 翻页信息
     */
    private PaginationDTO pagination;



    public static class PaginationDTO {
        private int totalCount;
        private int pageCount;


    }

    public static class DocsDTO {
        /**
         * 文档ID
         */
        private String id;
        /**
         * 文档显示标题，使用name进行后缀判断
         */
        private String title;
        /**
         * 带后缀名称
         */
        private String name;

        /**
         * 上传时间
         */
        private String uploadTime;
        /**
         * 状态，0，未推送，1，已推送
         */
        private int status;
        /**
         * 发送状态，0，取消，1，推送，收到推送取消消息时使用此字段判断是否显示隐藏item
         */
        private int sendStatus;
        /**
         * 文件大小，字节
         */
        private long fileSize;
        /**
         * 对应文档类型
         */
        private int type;

    }
}

```

