# FAQ

| 版本     | 日期       | 备注 |
| -------- | ---------- | ---- |
| FAQ_v1.0 | 2020-08-04 |      |
| FAQ_v1.1 | 2021-02-03 |      |
**目录**

- [FAQ](#faq)
  - [一、说明](#一说明)
  - [二、常见问题](#二常见问题)
    - [1. 常见集成问题](#1-常见集成问题)
      - [1.1 找不到maven库](#11-找不到maven库)
      - [1.2 hddownload.jar下载框架](#12-hddownloadjar下载框架)
      - [1.3 登录和播放在同一个界面](#13-登录和播放在同一个界面)
      - [1.4 安卓 9.0之上网络兼容](#14-安卓-90之上网络兼容)
      - [1.5 集成文档的建议](#15-集成文档的建议)
    - [2. 常见错误](#2-常见错误)
      - [2.1  class not found](#21--class-not-found)
      - [2.2  x5混淆错误](#22--x5混淆错误)
      - [2.3  lib包冲突](#23--lib包冲突)
      - [2.4  登录直播间失败](#24--登录直播间失败)
      - [2.5 oom错误](#25-oom错误)
    - [3. 升级常见问题](#3-升级常见问题)
      - [3.1 升级到3.8.0/3.8.1](#31-升级到380381)
      - [3.2 升级到3.9.0](#32-升级到390)
      - [3.3 升级到3.9.2](#33-升级到392)
      - [4.3 升级到3.11.2/3.11.1](#43-升级到31123111)
      - [4.4 升级到3.12.0](#44-升级到3120)
      - [4.5 升级到3.14.0](#45-升级到3140)
    - [4. 常见用户问题](#4-常见用户问题)
      - [4.1 断网重连，视频无法恢复播放](#41-断网重连视频无法恢复播放)
      - [4.2 如何获取直播间配置信息？](#42-如何获取直播间配置信息)
      - [4.3 如何使用回放记忆播放功能？](#43-如何使用回放记忆播放功能)
      - [4.4 如何获取随堂测排行榜？](#44-如何获取随堂测排行榜)
      - [4.5 安卓10.0存储权限问题](#45-安卓100存储权限问题)
      - [4.6 视频窗口想做成圆角的或者其他样式？](#46-视频窗口想做成圆角的或者其他样式)
      - [4.7 文档打不开？显示无法打开网页？](#47-文档打不开显示无法打开网页)
      - [4.8 如何获取直播已经开始时长？](#48-如何获取直播已经开始时长)
      - [4.9 如何监听播放状态，自定义加载悬浮框？](#49-如何监听播放状态自定义加载悬浮框)
      - [4.10 聊天发送和连麦同时操作造成消息丢失?](#410-聊天发送和连麦同时操作造成消息丢失)
      - [4.11 在线回放无setOnBufferingUpdateListener监听？](#411-在线回放无setonbufferingupdatelistener监听)
      - [4.12 Networkutils内部出现空指针？](#412-networkutils内部出现空指针)
      - [4.13 某个回放只显示画笔或者画笔重复的问题](#413-某个回放只显示画笔或者画笔重复的问题)
      - [4.13 关于某个回放画笔重叠问题](#413-关于某个回放画笔重叠问题)
      - [4.14 CCBaseActivity找不到？](#414-ccbaseactivity找不到)
      - [4.15 文档提示 NoSuchKey](#415-文档提示-nosuchkey)
      - [4.16 NetworkUtils类报错](#416-networkutils类报错)



## 一、说明

为了用户更加友好和的接入SDK，这里提供一些常见的Q&A，如您遇到其他问题，请提供下面信息的一项或者几项便于开发人员快速查找并定位问题

【问题描述】【SDK版本】、【问题模块】、【复现步骤】、【截图或者录屏】、【日志】



## 二、常见问题


### 1. 常见集成问题

#### 1.1 找不到maven库

如遇到远端maven库无法下载的问题，请检查根目录的build.gradle中是否已添加maven源

如下所示

```groovy
 repositories {                                                                       
     ......
     // 添加该源
     maven {                                                                          
          url 'http://nexus-app.bokecc.com/repository/sdk-group/'                     
     }                                                                                
 }           
```

#### 1.2 hddownload.jar下载框架

hddownload.jar是离线回放的一个下载工具，不属于SDK相关库，用户可根据需求替换成自己的下载工具       

#### 1.3 登录和播放在同一个界面

部分用户在集成的时候需要将登录和播放在同一个界面，而我们的demo只提供了登录和播放在两个界面的场景范例

针对登录和播放在同一个界面的场景，这里只需要关注两个关键点

1. 方法调用的顺序

   必须在登录的成功回调方法之后初始化播放器界面和其他模块的界面

```java
   -----------------------------3.14.0 版本之前------------------------------
   // 1. 设置登录参数
   DWLive.getInstance().setDWLiveLoginParams(回调方法, loginInfo)
   // 2. 调用登录接口
   DWLive.getInstance().startLogin();
   -----------------------------3.14.0 版本开始------------------------------
   // 1 2. 设置登录参数并调用登录接口
   DWLive。startLogin(loginInfo, 回调方法)
   
   // 3. 监听回调方法，并在主线程初始化界面
   监听回调方法
       成功--> 开始初始化播放器模块和其他模块的界面
       失败--> 登录失败
```

2. 注意demo中LivePlayActivity界面onResume()方法 

   登录成功并初始化之后，需要调用开始播放方法，同时需要在onResume方法中设置登录成功的标志，如果登录成功才会调用直播开始的逻辑

```java
   //登录成功标志
   private boolean isLoginSuccess;
   
    @Override                                                                                               
    protected void onResume() {
        super.onResume();
        // 判断是否登录成功
         if (isLoginSuccess) {
             ...
             // 开始调用直播开始的逻辑
             ...    
         }
    }                                                                                                       
```

#### 1.4 安卓 9.0之上网络兼容

目前SDK的数据请求绝大部分都使用了Https的方式，但是还是有少数的Http请求。

为更好的适配Android 9.0之上的设备，建议在AndroidManifest.xml中的Application层添加配置信息：

```java
android:networkSecurityConfig="@xml/network_security_config"
```

然后在res的xml文件夹中添加：network_security_config.xml

```xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
```



#### 1.5 集成文档的建议

这里介绍一下文档的一个高级设置：**文档显示模式** 此设置可以设置当前文档的显示模式是'适合窗口'还是‘适合宽度’。 具体的后台操作如下

 <img src="https://hdgit.bokecc.com/ccvideo/Live_Android_Play_SDK/wikis/image/doc_1.png" style="zoom:67%;" />

1. 两种显示模式适合展示的文档类型

   适合窗口：适用于展示宽大于高或者宽高相差不大的文档，如横版PPT。 适合宽度:适用于展示高度明显大于宽度的文档，如长图及Word文档。 后台设置好'文档显示模式'，我们的SDK内部会识别此设置，然后进行不同模式 的展示。

2. SDK对两种显示模式的支持

   首先SDK内部封装的DocView能自动识别后台的设置，并进行合理的展示。 但是我们也知道，当文档内容属于高度比较大的时候，应使用适应宽度，此时界 面上展示的 文档内容可能不是全部的文档内容，这时候就需要滑动了，这里我 们对DocView做了动态 的设置，提供了DocView.setScrollable(boolean scrollable)方法。 我们推荐在普通布局方式展示时将此设置为true，支持滑动; 大小屏布局方式时设置为 false，就不支持滑动。

---



### 2. 常见错误

#### 2.1  class not found 

 具体错误如下

```
1. java.lang.NoClassDefFoundError
2. java.lang.ClassNotFoundException
3. java.lang.UnsatisfiedLinkError
4. java.lang.ClassNotFoundException,Didn't find class "org.webrtc.MediaCodecVideoEncoder$OutputBufferInfo" on path
```

本地引用如果出现class not found 或者so文件异常无故崩溃的问题

1. 如果是**本地引用**请查询是否完整导入相关类库和so库
2. 检查混淆配置是否导致了SDK二次混淆

#### 2.2  x5混淆错误

如果Debug包运行无错误，打Release包后，报X5内核的运行异常，可以参照X5的混淆配置，进一步调整混淆配置： http://res.imtt.qq.com/TES/proguard.zip

#### 2.3  lib包冲突

如果出现依赖库冲突问题，请联系客服

#### 2.4  登录直播间失败

解决方案：

1. 检查权限，参考集成文档
2. 检查参数，参考集成文档

如权限和参数正确依旧登录不上，请检查DNS是否被拦截

#### 2.5 oom错误

如用户在使用的过程中出现以下错误

```java
03-21 21:05:28.771: E/dalvikvm-heap(13316): Out of memory on a 10485776-byte allocation.
03-21 21:05:28.779: E/AndroidRuntime(13316): java.lang.OutOfMemoryError
```

请将问题反馈给客服，提供相应的直播信息和回放地址，由SDK开发人员定位解决问题

另外

用户也可通过开启**largeHeap**的方式增加可申请内存的大小

```java
<application
     .....
     android:label="XXXXXXXXXX"
     android:largeHeap="true">
    .......
</application>
```



---




### 3. 升级常见问题

#### 3.1 升级到3.8.0/3.8.1

版本3.8.0首次采用maven集成，如果同时使用本公司点播或者小班课SDK需要注意冲突的问题

3.8.0会出现和点播SDK播放器核心冲突的问题，需使用本地集成或者升级到3.8.1版本

本地集成时请使用播放器版本如下

```java
// 集成播放器核心
api('com.bokecc:hdplayer:1.1.0')
```

该冲突已在3.8.1中已解决

集成时使用直播SDK播放器核心即可

#### 3.2 升级到3.9.0

从版本3.9.0开始为了解决录播时录播文档数据很大导致导致离线回放打开较慢的问题，提出该方案优化打开离线回放的打开速度

升级到3.9.0会出现离线回放旧数据无法播放的问题

**解决**

升级到3.9.1

demo中UnZiper类将`SupZipTool.decompressZipDec`替换为`SupZipTool.decompressZipDecAndSplitFile`方法，参数不变

**说明**

`decompressZipDec`方法是对ccr文件的解压，方法依旧可用，但无法进行大文件优化

`decompressZipDecAndSplitFile`方法是在解压之后进行大数据分离，建议使用该方法

#### 3.3 升级到3.9.2

3.9.2版本播放关键帧比较长的视频或者大码率的回放时，会出现可以播放但拖动时一直再转，是由于SDK不支持大码率视频

解决方案：

1. 降低视频码率
2. 联系客服使用定制版3.9.2版本，解决大码率问题
3. 升级到3.9.2之后的版本

#### 4.3 升级到3.11.2/3.11.1

1. 日志频繁输出xlog找不到

   该版本对部分日志没有过滤，导致日志显示异常，对实际业务无影响，该问题已在3.12.0版本修复

2. 自定义属性冲突问题 ShapedImageView

   出问题的版本在3.11.0，由于commonLib库中存在有和demo相应的资源，可通过下面的引用方式解决问题

   ```java
   api('com.bokecc:dwlivesdk:3.11.2') {
        exclude group: 'com.bokecc', module: 'commonLib'
   }
   api('com.bokecc:commonLib:0.1.15')
   ```

#### 4.4 升级到3.12.0

 切换线路的回调功能：DWLiveListener类的`onInitFinished(int i, List<QualityInfo> list）`方法报错

回调监听里下面方法已删除，该方法无法满足现有场景，故将其删除

```java
class LiveListener implements DWLiveListener{
 ...
     // 回调线路列表
     void onInitFinished(int i, List<QualityInfo> list)
 ...
}
```

并已修改为

```java
class LiveListener extends DWLiveListener{
 ...
  // 加载完成
  void onInitFinished()
  // 回调清晰度和线路列表
  void HDReceivedVideoAudioLines(List<LiveLineVideoParams> list, LiveLineAudioParams liveLineAudioParams)
 ...
}
```

需要让用户按照文档监听相应的方法，使用最新的方法

#### 4.5 升级到3.14.0

- 升级到3.14.0版本的SDK如以下方法出现下面错误
  
  LiveVideoView类
  ```java
    /**
     * 视频播放控件退出连麦模式
     */
     public void exitRtcMode() {
        try {
            DWLive.getInstance().restartVideo();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DWLiveException e) {
            e.printStackTrace();
        }
        setVisibility(VISIBLE);
    }
  ```
  需要将捕获的异常去除，由DWLiveListener统一接收错误信息
  
  修改成如下所示
  ```java
    /**
     * 视频播放控件退出连麦模式
     */
    public void exitRtcMode() {
        // 恢复直播界面
        DWLive.getInstance().restartVideo();
        setVisibility(VISIBLE);
    }
  ```




---



### 4. 常见用户问题

#### 4.1 断网重连，视频无法恢复播放

在3.9.2之前的版本需要用户自己监听网络变化调用DwLive.restartVideo(Surface surface)恢复播放

 从3.9.2开始sdk底层自动处理，只有在超时抛出错误之后才不会自动恢复

#### 4.2 如何获取直播间配置信息？

首次进入直播间如何获取直播间配置信息

1. 监听DWLiveListener.onRoomSettingInfo(SettingInfo info)回调 

   SettingInfo 属性信息

   ```java
   private boolean allow_chat;           // 是否允许聊天
   private boolean allow_question;       // 是否允许问答
   private String room_base_user_count;  // 房间在线人数
   ```

2. 其他信息详见直播对接文档

#### 4.3 如何使用回放记忆播放功能？

**说明**

3.6.0版本之前无法使用记忆播放功能
3.6.0之后可调用该api(DWLiveReplay)

```java
   /**
     * 设置上一次播放的位置，可用于记忆播放功能
     */
    public void setLastPosition(long position)
```

详细使用方法请见demo

#### 4.4 如何获取随堂测排行榜？

3.9.2之前的调用方式

```java
SocketPracticeHandler handler = new SocketPracticeHandler();
SocketPracticeHandler.getPracticeRanking(viewer listener,practiceId)
   
//并监听回调 onPracticRanking(PracticeRankInfo info)
```

3.9.2之后调用的方式

```java
Dwlive.getInstance().getPracticeRanking(String practiceId)
//并监听回调 onPracticRanking(PracticeRankInfo info)
```

#### 4.5 安卓10.0存储权限问题

具体报错信息如下

```
System.err: java.io.FileNotFoundException: /storage/emulated/0/bokecc_log/bokecc_sdk.log: open failed: EACCES (Permission denied)。
```

3.9.1之前版本文件找不到？

**说明**

该问题分为两种情况
   1：先看是否有存储权限 如果没有就去开启权限
   2: 是否是运行在android10的设备上 

解决方案:
   1：如未开启，请开启存储权限
   2：如果是android10 设备 如果是 在manifest的application节点添加android:requestLegacyExternalStorage="true"，或者升级到3.9.2之后版本
   3：sdk初始化的时候 关闭日志采集(不建议)

#### 4.6 视频窗口想做成圆角的或者其他样式？

在视频窗口上添加一个遮罩层

#### 4.7 文档打不开？显示无法打开网页？

请检查手机是否设置了代理

#### 4.8 如何获取直播已经开始时长？

```java
// 主动调用该方法
Dwlive.getInstance().getLivePlayedTime();   

//通过  DWLiveListener.onLivePlayedTime(int) 异步回调
```

#### 4.9 如何监听播放状态，自定义加载悬浮框？

- **3.14.0版本之前** 设置如下监听

  ```
  DWLivePlayer.setOnInfoListener(IMediaPlayer.OnInfoListener listener)
  ```

- **3.14.0版本之后** 设置如下监听

  ```
  public void setPlayerEventListener(PlayerEvent playerEvent)
  ```

然后根据监听结果设置相应的状态

```java
@Override
public void onInfo(int what, int extra) {
    switch (what) {
        case MEDIA_INFO_BUFFERING_START:
            // 缓冲开始，开启加载中提示
            break;
        case MEDIA_INFO_BUFFERING_END:
            // 缓冲结束
            break;
        case MEDIA_INFO_AUDIO_RENDERING_START:
            // 音频开始播放
            break;
        case MEDIA_INFO_VIDEO_RENDERING_START:
            // 视频开始播放 关闭加载中提示
            break;
```

#### 4.10 聊天发送和连麦同时操作造成消息丢失?

服务器接收socket消息有限制，需要延时1秒发送消息

#### 4.11 在线回放无setOnBufferingUpdateListener监听？

在sdk3.9.2之前无此监听，3.9.2版本之后添加


#### 4.12 Networkutils内部出现空指针？

sdk升级到3.11.1

#### 4.13 某个回放只显示画笔或者画笔重复的问题

**出现时机**：同一张ppt在不同的时间段上画上画笔，在往前拖动进度的过程中有一定几率出现画笔重复或者只显示画笔不显示文档的情况，该问题出现在3.10.0之前的版本

**解决方案**：升级sdk到3.11.1之后版本

#### 4.13 关于某个回放画笔重叠问题

**出现时机**：同一张ppt在不同的时间段上画上画笔，通过admin进行裁剪并合并的时候出现

**解决方案**：升级sdk到3.11.1 或者之后版本

#### 4.14 CCBaseActivity找不到？

**出现时机**：同时集成直播和小班课，并且直播从3.11.0之前的版本升级到3.11.0之后的版本

**解决方案**：参照小班课的demo（6.20以上）并更新                  

#### 4.15 文档提示 NoSuchKey

  问题描述
     直播播放文档的时候提示NoSuchKey，该问题主要在安卓设备上出现的比较多，该问题是由于dp加载图片时，没有找到相应的图片地址

 解决方案：

1. 重新上传文档

2. 如果重新上传文档无法解决，需要排查服务器故障 

#### 4.16 NetworkUtils类报错

问题描述：

1. NetworkUtils找不到
2. 空指针，没有传入context

解决方案：

1. 对于3.14.0版本之前的版本，尽量不要使用SDK里的NetworkUtils类，请自行实现网络状态的检查
2. 直播：DWLive.setDWLivePlayParams(DWLiveListener dwLiveListener, Context context)方法context传null



#### 4.17 4.x版本不使用多人连麦过滤方式

问题描述：

1. 用户使用4.x版本,但是apk体积过大,在不使用多人连麦情况下可以过滤多人连麦的包

解决方案：

1. 将直播sdk的引入方式改为

   ```groovy
     api('com.bokecc:dwlivesdk:' + rootProject.ext.android.SDK_VERSION) {
           // 过滤小班课sdk
           exclude group: 'com.bokecc', module: 'ClassBaseLib'
       }
       api 'com.bokecc:commonLib:1.1.4'
       api 'com.bokecc:CCStreamALib:1.0.9'
       api 'com.bokecc:CCStreamTLib:1.0.9-'
   ```
   
   
   
2. 初始化sdk的方式改为

   ```java
   /**
        *  初始化SDK
        *
        * @param app       Application
        * @param enableLog 是否开启日志
        * @param enableX5  是否开启x5内核
        * @param isMultiplayer  是否开启多人连麦
        */
   DWLiveEngine. init( Application app, boolean enableLog, boolean enableX5,boolean isMultiplayer)
   ```

#### 4.18 sdk日志存储路径

sdk版本<3.17.5，系统版本在android 10之上(包含版本10)
sd卡/Android/data/包名/files/Document/bokecc_log/bokecc_sdk.log
包名是应用的包名
系统版本在Android10之下
sd卡/bokecc_log/bokecc_sdk.log

sdk版本>=3.17.5，日志会在调用直播/回放的onDestroy方法时，上传至后台



#### 4.19 从3.17.X升级到4.0，demo层面的修改

 [v3.x升级v4.x版本demo的变更](v3.x升级v4.x版本demo的变更)



#### 4.20 安卓12直播或回放播放崩溃（报错ijkplayer崩溃）

如果您的targetSdkVersion在30以上，并且出现在安卓12手机直播或者回放播放视频崩溃的情况，可以尝试在app的manifest中的application节点加入以下配置：

```xml-dtd
android:allowNativeHeapPointerTagging="false"
```



#### 4.21 出现 please login first 崩溃问题

由于activity重建导致在未调用直播sdk的startLogin方法时，直接调用了start方法，导致sdk抛出错误，请确保activity不会因为系统配置的改变而重建，参考方式：

manifest中activity节点：

```xml-dtd
android:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation|screenLayout|smallestScreenSize|uiMode|fontScale|layoutDirection"
```

#### 4.22 关于直播与回放文档白屏问题

文档组件是通过Webview实现的，如果您项目中也存在Webview的使用，需要先检查是否存在pauseTimers方法的调用，此方法为webview全局方法，可能会造成文档组件异常。

由于文档资源为网络资源（包括html、js、css以及图片等），加载依赖网络，可能存在一些内部网络拦截的情况，请确保设备接入的网络不存在中间拦截的情况。

强烈建议您在文档布局中加入手动刷新按钮，调用sdk提供的刷新方法，从而减少异常发生，参考：[4.7.0版本升级](版本升级文档#release470)
