

[>>官网最新SDK下载地址](https://download.bokecc.com/#live)

[>>历史版本SDK版本下载地址](https://hdgit.bokecc.com/ccvideo/Live_Android_Play_SDK/-/releases)

## 目录

- [目录](#目录)
- [Release4.19.1](#release4191)
- [Release4.19.0](#release4190)
- [Release4.18.0](#release4180)
- [Release4.17.0](#release4170)
- [Release4.16.0](#release4160)
- [Release4.14.0](#release4140)
- [Release4.12.0](#release4120)
- [Release4.11.0](#release4110)
- [Release4.10.0](#release4100)
- [Release4.9.0](#release490)
- [Release4.8.0](#release480)
- [Release4.7.0](#release470)
- [Release4.6.1](#release461)
- [Release4.6.0](#release460)
- [Release4.5.0](#release450)
- [Release4.3.0](#release430)
- [Release4.2.0](#release420)
- [Release4.1.0](#release410)
- [Release4.0.0](#release400)


## Release4.22.0

1. 更新日志

   1. 修复已知问题
   2. 增加清除在线回放方法；

2. 远端集成

   ```groovy
   //doc sdk集成，内部依赖dwlivesdk，可参考demo源码自定义界面
   api 'com.bokecc.doc:docsdk:4.22.0'
   ```

## Release4.19.1

1. 更新日志

   1. 修复无延迟多人连麦无法上麦问题

2. 远端集成

   ```groovy
   //下述两种方式集成：
   //1. UI sdk集成，demo源码aar，内部依赖docsdk与dwlivesdk，套用demoUI，不可修改
   api 'com.bokecc:CCLiveUILib:4.19.1'
   //2. doc sdk集成，内部依赖dwlivesdk，可参考demo源码自定义界面
   api 'com.bokecc.doc:docsdk:4.19.1'
   ```



## Release4.19.0

1. 更新日志

   1. 在线回放新增文档跟随功能

2. 远端集成

   ```groovy
   //下述两种方式集成：
   //1. UI sdk集成，demo源码aar，内部依赖docsdk与dwlivesdk，套用demoUI，不可修改
   api 'com.bokecc:CCLiveUILib:4.19.0'
   //2. doc sdk集成，内部依赖dwlivesdk，可参考demo源码自定义界面
   api 'com.bokecc.doc:docsdk:4.19.0'
   ```



## Release4.18.0

1. 更新日志

   1. 新增课件下载功能

2. 远端集成

   ```groovy
   //下述两种方式集成：
   //1. UI sdk集成，demo源码aar，内部依赖docsdk与dwlivesdk，套用demoUI，不可修改
   api 'com.bokecc:CCLiveUILib:4.18.0'
   //2. doc sdk集成，内部依赖dwlivesdk，可参考demo源码自定义界面
   api 'com.bokecc.doc:docsdk:4.18.0'
   ```

3. 课件下载功能说明：见 [直播课件下载功能](4.x直播接入文档.html#224-课件下载) 和 [回放课件下载功能](4.x回放接入文档.html#32-课件下载) 



## Release4.17.0

1. 更新日志

   1. 新增直播带货商品回调

   2. 修复已知问题

2. 远端集成

   ```groovy
   //下述两种方式集成：
   //1. UI sdk集成，demo源码aar，内部依赖docsdk与dwlivesdk，套用demoUI，不可修改
   api 'com.bokecc:CCLiveUILib:4.17.0'
   //2. doc sdk集成，内部依赖dwlivesdk，可参考demo源码自定义界面
   api 'com.bokecc.doc:docsdk:4.17.0'
   ```

   

## Release4.16.0

1. 更新日志

   1. 直播文档显示支持跟随讲师模式

   2. 聊天区长图显示长图图标
   3. 修复已知问题

2. 远端集成

   ```groovy
   //下述两种方式集成：
   //1. UI sdk集成，demo源码aar，内部依赖docsdk与dwlivesdk，套用demoUI，不可修改
   api 'com.bokecc:CCLiveUILib:4.16.0'
   //2. doc sdk集成，内部依赖dwlivesdk，可参考demo源码自定义界面
   api 'com.bokecc.doc:docsdk:4.16.0'
   ```

   

## Release4.14.0

1. 更新日志

   1. 支持 UI SDK方式对接

   2. 适配 pad
   3. 升级聊天室组件
   4. 优化UI体验

2. 远端集成

   ```groovy
   //下述两种方式集成：
   //1. UI sdk集成，demo源码aar，内部依赖docsdk与dwlivesdk，套用demoUI，不可修改
   api 'com.bokecc:CCLiveUILib:4.14.0'
   //2. doc sdk集成，内部依赖dwlivesdk，可参考demo源码自定义界面
   api 'com.bokecc.doc:docsdk:4.14.0'
   ```

3. 新增混淆策略

   ```
   -dontwarn com.badlogic.gdx.**
   -keep class com.aliyun.ams.ipdetector.Inet64Util{*;}
   -keep class com.alibaba.sdk.android.**{*;}
   -keep class com.ut.**{*;}
   -keep class com.ta.**{*;}
   ```

4. API 变动

   | 模块 | 调整 | API                             | 描述                                   |
   | ---- | ---- | ------------------------------- | -------------------------------------- |
   | 直播 | 新增 | `LiveDigestBean.getLiveScene()` | 0大班课、1研讨课，目前聊天组件需要使用 |
   |      |      |                                 |                                        |

   

## Release4.12.0

1. 更新日志

   1. 新增支持研讨会模式观看

   2. 权限申请逻辑优化
   3. 新增防录屏开关
   4. 修复已知bug

2. 远端集成

   ```groovy
   //文档sdk内部引用直播sdk：'com.bokecc:dwlivesdk:4.12.0，如果使用直播间带有文档的模板，建议使用文档 sdk
   api 'com.bokecc.doc:docsdk:4.12.0'
   ```



## Release4.11.0

1. 更新日志

   1. 新增VR直播功能

   2. 新增在线回放支持VR播放功能

2. 远端集成

   ```groovy
   //文档sdk内部引用直播sdk：'com.bokecc:dwlivesdk:4.11.0
   api 'com.bokecc.doc:docsdk:4.11.0'
   ```

3. 注意事项

   ```
   1. VR 直播、VR 回放功能仅支持具有 GPU 的设备（需要开启硬件加速）
   2. VR 直播、VR 回放功能需要设备支持陀螺仪传感器
   ```

4. API 变动

   | 模块 | 调整 | API                                   | 描述                                                         |
   | ---- | ---- | ------------------------------------- | ------------------------------------------------------------ |
   | 直播 | 新增 | enableVrSensorControl(boolean enable) | 设置 vr 重力感应开关，默认开启                               |
   | 直播 | 新增 | enableVrSplitView(boolean enable)     | 设置 vr 分屏开关，默认关闭                                   |
   | 直播 | 新增 | LiveDigestBean.isVrLive()             | 获取是否是 vr 直播，通过DWLive.getInstance().getLiveDigestInfo()获取 |
   | 回放 | 新增 | enableVrSensorControl(boolean enable) | 设置 vr 重力感应开关，默认开启                               |
   | 回放 | 新增 | enableVrSplitView(boolean enable)     | 设置 vr 分屏开关，默认关闭                                   |
   | 回放 | 新增 | boolean getIsVr()                     | 获取是否是 vr 视频                                           |

   

## Release4.10.0

1. 更新日志

   新增：

   1. SDK支持免登录、主次验证和白名单验证登录方式

   优化：

   1. Demo 应用市场审核自启动问题处理

   修复：

   1. 修复文档 ppt 特殊字符名称导致文档白屏问题

2. 远端集成

   ```groovy
   api 'com.bokecc.doc:docsdk:4.10.0'
   ```

3. api变动

   | 模块      | 调整                | API                                                          | 描述                                        | 备注 |
   | --------- | ------------------- | ------------------------------------------------------------ | ------------------------------------------- | ---- |
   | 直播      | 过时                | ~~TemplateInfo-name、description、status~~                   | 模版信息名称、描述、状态不再对外提供        |      |
   | 直播      | 删除                | ~~RoomInfo.id~~                                              | 删除此字段，使用 encryptId 替代             |      |
   | 直播      | 修改类型 int-->long | LiveInfo.liveDuration                                        | 增加精度                                    |      |
   | 直播/回放 | 新增                | LoginInfo.secondaryVerify/ReplayLoginInfo.secondaryVerify    | startLogin-主次验证场景设置字段             |      |
   | 直播      | 新增                | Viewer.avatar、customInfo、updateNameSwitch                  | 直播用户头像、自定义信息、修改昵称开关      |      |
   | 回放      | 新增                | Viewer.avatar                                                | 回放用户头像                                |      |
   | 直播      | 过时                | ~~DWLiveLoginListener.onException~~                          | 使用DWLiveLoginListener.onLoginFailed       |      |
   | 直播      | 新增                | DWLiveLoginListener.onLoginFailed                            | 替代DWLiveLoginListener.onException         |      |
   | 回放      | 过时                | ~~DWLiveReplayLoginListener.onException~~                    | 使用DWLiveReplayLoginListener.onLoginFailed |      |
   | 回放      | 新增                | DWLiveReplayLoginListener.onLoginFailed                      | 替代DWLiveReplayLoginListener.onException   |      |
   | 文档      | 过时                | ~~IDocView.captureBitmap()~~                                 | 文档截图（不带画笔）                        |      |
   | 文档      | 新增                | IDocView.captureBitmap(BaseDocCallback<Bitmap,String> callback) | 文档截图（带画笔）                          |      |

4. 对接说明

   * 新增登录方式对接

     ```
     本期迭代新增加支持：免登录验证（不输入昵称、密码）、新白名单验证、主次验证登录方式
     
     其中主次验证登录方式，如果为次验证登录，则需要设置`LoginInfo.secondaryVerify/ReplayLoginInfo.secondaryVerify` 字段的值为 1
     ```

   * 直播与回放登录方法 `startLogin`新增`onLoginFailed`回调，回调错误码与错误描述，如下：

     | 错误码   | 描述                                                 | 备注                           |
     | -------- | ---------------------------------------------------- | ------------------------------ |
     | 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，直接展示 |

     

## Release4.9.0

1. 更新日志

   1. 问答功能支持图文问答

   2. 聊天新增自定义表情，优化基础表情
   3. 修复部分已知bug
   4. demo兼容AndroidX
   
2. 远端集成

   ```groovy
   api 'com.bokecc.doc:docsdk:4.9.0'
   ```

3. api变动

   | 模块          | 调整 | API                                                          | 描述                                                         | 备注 |
   | ------------- | ---- | ------------------------------------------------------------ | ------------------------------------------------------------ | ---- |
   | 直播          | 新增 | `sendQuestionMsg(String question, List<String> imgPathList, BaseLiveCallback<String, QaSendErrorBean> callback)` | 发送带有图片的问答（兼容纯文字问答），question：问答文字，必填；imgPathList：图片本地地址（可读取地址），callback：回调 |      |
   | 直播/在线回放 | 新增 | `boolean isOpenCustomEmoji()`                                | 获取是否开启自定义表情功能                                   |      |
   | 直播/在线回放 | 新增 | `boolean isCustomEmojiDownloadComplete()`                    | 自定义表情是否下载完成                                       |      |
   | 直播/在线回放 | 新增 | `String getEmojiByName(String name)`                         | 通过表情名获取单个表情，返回表情本地路径                     |      |
   | 直播/在线回放 | 新增 | `ArrayList<CustomEmoji> getCustomEmojis()`                   | 获取所有的自定义表情                                         |      |
   | 直播          | 新增 | `Question.ExtraDTO`                                          | 新增extra数据字段，包含图片链接地址                          |      |
   | 直播          | 新增 | `Answer.ExtraDTO`                                            | 新增extra数据字段，包含图片链接地址                          |      |
   | 直播          | 过时 | ~~`Question.time`~~                                          | 此字段返回相对时间，单位为s，不利于扩展，使用millsTime字段替代，绝对时间，ms单位 |      |
   | 直播          | 过时 | ~~`Answer.receiveTime`~~                                     | 此字段返回相对时间，单位为s，不利于扩展，使用millsTime字段替代，绝对时间，ms单位 |      |

4. 参数说明

   QaSendErrorBean

   ```java
   		/**
        * 错误码
        */
       private int errorCode;
       /**
        * 错误信息
        */
       private String errorMsg;
   //状态码含义：
   //图片文件校验失败，包括 文件不存在、接口返回文件不合法
   QaSendErrorBean.ERROR_FILE_INVALID
     //输入内容为空，或者输入内容长度大于1000
   QaSendErrorBean.ERROR_CONTENT_INVALID
     //图片数量超出6张
   QaSendErrorBean.ERROR_IMG_NUMBER_INVALID
     //1s防抖
   QaSendErrorBean.ERROR_DEBOUNCE
     //直播未开始
   QaSendErrorBean.ERROR_NOT_LIVING
     //网络请求失败
   QaSendErrorBean.ERROR_REQUEST_FAILED
     //图片上传oss 失败
   QaSendErrorBean.ERROR_FILE_UPLOAD_FAILED
     //发送问答失败，socket抛出错误
   QaSendErrorBean.ERROR_JSON_PARSE_FAILED
     //房间没有问答模板
   QaSendErrorBean.ERROR_TEMPLATE_INVALID
     //网络错误
   QaSendErrorBean.ERROR_NETWORK_ERROR
     
   //单个文件错误码：
     //图片过大，请上传小于20M的图片
     QaSendErrorBean.QaSendImgError.ERROR_IMAGE_SIZE_INVALID
     //格式不支持，请选择JPG、PNG、GIF、JPEG、BMP格式的图片
     QaSendErrorBean.QaSendImgError.ERROR_IMAGE_SUFFIX_INVALID
     //上传文件时出现了错误，请重试
     QaSendErrorBean.QaSendImgError.ERROR_IMAGE_UPLOAD_FAILED
     //登录异常，请重新登录或者刷新后重试
     QaSendErrorBean.QaSendImgError.ERROR_LOGIN_FAILED
     //参数错误，请稍后重试，或联系客服
     QaSendErrorBean.QaSendImgError.ERROR_PARAMS_INVALID
     //哎呀，出了点问题。请稍后重试，或联系客服
     QaSendErrorBean.QaSendImgError.ERROR_UNSPECIFIED
     //图片校验失败，请重试
     QaSendErrorBean.QaSendImgError.ERROR_FILE_INVALID
     //图片文件不存在，请重试
     QaSendErrorBean.QaSendImgError.ERROR_FILE_NOT_EXISTS
   ```

   

   CustomEmoji

   ```java
       /**
        * 表情名称
        */
       private String name;
       /**
        * 表情本地路径
        */
       private String img;
   ```

   ExtraDTO
   
   ```java
   /**
     * 图片数组
     */
   private List<ImgDTO> img;
   ```
   
   ImgDTO
   
   ```java
   /**
     * 图片排序编号
     */
   private int order;
   /**
     * 图片链接地址
     */
   private String url;
   ```
   
   





## Release4.8.0

1. 更新日志

   1. 新增竖屏观看功能

   2. 加入聊天置顶功能
   3. 优化公告的显示和阅读
   4. 直播带货支持多平台链接
   5. 优化播放器和回放文档画笔下载

2. 远端集成

   ```groovy
   api 'com.bokecc.doc:docsdk:4.8.0'
   ```

3. api变动

   | 模块 | 调整 | API                                                          | 描述                 | 备注                                                         |
   | ---- | ---- | ------------------------------------------------------------ | -------------------- | ------------------------------------------------------------ |
   | 直播 | 新增 | LiveDigestBean getLiveDigestInfo                             | 获取直播相关信息     | startLogin成功后调用，需要判空，LiveDigestBean：icon-直播间logo |
   | 直播 | 新增 | DWLiveListener.onChatTop(ArrayList<CCChatTopBean> ccChatTopBeanList) | 回调聊天置顶列表     | CCChatTopBean：属性定义见参数说明                            |
   | 直播 | 新增 | DWLiveListener.onUnChatTop(ArrayList<String> chatIdList)     | 回调取消聊天置顶列表 |                                                              |

4. 参数说明

   CCChatTopBean

   ```java
   		/**
        * 置顶消息id
        */
       private String id;
       /**
        * 置顶消息内容
        */
       private String content;
       /**
        * 置顶消息发送者id
        */
       private String fromViewerId;
       /**
        * 置顶消息发送者昵称
        */
       private String fromViewerName;
       /**
        * 置顶消息发送者头像
        */
       private String fromViewerAvatar;
       /**
        * 置顶消息发送者分组id
        */
       private String fromViewerGroupId;
       /**
        * 值为1  主讲、推流端角色（publisher）
        * 值为2  助教端角色（teacher）
        * 值为3  主持人角色（host）
        * 值为4  学生、观看端角色（student）
        * 值为0  其它角色（other）
        */
       private int fromViewerRole;
   ```

   



## Release4.7.0

1. 更新日志

   1. 新增直播文档重试功能 

   2. 新增直播低延迟与多人连麦解耦 
   3. 新增在线回放文档重试功能 
   4. 新增抽奖老虎机样式 
   5. 新增红包雨自定义封面 
   6. 修复其他已知问题 
   7. 优化Demo层UI

2. 远端集成

   ```groovy
   api 'com.bokecc.doc:docsdk:4.7.0'
   ```

3. 注意事项

   对外api改动（直播和回放模块）：
   docLoadCompleteFailedWithIndex(int index)
   修改部分状态值含义，所有状态值及含义如下：

   | index 状态值 | 状态定义                                                     | 操作     |
   | ------------ | ------------------------------------------------------------ | -------- |
   | 0            | 文档组件加载完成                                             | 无       |
   | 3            | 文档组件加载失败（SDK内部已做重试逻辑，但仍失败需要退出重新进入房间） | 退出重进 |
   | 1            | 动态文档翻页成功                                             | 无       |
   | 5            | 动态文档翻页超时（展示文档刷新按钮，用户可手动触发文档重载） | 手动重试 |
   | 2            | 非动画文档(白板 图片)文档翻页完成                            | 无       |
   | 4            | 静态文档翻页失败（展示文档刷新按钮，用户可手动触发文档重载） | 手动重试 |
   | 6            | 画板翻页失败（展示文档刷新按钮，用户可手动触发文档重载）     | 手动重试 |
   | 9            | 文档翻页超时                                                 | 无       |
   | 10           | 静态文档翻页超时（展示文档刷新按钮，用户可手动触发文档重载） | 手动重试 |
   | 11           | 动态文档动画执行成功                                         | 无       |
   | 12           | 动态文档动画执行超时（内部重试）                             | 无       |
   | 13           | 动态文档加载成功                                             | 无       |
   | 14           | 动态文档加载失败（展示文档刷新按钮，用户可手动触发文档重载） | 手动重试 |

   

   对外API新增：

   | 模块 | 调整 | API                                                          | 描述                   | 备注                                                         |
   | ---- | ---- | ------------------------------------------------------------ | ---------------------- | ------------------------------------------------------------ |
   | 直播 | 新增 | reloadPageChange(BaseCallback<String> callback)              | 刷新当前页文档         | callback回调onSuccess为调用成功，回调onError为调用失败       |
   | 回放 | 新增 | reloadPageChange(BaseCallback<String> callback)              | 刷新当前页文档         | callback回调onSuccess为调用成功，回调onError为调用失败       |
   | 回放 | 新增 | IDocManagerListener.onPageInfoList(ArrayList<ReplayPageInfo> infoList) | 回调当前回放翻页信息   | 4.7.0之前版本DWLiveReplayListener的onPageInfoList方法不再回调，使用此方法替代 |
   | 回放 | 新增 | IDocManagerListener.onMetaDataLoadSuccess                    | 回调回放元数据下载完成 | 回放翻页、画笔等数据下载完成回调                             |
   | 回放 | 废弃 | ~~DWLiveReplayListener.onPageInfoList~~                      | 回放翻页信息           | 使用docsdk的回放文档功能时，此方法废弃不再使用               |



## Release4.6.1

1. 更新日志

   1. 新增隐私协议弹窗

   2. 新增权限申请弹窗

   3. 修复多人连麦流异常问题 

   4. 修复音频模式播放失败问题

   5. 修复1v1声网连麦切换网络窗口消失问题

   6. 修复切换视图文档显示不全问题

2. 远端集成

   ```groovy
   //文档sdk内部引用直播sdk，单独引入：api 'com.bokecc:dwlivesdk:4.6.1'
   api 'com.bokecc.doc:docsdk:4.6.1'
   ```

3. 注意事项

   ```
   1. CCBasePlayer.CCPlayerStatus中去除了RenderingStart状态
   2. DWLiveEngine的init方法由于权限合规修改，去除了非主进程调用检查，需要确保此方法调用是在主进程
   3. 全局混淆增加：
   -keep class com.tencent.tbs.** {
       *;
   }
   ```

   

## Release4.6.0

1. 更新日志

   1. 文档模块优化及升级

   2. 优化回放画笔数据加载 

   3. 修复横屏观看直播顶部样式问题 

   4. 修复网络重连后文档及音频状态异常问题

2. 远端集成

   ```groovy
   //文档sdk内部引用直播sdk，单独引入：api 'com.bokecc:dwlivesdk:4.6.0'
   api 'com.bokecc.doc:docsdk:4.6.0'
   ```

3. 因类路径变化，module中ELog等类报错，请重新导入类



## Release4.5.0

1. 更新日志

   1. 新增直播带货功能

2. 远端集成

   ```groovy
   api 'com.bokecc:dwlivesdk:4.5.0'
   ```



## Release4.3.0

1. 更新日志

   1. 新增直播邀请卡功能
   1. 新增直播问卷功能
   1. 优化已知问题

2. 远端集成

   ```groovy
   api 'com.bokecc:dwlivesdk:4.3.0'
   ```

## Release4.2.0

1. 更新日志

   1. 直播新增投票功能
   1. 直播新增红包雨功能
   1. 新增鉴黄直播结束提示
   1. 优化画笔流畅度

2. 远端集成

   ```groovy
   api 'com.bokecc:dwlivesdk:4.2.0'
   ```

3. api变动

   1. 新增DWLive.getInteractiveOngoing（获取正在进行的组件活动，直播登录后调用）

   2. 新增DWLiveListener.onLiveStop(boolean isNormal, String msg)，替代原DWLiveListener.onStreamEnd(boolean isNormal) 方法，增加返回结束直播提示语

   3. 过时DWLiveListener.onStreamEnd(boolean isNormal) 方法

## Release4.1.0

1. 更新日志
   1. 直播新增打赏功能
   1. 直播新增点赞功能
   1. 直播新增连麦网络状态回调
   1. 回放新增试看功能
   1. 修复视频宽高回调无效问题
   1. 文档加载失败优化
   1. 修复离线回放崩溃问题
   1. 修复抽奖统计问题
   
2. 远端集成

   ```groovy
   api 'com.bokecc:dwlivesdk:4.1.0'
   ```

3. 直播DWLive新增API

   ```java
   //获取互动组件配置信息
   public InteractionConfigure getInteractionConfigure()
   //获取互动组件token
   public void getInteractiveToken(BaseCallback<String> callback);
   
   //互动组件的配置
   public class InteractionConfigure {
       //点赞  0:关闭 1:直播间配置 2:全局配置
       private int likeSwitch = 0;
       //礼物配置
       private GiftConfigure giftConfigure;
   }
   //打赏组件的配置
   public class GiftConfigure {
       //0:关闭 1:直播间配置 2:全局配置
       private int giftSwitch = 0;
       //0:关闭 1: 左侧特效 2：全局特效
       private int specialEffects;
   }
   ```

4. 直播连麦RTCConnectListener中新增回调

   ```java
      /**
        * 推流网络状态
        * @param hdStreamQuality
        */
       void onPublishQuality(HDStreamQuality hdStreamQuality);
       /**
        * 拉流网络状态
        * @param userId 用户id
        * @param hdStreamQuality  网络信息
        */
       void onPlayQuality(String userId, HDStreamQuality hdStreamQuality);
   
   public class HDStreamQuality {
       /** 本机到服务器的往返时延(ms) */
       private int rtt;
       /**上行丢包(0~255)，数值越大丢包越高，丢包率 = pktLostRate/255 */
       private int pktLostRate;
       /**下行丢包率*/
       private int downLostRate;
       /** 上行综合网络质量(0~3)，分别对应优、良、中、差 */
       private int txQuality;
       /** 下行综合网络质量(0~3)，分别对应优、良、中、差*/
       private int rxQuality;
       /**音频码率*/
       private double akbps;
       /**视频码率*/
       private double vkbps;
   }
   ```

5. 在线回放DWLiveReplayListener新增回调

   ```java
   /**
    * 回调回放试看时长
    * @param trialDuration 单位秒
    */
   public void onTrialDuration(int trialDuration);
   ```

6. 修复直播普通模式(非连麦状态)、在线回放、离线回放视频宽高回调问题

   ```java
   public abstract class LiveRtmpPlayerCallBack {
      ...
      
       /**
        * 检测到视频宽高发生变化
        *
        * @param width  宽
        * @param height 高
        */
       public void onVideoSizeChanged(int width, int height) {
       }
   
      ...
   }
   
   public abstract class PlaybackPlayerListener {
      ...
       /**
        * 检测到视频宽高发生变化
        *
        * @param width  宽
        * @param height 高
        */
       public void onVideoSizeChanged(int width, int height) {
       }
   
       ...
   }
   ```

   

## Release4.0.0

1. 更新日志
   1. 在线回放新增自定义字段
   2. 直播、在线回放新增视频LOGO
   3. 修复以及优化一些已知问题
   4. 新增红包雨功能
   5. sdk内的图片地址链接HTTP换成HTTPS  
   6. 登陆字符限制为40
   7. 解决频繁获取androidID导致审核不通过

2. 远端集成

   ```groovy
   api 'com.bokecc:dwlivesdk:4.0.0'
   ```

3. 4.0.0开始不再提供本地jar包支持

  

4. 新增方法

   ```java
   
     
   // region -------------------- 在线回放 ---------------------
   //设置播放器监听
   public void setReplayPlayerListener(ReplayPlayerListener replayPlayerListener)
   //设置防录屏
   public void setAntiRecordScreen(Activity activity)
   //设置播放器显示模式
   public void setVideoType(CCBasePlayer.VideoType videoType)
   //获取视频总时长
   public long getDuration()
   //获取播放状态
   public CCBasePlayer.CCPlayerStatus getPlayStatus()
   //获取当前播放进度
   public long getCurrentPosition()
   //是否是播放中
   public boolean isPlaying()
   // endregion
     
   // region -------------------- 离线回放 ---------------------
   //设置离线回放播放器回调
   public void setReplayPlayerListener(ReplayPlayerListener replayPlayerListener)
   //设置视频拉伸模式
   public void setVideoType(CCBasePlayer.VideoType type)
   //获取当前播放状态
   public CCBasePlayer.CCPlayerStatus getPlayerStatus()
   //当前是否是播放中
   public boolean isPlaying()
   //是否处于可播放状态
   public boolean isInPlaybackState()
   //设置播放进度
   public void seekTo(long progress)
   //获取当前播放进度
   public long getCurrentPosition()
   //获取视频总时长
   public long getDuration()
   // endregion
   
   ```

5. 修改方法

   ```java
   // region -------------------- 在线回放 ---------------------
   //设置在线回放回调监听
   public void setReplayParams(DWLiveReplayListener replayListener)
   //开始播放
   public void start(Context context)
   // endregion
     
   // region -------------------- 离线回放 ---------------------
   //设置离线回放参数
   public void setReplayParams(DWLiveLocalReplayListener replayListener, DocView docView, String dir)
   //开始播放
   public void start(Context context)
     
   // endregion     
   
   ```

6. 废弃或删除方法

   ```java
   // region -------------------- 在线回放 ---------------------
   //设置在线回放的参数
   public void setReplayParams(DWLiveReplayListener replayListener, Context
            context, DWReplayPlayer player, DocView docView)
   //设置播放器
   public void setReplayPlayer(DWReplayPlayer player)
   //开始播放
   public void start(Surface surface)
   // endregion
     
   // region -------------------- 离线回放 ---------------------
   //开始播放
   public void start(Surface surface)  
   //释放播放器
   public void releasePlayer()
   // endregion
   ```
   
7. 在线回放功能升级指南

   1. 播放器修改

      4.0.0版本之前，需要在布局里面声明 `com.bokecc.livemodule.view.ResizeTextureView` ，并在代码层创建 `DWReplayPlayer` 对象。从4.0.0版本开始，您不需要再声明 `DWReplayPlayer` 播放器对象，在 `DWLiveReplayListener` 中，通过 `public void onPlayBackStreamViewPrepared(HDMediaView hdMediaView) ` 方法，返回播放器视图，您需要创建容器，并将返回的 `hdMediaView` 视图添加进容器即可，并在适当的回调方法中操作移除 `hdMediaView` 。

   2. 播放器事件监听修改

      ```java
      //在DWLiveReplayListener中新增重写以下回调
      @Override
      public void onPlayBackStreamViewPrepared(HDMediaView hdMediaView) {
          //返回的 hdMediaView 为直播播放器布局
      }
      //播放器注册监听修改
      DWReplayPlayer.setPlayerEventListener(PlayerEvent event);
      -->DWLiveReplay.getInstance().setReplayPlayerListener(ReplayPlayerListener replayPlayerListener);
      ```

   3. 开始播放修改

      ```java
      DWLiveCoreHandler.getInstance().start();
      -->DWLiveCoreHandler.getInstance().start(context);
      ```

   4. 防录屏修改

      ```java
      DWReplayPlayer.setAntiRecordScreen(activity);
      --> DWLiveReplay.getInstance().setAntiRecordScreen(activity);
      ```

      

   5. 其他修改

      所有播放器相关的操作将放到DWLiveReplay中进行调用

8. 离线回放升级指南

    1. 播放器修改

      4.0.0版本之前，需要在布局里面声明 `com.bokecc.livemodule.view.ResizeTextureView` ，并在代码层创建 `DWReplayPlayer` 对象。从4.0.0版本开始，您不需要再声明 `DWReplayPlayer` 播放器对象，在 `DWLiveLocalReplayListener` 中，通过 `public void onPlayBackStreamViewPrepared(HDMediaView hdMediaView) ` 方法，返回播放器视图，您需要创建容器，并将返回的 `hdMediaView` 视图添加进容器即可，并在适当的回调方法中操作移除 `hdMediaView` 。

   2. 播放器事件监听修改

      ```java
      //在DWLiveLocalReplayListener中新增重写以下回调
      @Override
      public void onPlayBackStreamViewPrepared(HDMediaView hdMediaView) {
          //返回的 hdMediaView 为直播播放器布局
      }
      //播放器注册监听修改
      DWReplayPlayer.setPlayerEventListener(PlayerEvent event);
      -->DWLiveLocalReplay.getInstance().setReplayPlayerListener(ReplayPlayerListener replayPlayerListener);
      ```

   3. 开始播放修改

      ```java
      DWLiveCoreHandler.getInstance().start();
      -->DWLiveCoreHandler.getInstance().start(context);
      ```

   4. 防录屏修改

      ```java
      DWReplayPlayer.setAntiRecordScreen(activity);
      --> DWLiveReplay.getInstance().setAntiRecordScreen(activity);
      ```

      

   5. 其他修改

      所有播放器相关的操作将放到DWLiveReplay中进行调用
      另外播放完成不需要调用stop
   


## Release3.18.0

1. 更新日志
   1. 支持多人连麦功能
   2. 支持适配直播观看模式
   3. 修复在线回放画笔重叠问题
   
2. 远端集成

   ```groovy
   api 'com.bokecc:dwlivesdk:3.18.0'
   ```

3. 本地集成

   ```groovy
   删除旧版本dwlivesdk.jar，导入dwlivesdk-3.18.0.jar
   CommonLib-1.1.3.jar替换为CommonLib-1.1.4.jar
   删除旧版本的rtc.jar
   新增CCStreamALib-1.0.9.jar
   新增CCStreamPlayerLib-1.0.5.jar
   新增CCStreamTLib-1.0.9.jar
   新增ClassBaseLib-6.9.3.jar
   新增liteavsdk-8.8.10263.jar
   新增MqttService-1.1.1.jar
   新增mqttv3-1.2.0.jar
   新增RtsNetSDK-1.6.1.jar
   jniLibs新增 libliteavsdk.so libRtsSDK.so libsoundtouch.so libtraeimp-rtmp.so libtxffmpeg.so
   ```

4. 新增方法

   ```java
   
     
   // region -------------------- 直播对外设置相关 ---------------------
   //设置播放器显示模式
   public void setVideoType(CCBasePlayer.VideoType videoType)
   // endregion
     
   // region -------------------- 连麦对外设置相关 ---------------------
   //设置流监听
   public void setPublishStreamListener(LiveRtmpPlayerCallBack callBack)
   //设置防录屏
   public void setAntiRecordScreen(Activity activity)
   //是否是多人连麦
   public boolean isMultiMediaCall()
   //发起多人连麦
   public void callInPreviewWithType(RtcCallBack rtcCallBack,BaseRtcClient.RtcConnectType type)
   //通过流id拉取远端流
   public void pullRemoteStream(String userId, PullRemoteStreamCallBack baseCallback)
   //通过id移除远端流
   public void removeRemoteStream(String userId,BaseCallback baseCallback)
   //拒绝连麦
   public void rejectCall()
   //同意连麦
   public void agreeCallInPreview(RtcCallBack rtcCallBack,BaseRtcClient.RtcConnectType audiovideo)
   //连麦过程中开启或者关闭麦克风
   public void setLocalAudioEnable(boolean enable)
   //连麦过程中开启或者关闭摄像头
   public void setLocalVideoEnable(boolean enable)
   //连麦过程中切换摄像头
   public void switchLocalCamera()
   // endregion
   
   ```

5. 修改方法

   ```java
   // region -------------------- 直播对外设置相关 ---------------------
   //开始直播
   public void start()-->public void start(Context context)
   //设置播放参数
   public void setDWLivePlayParams(DWLiveListener dwLiveListener, Context context, DocView docView, DWLivePlayer player)-->public void setDWLivePlayParams(DWLiveListener dwLiveListener, Context context, DocView docView)
     
     
   // endregion
   
   // region -------------------- 连麦对外设置相关 ---------------------
   //断开连麦
   public void disConnectSpeak()-->public void hangup()
   //拒绝连麦
   public void disConnectApplySpeak()-->public void rejectCall()
   //设置连麦回调监听
   public void setRtcClientListener(RtcClientListener rtcClientListener)-->public void setRtcClientListener(RTCConnectListener rtcClientListener)
     
   //设置直播播放音量大小
   public void setVolume(float left, float right)-->public void setVolume(float volume)
   // endregion
     
   
   ```

6. 废弃或删除方法

   ```java
   // region -------------------- 连麦对外设置相关 ---------------------
   //移除本地摄像头预览。废弃原因：连麦重构，断开连麦自动停止预览，用户手动从视图树移除HDMediaView即可
   public void removeLocalRender()
     
   //关闭资源。废弃原因：连麦重构，底层自动处理，不需要用户手动调用
   public void closeCamera()
     
   //发起连麦。废弃原因：连麦重构，使用callInPreView方法替代
   public void startVoiceRTCConnect()
   public void startRtcConnect()
     
   //设置预览。废弃原因：连麦重构，在发起连麦callback中返回预览视图，用户可选择性添加进视图树
   public void setLocalRender(CCRTCRender localRender)
   public void setRemoteRender(CCRTCRender remoteRender)
   public void setRtcClientParameters(RtcClientListener rtcClientListener, CCRTCRender
               localRender, CCRTCRender remoteRender)
   // endregion
     
   // region -------------------- 直播对外设置相关 ---------------------
     
   //直播设置播放view。废弃原因：重构在Callback里返回HDMediaView视图
   public void start(Surface surface)
     
   // endregion
   ```
   
7. 直播功能升级指南

   1. 播放器修改

      3.18.0版本之前，需要在布局里面声明 `com.bokecc.livemodule.view.ResizeTextureView` ，并在代码层创建 `DWLivePlayer` 对象。从3.18.0版本开始，您不需要再声明 `DWLivePlayer` 播放器对象，在 `DWLiveListener` 中，通过 `public void onLiveStreamViewPrepared(HDMediaView hdMediaView) ` 方法，返回播放器视图，您需要创建容器，并将返回的 `hdMediaView` 视图添加进容器即可，并在适当的回调方法中操作移除 `hdMediaView` 。

   2. 播放器事件监听修改

      ```java
      //在DWLiveListener中新增重写以下回调
      @Override
      public void onLiveStreamViewPrepared(HDMediaView hdMediaView) {
          //返回的 hdMediaView 为直播播放器布局
      }
      //播放器注册监听修改
      DWLivePlayer.setPlayerEventListener(PlayerEvent event);
      -->DWLive.getInstance().setPublishStreamListener(LiveRtmpPlayerCallBack event);
      ```

   3. 开始播放修改

      ```java
      DWLiveCoreHandler.getInstance().start();
      -->DWLiveCoreHandler.getInstance().start(mContext);
      ```

   4. 防录屏修改

      ```java
      DWLivePlayer.setAntiRecordScreen(activity);
      -->DWLive.getInstance().setAntiRecordScreen(activity);
      ```

      

   5. 其他修改

      ```java
      //不再需要在onStreamEnd(final boolean isNormal)回调中调用以下代码段
      // 暂停播放
      DWLive.getInstance().pause();
      ```

8. 连麦功能升级指南

   3.18.0版本加入了多人连麦的功能，并将单人连麦的API使用与多人连麦进行统一。如果您希望新接入多人连麦功能，在直播间管理后台开启多人连麦的功能后，您可以通过

   `连麦接入文档` 进行多人连麦功能的对接。如果您已经使用了单人连麦的功能，也需要根据文档进行单人连麦功能的修改

9. 无连麦功能接入或者依赖冲突解决

   如果您不使用sdk提供的多人连麦功能突，建议排除连麦库。如果您在使用sdk的过程中出现依赖冲突问题，也可以根据下面代码所示排除方案进行冲突依赖的排除。

   ```groovy
           api('com.bokecc:dwlivesdk:' + rootProject.ext.android.SDK_VERSION) {
   //            // drm冲突
   //            exclude group: 'com.bokecc', module: 'drm'
   //            // webrtc冲突
   //            exclude group: 'com.bokecc', module: 'hdwebrtc'
   //            // 播放器冲突
   //            exclude group: 'com.bokecc', module: 'CCStreamPlayerLib'
   //            // 云课堂sdk冲突（多人连麦，不使用多人连麦可以排除）
               exclude group: 'com.bokecc', module: 'ClassBaseLib'
   //            // tbs冲突（不使用x5内核，可以在初始化sdk关闭x5开关，并排除此库）
   //            exclude group: 'com.tencent.tbs.tbssdk', module: 'sdk'
           }
   ```
   

