## 3.1 导入SDK

有两种引入SDK的方式，第一种是使用Gradle方式，第二种是引用Jar包。

### 3.1.1 使用Gradle方式

1.在Project的build.gradle文件中配置。

```groovy
allprojects {
    repositories {
        google()
        jcenter()
        //以下必须配置
        maven {url 'http://nexus-app.bokecc.com/repository/sdk-group/'}
        //使用投屏功能时添加此配置，不使用不需要
        maven { url 'http://4thline.org/m2'}
    }
}
```

2.在App的build.gradle的文件中添加依赖，注意：在多module的情况下需要传递依赖时将implementation换成api。

```groovy
dependencies {
    //获得场景视频SDK，必须引入
    implementation 'com.bokecc:CCVOD:3.16.6'
    //必须引用
    implementation 'com.bokecc:drm:1.2.1'
    //使用DWIjkMediaPlayer 倍速播放器引入
    implementation 'com.bokecc:hdplayer:1.1.0_lite'
    //上传视频时使用压缩功能时需要引用
    implementation 'com.bokecc:CompressVideoLib:1.0.0'
    //使用Vr播放功能时需要引入
    implementation 'com.bokecc:VrPlayLib:1.0.0'
    //使用投屏功能需要引用
    implementation 'com.bokecc:ProjectionLib:1.7.0'
    //弹幕
    implementation 'com.github.ctiao:DanmakuFlameMaster:0.9.25'

}
```

3.在使用投屏功能时还需要做以下配置，不使用投屏不需要配置。

在App的build.gradle的文件中配置：

```groovy
android {

    //使用投屏功能时需要添加此配置
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/beans.xml'
    }
}
```

在AndroidManifest.xml中配置：

```groovy
<!--使用投屏功能时需要配置ProjectionUpnpService-->
        <service
            android:name="com.bokecc.projection.ProjectionUpnpService"
            android:exported="false" />
<!--使用投屏功能时需要配置ProjectionSystemService-->
        <service
            android:name="com.bokecc.projection.ProjectionSystemService"
            android:exported="false" />
```

### 3.1.2 以引用Jar包的方式导入SDK

下载最新版本的SDK，下载地址为：[VOD_Android_SDK](https://hdgit.bokecc.com/ccvideo/VOD_Android_SDK/-/releases)，将huodesdk.jar和httplib.jar、drm.jar添加到Android项目中，并配置当前项目可正确的引用类库，使用此方式还需要通过Gradle方式引用implementation 'com.bokecc:commonLib:0.1.12'。

## 3.2 配置项目的网络权限和文件读写权限：

```groovy
<!-- 用于网络通信 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 用于存储已下载文件 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

## 3.3 初始化

SDK视频播放由DWMediaPlayer类实现，使用DWMediaPlayer既可播放获得场景视频云服务平台下的视频（以下简称在线播放），也可播放本地视频。

从3.16.1版本开始，应用启动时调用初始化,若未正常调用，SDK则会抛出RuntimeException。

例：

```java
InitializeManager.getInstance(getContext()).initialize();
```

InitializeManager:

| 方法                                             | 说明                              |
| :----------------------------------------------- | :-------------------------------- |
| initialize()                                     | 默认开启log，普通安全校验方式     |
| initialize(boolean isLog)                        | 是否开启log，默认普通安全校验方式 |
| initialize(boolean isLog, VerificationMode mode) | 是否开始log，安全校验方式         |

参数详解：

```java
public enum VerificationMode {
    ORDINARY,//普通安全校验方式  3.20.0版本之前使用的方式
    SID;//sid安全校验方式 3.20.0版本新增的sid方式
}
```

注：SID的安全级别相对于ORDINARY会更高。 [SID安全校验流程详解](https://doc.bokecc.com/vod/developer/base/sdksid/sdksid.html)

播放加密视频需要启动DRMServer，启动DRMServer后可以播放加密视频和非加密视频，若只是播放非加密视频不需要启动DRMServer。

注意:启动DRMServer必须在播放视频之前启动，建议在应用启动时启动，应用销毁时释放

```java
 		// 启动DRMServer
    public void startDRMServer() {
        if (drmServer == null) {
            drmServer = new DRMServer();
            drmServer.setRequestRetryCount(20);
        }

        try {
            drmServer.start();
            setDrmServerPort(drmServer.getPort());
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), "启动解密服务失败，请检查网络限制情况:"+e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
		//停止DRMServer
		public void stopDrmServer(){
      	if (drmServer != null) {
            drmServer.stop();
        }
    }
```



### 3.3.1 在线播放

使用SDK的在线播放功能时，需设置视频ID、账户ID、(API_KEY或者SdkSidProvider其中一个)及Context（上下文信息）即可播放云端视频。具体实现方式如下：

1. 配置布局文件

```groovy
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextureView
        android:id="@+id/tv_paly_video"
        android:layout_width="match_parent"
        android:layout_height="200dp" />

</LinearLayout>
```

2. 编写播放代码

```java
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, DWMediaPlayer.OnPreparedListener {
    private TextureView tv_paly_video;
    private SurfaceTexture mTexture;
    private Surface surface;
    private DWMediaPlayer player;
    private String USERID = "在此配置账户ID";
    private String videoId = "在此配置视频ID";
    //开通授权验证播放功能的需要配置授权验证码,
    //没有开通授权播放功能的,verificationCode 填null      
    private String verificationCode = "在此配置视频授权验证码";
		//如果安全校验方式为普通模式需要apikey
    private String API_KEY = "在此配置API_KEY";
  	//如果安全校验方式为SID需要SdkSidProvider
		private SdkSidProvider provider = new SdkSidProvider(){
      public String getVerificationKey(String userId){
        	return 需要返回校验的sid;
      }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_paly_video = findViewById(R.id.tv_paly_video);
        tv_paly_video.setSurfaceTextureListener(this);
        player = new DWMediaPlayer();
        Context context = getApplicationContext();
        // 播放DRM加密视频需要这行代码，播放非加密视频不需要
        player.setDRMServerPort(HuodeApplication.getDrmServerPort());
      	//必须调用，请在播放前确认您要播放的是视频还是音频，视频传递false，音频传递true，如果资源缺失，会通过onPlayError的103（无音频资源）和102（无视频资源）回调错误，可以在回调中切换播放模式
      	player.setAudioPlay(false);
        // 设置视频播放信息
      	//如果是普通的校验方式
        //player.setVideoPlayInfo(videoId, USERID, API_KEY,verificationCode , context);
      	//如果是sid的校验方式
      	player.setVideoPlayInfo(videoId, USER_ID, verificationCode,context,provider);
        // 重置DRMServer()，播放非加密视频不需要
        HuodeApplication.getDRMServer().reset();
        mTexture = tv_paly_video.getSurfaceTexture();
      	player.prepareAsync();
    }

    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        if (mediaPlayer != null) {
            mediaPlayer.start();
        }
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
        this.surface = new Surface(surfaceTexture);
        player.prepareAsync();
        player.setOnPreparedListener(this);
        player.setSurface(surface);
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {

    }

}
```

当播放器准备播放完成后，调用start()方法开始播放视频。同时，DWMediaPlayer提供了getVideoStatusInfo（获取视频状态），getVideoTitle（获取视频标题）等方法，开发者可根据需要在应用中展示相应的信息。

**选择清晰度播放**

DWMediaPlayer提供了getDefinitions()方法获取当前播放的视频清晰度列表。如果需要切换视频的清晰度，可根据当前视频的清晰度对DWMediaPlayer进行设置。具体实现方式如下：

```java
// 获取清晰度列表
Map<String, Integer> definitions = player.getDefinitions();
// 获取某种清晰度对应的状态码
int definitionCode = definitions.get("definitionInfo");
// 设置播放清晰度
player.setDefaultDefinition(definitionCode);
player.setDefinition(context, definitionCode);
```

**设置OnDreamWinErrorListener**

DWMediaPlayer获取播放地址产生的异常需要通过OnDreamWinErrorListener来获取异常，需要用户自行设置该监听。

```java
// 设置错误信息监听器player.setOnDreamWinErrorListener(...)
```

### 3.3.2 本地播放

在使用DWMediaPlayer播放本地视频时，使用setOfflineVideoPath设置视频文件地址。具体实现方式如下：

```java
String path = "/123456.pcm";
DWMediaPlayer player = new DWMediaPlayer();
// 播放pcm加密视频需要设置此行设置，播放非加密的mp4不需要此行设置player.setDRMServerPort(HuodeApplication.getDrmServerPort());
//设置视频文件地址player.setOfflineVideoPath(localVideoPath,context);
// 播放pcm加密视频需要设置此行设置，播放非加密的mp4不需要此行设置HuodeApplication.getDRMServer().resetLocalPlay();
player.prepareAsync();
```

当播放器准备完成后，调用start()方法即可开始播放视频。

## 3.4 视频上传

SDK视频上传由Uploader类实现，Uploader通过HTTP协议与服务端进行通信，上传视频信息和视频文件。同时，SDK提供了上传回调接口UploadListener来监听视频上传流程，如果需要在应用中展示上传状态、上传进度等信息，可根据需要进行设置。

### 3.4.1 Uploader使用示例

使用Uploader上传前，请先了解Uploader的工作流程：

1. 创建Uploader实例，初始化视频信息，此时Uploader进入等待状态（WAIT）。
2. 当需要开始上传时，调用start()方法开始上传，此时Uploader进入上传状态（UPLOAD）。
3. 当需要暂停上传时，调用pause()方法。另外，在上传过程中可能出现网络异常问题，当出现此问题时，Uploader默认会暂停当前上传操作，进入暂停状态（PAUSE）。
4. 当需要恢复上传时，调用resume()方法，若无网络异常等问题，此时Uploader会重新上传视频文件。
5. 当需要取消上作时，调用cancel()方法，此时Uploader会进入等待状态（WAIT）。

创建Uploader实例需提供VideoInfo（视频信息）和 API_KEY或者SdkSidProvider，使用示例如下：

```java
SdkSidProvider provider = new SdkSidProvider(){
      public String getVerificationKey(String userId){
        	return 需要返回校验的sid;
      }
    };
VideoInfo videoInfo = new VideoInfo();
videoInfo.setTitle("title");
videoInfo.setTags("tag");
videoInfo.setDescription("description");
 // 设置视频文件地址
videoInfo.setFilePath("filePath");
// 设置账号信息
videoInfo.setUserId("USERID");
// 设置回调信息
videoInfo.setNotifyUrl(“NOTIFY_URL");
//如果是普通校验方式
//Uploader uploader = new Uploader(videoInfo,"API_KEY");
//如果是SID校验方式
Uploader uploader = new Uploader(videoInfo,provider);
// 开始上传
uploader.start();
```

VideoInfo是用来记录上传过程与视频相关的信息，在初始化视频信息时，服务端需根据视频的标题、标签、描述等来创建视频，所以在使用VideoInfo创建Uploader实例时，请确保视频信息非空。


### 3.4.2 设置上传回调

Uploader在执行上传操作时，默认会检查是否设置了UploadListener。若已设置UploadListener，Uploader会回调UploadListener已实现的方法，若未设置，则不回调任何信息。UploadListener具体使用方法如下：

```java
UploadListener uploadListener = new UploadListener(){
  @Override
  public void handleProcess(long range, long size, String videoId) {
    // TODO 处理上传进度
  }
  @Override
  public void handleException(DreamwinException exception, int status) {
    // TODO 处理上传过程中出现的异常
  }
  @Override
  public void handleStatus(VideoInfo videoInfo, int status) {
    // TODO 处理上传回调的视频信息及上传状态，status=100(等待上传)、200(正在上传)、300(暂停上传)、400(上传完成)、500(上传失败)
  }
  @Override
  public void handleCancel(String videoId) {
    // TODO 处理取消上传的后续操作    
  }
  @Override
  public void onVideoInfoUpdate(VideoInfo videoInfo) {
    // TODO 上传信息更新回调，可以在这里保存最新的videoInfo状态    
  }
};
uploader.setUploadListener(uploadListenner);
```

## 3.5 视频下载

SDK视频下载由Downloader类实现的，Downloader通过HTTP协议与服务端进行通信，获取视频下载地址。同时，SDK提供了下载回调接口DownloadListener来监听视频下载流程，如果需要向用户展示下载状态、下载进度等信息，可根据需要进行设置。

下载离线加密视频需要实现密钥存储接口。如果只是播放非加密视频，不需要设置

注意：设置离线加密视频密钥存储接口必须在下载之前设置，建议在应用启动时设置

```
				DWSdkStorage myDWSdkStorage = new DWSdkStorage() {
            private SharedPreferences sp = getApplicationContext().getSharedPreferences("mystorage", MODE_PRIVATE);

            @Override
            public void put(String key, String value) {
                SharedPreferences.Editor editor = sp.edit();
                editor.putString(key, value);
                editor.commit();
            }

            @Override
            public String get(String key) {
                return sp.getString(key, "");
            }
        };

        DWStorageUtil.setDWSdkStorage(myDWSdkStorage);
```

### 3.5.1 Downloader使用示例

在使用Downloader前，请先了解Downloader的工作流程：

1. 创建Downloader实例，初始化视频文件下载信息，此时Downloader进入等待状态（WAIT）。
2. 当需要开始下载时，调用start()方法，此时Downloader进入下载状态（DOWNLOAD）。
3. 当需要暂停下载时，调用pause()方法。另外，在下载过程中可能出现网络异常问题，当出现此问题时，Downloader默认会暂停下载操作，进入暂停状态（PAUSE）。
4. 当需要恢复下载时，调用resume()方法。若无网络异常等问题，此时Downloader会重新下载视频文件。
5. 当需要取消视频下载时，调用cancel()方法，此时Downloader会进入等待状态（WAIT）。

创建Downloader实例需提供视频存储文件，视频ID、账户ID、API_KEY，示例如下：

```java
//提供一个下载路径
String downloadPath = "/storage/emulated/0/HuodeDownload/";
//fileName是文件名，例如“huode”。注意：此文件名不包括后缀名，后缀名会根据云端视频文件格式自动设置。
//如果是普通安全校验模式
//Downloader downloader = new Downloader(downloadPath,fileName,videoId, "USERID","API_KEY",verificationCode);、
//如果是sid安全校验模式
Downloader downloader = new Downloader(downloadPath,fileName,videoId, "USERID",sdkSidProvider,verificationCode);
        //设置下载重连次数 取值范围（0--100）,Demo设置的是重试60次
        downloader.setReconnectLimit(ConfigUtil.DOWNLOAD_RECONNECT_LIMIT);
        //设置下载重连间隔，单位ms，demo设置是3000ms
        downloader.setDownloadRetryPeriod(3 * 1000);
        downloader.setDownloadDefinition(downloadInfo.getDefinition());

        //下载模式
        int downloadMode = downloadInfo.getDownloadMode();
        if (downloadMode==0){
            downloader.setDownloadMode(MediaMode.VIDEOAUDIO);
        }else if (downloadMode==1){
            downloader.setDownloadMode(MediaMode.VIDEO);
        }else if (downloadMode==2){
            downloader.setDownloadMode(MediaMode.AUDIO);
        }
// 开始下载
downloader.start();
```

### 3.5.2 设置下载回调

Downloader在执行下载操作时，默认会检查是否设置了DownloadListener。若已设置DownloadListener，Downloader会回调DownloadListener接口已实现的方法，若未设置，则不回调任何信息。DownloadListener使用方法如下：

```
DownloadListener downloadListener = new DownloadListener(){
  @Override
  public void handleProcess(long start, long end, String videoId) {
    // TODO 处理下载进度
  }

  @Override
  public void handleException(DreamwinException exception, int status) {
    // TODO 处理下载过程中发生的异常信息        
  }

  @Override
  public void handleStatus(String videoId, int status) {
    // TODO 处理视频下载信息及相应状态，status下载状态：100表示等待中，200表示下载中，300表示下载暂停，400表示下载完成
  }

  @Override
  public void handleCancel(String videoId) {
    // TODO 处理取消下载的后续操作
  }

 @Override
 public void getFormat(String format) {
       //获得文件的格式format        
  }           
};

downloader.setDownloadListener(downloadListener);
```

### 3.5.3 选择清晰度下载

流程如下：

1. 创建Downloader实例；
2. 调用setOnProcessDefinitionListener()方式设置清晰度回调；
3. 调用getDefinitionMap()方法获取清晰度；
4. 根据获取的清晰度，调用setDownloadDefinition()方法设置想要的清晰度；
5. 调用start()下载指定清晰度。

获取清晰度时需实现OnProcessDefinitionListener接口的onProcessDefinition()方法，并调用Downloader的setOnProcessDefinitionListener()方法设置获取清晰度回调，获取清晰度的示例如下：

```
class DownloadDemo{
      private HashMap<Integer, String> dm;
      private Downlaoder downloader;

      private OnProcessDefinitionListener onProcessDefinitionListener = new OnProcessDefinitionListener(){
          @Override
          public void onProcessDefinition(HashMap<Integer, String> definitionMap) {
              if(definitionMap != null){
                  dm = definitionMap;
              } else {
                  Log.e("get definition error", "视频清晰度获取失败");
              }
          }

          @Override
          public void onProcessException(DreamwinException exception) {
              Log.i("get definition exception", exception.getErrorCode().Value());
          }

      };

      private getDefinition(){
          downloader.setOnProcessDefinitionListener(onProcessDefinitionListener);
          downloader.getDefinitionMap();
      }
      ……

  }
```

### 3.5.4 设置下载重试次数

```
//设置下载重试次数，默认为0，可设置区间[0, 100]setReconnectLimit(int reconnectLimit)
```

### 3.5.5 设置超时时间

```
//设置网络请求的超时时间,区间[5000-30000]，单位为ms，默认值为10000mssetTimeOut(int timeOut)
```

### 3.5.6 使用VodDownloadManager管理下载

Downloader类实现了下载的功能，使用者可以在Downloader的基础上自己创建下载管理逻辑，也可以使用SDK提供的下载管理方法，需要注意的是使用VodDownloadManager需要以单例VodDownloadManager.getInstance()的形式调用。


初始化VodDownloadManager。

```java
//存储路径downloadPath的格式如"/storage/emulated/0/HuodeDownload/"
String downloadPath = MultiUtils.createDownloadPath();
//使用VodDownloadManager需要以单例VodDownloadManager.getInstance()的形式调用
//如果是使用的普通安全校验方式
//VodDownloadManager.getInstance().init(HuodeApplication.getContext(),ConfigUtil.USERID,ConfigUtil.API_KEY,downloadPath);
//如果是使用的sid安全校验方式
VodDownloadManager.getInstance().init(HuodeApplication.getContext(),ConfigUtil.USERID,sdkSidProvider,downloadPath);
```

设置下载重试次数，默认为10，可设置区间[0, 100]。

```
VodDownloadManager.getInstance().setReconnectLimit(10);
```

设置下载重试间隔，单位ms，默认3000ms。

```
VodDownloadManager.getInstance().setDownloadRetryPeriod(3000);
```

设置是否下载字幕，默认下载，注：视频有字幕资源文件时才会下载。

```
VodDownloadManager.getInstance().setDownloadSubtitle(true);
```

设置同时下载的个数，默认为2，此值不宜设置过大。

```
VodDownloadManager.getInstance().setMaxDownloadingNum(2);
```

下载单个视频，首先要构建一个DownloadConfig实例，DownloadConfig的字段信息如下。

```
//userId  必须
private String userId;
//apiKey  安全校验方式为‘ORDINARY’必填，为‘SID’非必填
private String apiKey;
//视频ID,不可为空
private String videoId;
//视频授权码，没有可不填
private String veriCode;
//要保存的文件名，不可为空，同一个视频不同清晰度的文件名要不同（可以拼上清晰度字段或自定义的方式来区分）
private String fileName;
//下载模式，0：音视频模式 1：下载视频 2：下载音频
private int downloadMode;
//清晰度
private int definition;
//传入的视频封面，可为null，若此处为null，后续的返回的VodDownloadBean此值也为null
private String videoCover;
```
//插入下载任务
VodDownloadManager.getInstance().insertDownload(downloadConfig);

```
DownloadConfig downloadConfig = new DownloadConfig(userId，apiKey，videoId, verificationCode, dowloadTitle, downloadMode, currentDefinition, videoCover);
VodDownloadManager.getInstance().insertDownload(downloadConfig);
```

下载多个视频，调用
VodDownloadManager.getInstance().insertBatchDownload(downloadConfigs)。

```
ArrayList<DownloadConfig> downloadConfigs = new ArrayList<>();
downloadConfigs.add(downloadConfig1);
downloadConfigs.add(downloadConfig2);
downloadConfigs.add(downloadConfig3);
VodDownloadManager.getInstance().insertBatchDownload(downloadConfigs);
```

开启一个定时器，调用VodDownloadManager.getInstance().update()，启动和刷新下载任务，定时器的间隔为1000ms，不要修改为别的数值。

```
timer.schedule(new TimerTask() {
      @Override
      public void run() {
	  VodDownloadManager.getInstance().update();
      }
}, 1 * 1000, 1 * 1000);
```

刷新下载进度。

```
VodDownloadManager.getInstance().setOnUpdateDownload(new VodDownloadManager.OnUpdateDownload() {
            @Override
            public void updateDownload() {
                //在主线程刷新UI
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        initAllPause();
                        updateListView();
                    }
                });

            }
});
```


监听有新的文件下载完成，会返回vodDownloadBean实例。

```
VodDownloadManager.getInstance().setOnDownloadFinishListener(new VodDownloadManager.OnDownloadFinishListener() {
            @Override
            public void onDownloadFinish(VodDownloadBean vodDownloadBean) {
                //vodDownloadBean包含下载文件的信息，根据需要自行处理
            }
});
```


VodDownloadBean各字段的信息如下，部分字段的值可能为空或0。

```
private String videoId;//视频ID
private String fileName;//文件名
private String format;//文件格式
private String veriCode;//视频授权码
private int downloadMode;//下载模式，0：音视频模式 1：下载视频 2：下载音频
private String videoCover;//视频封面，和创建下载任务时传入的封面相同
private long start;//断点续传的开始位置
private long end;//文件的总大小
private int status;//下载状态，100表示等待中，200表示下载中，300表示下载暂停，400表示下载完成
private int definition;//清晰度
private String videoPath;//文件的保存路径
private int subtitleNum;//字幕数量
private int firstSubtitleStatus;//第一种字幕的下载状态，1：成功，2：失败
private String firstSubtitlePath;//第一种字幕的保存路径
private String firstSubtitleUrl;//第一种字幕文件地址，仅在下载字幕失败时有值
private int secondSubtitleStatus;//第二种字幕的下载状态，1：成功，2：失败
private String secondSubtitlePath;//第二种字幕的保存路径
private String secondSubtitleUrl;//第二种字幕文件地址，仅在下载字幕失败时有值
private int saveSubtitleSetStatus;//保存字幕设置状态，1：成功，2：失败
private String saveSubtitleSetPath;//字幕设置的保存路径
private String subtitleSetInfo;//字幕设置信息，仅在保存字幕设置失败时有值
private int errorCode;//下载错误码
private String errorMsg;//下载错误信息
```


删除下载任务。

```
VodDownloadManager.getInstance().deleteDownloadInfo(downloadOperator);
```


暂停下载。

```
VodDownloadManager.getInstance().pauseDownload(downloadOperator);
```

由暂停状态恢复下载。

```
VodDownloadManager.getInstance().resumeDownload(downloadOperator);
```

恢复或暂停下载切换。

```
VodDownloadManager.getInstance().resumeOrPauseDownload(downloadOperator);
```

暂停全部下载。

```
VodDownloadManager.getInstance().pauseAllDownload();
```

恢复全部下载。

```
VodDownloadManager.getInstance().resumeAllDownload();
```

判断当前文件是否已经在下载队列中。

```
VodDownloadManager.getInstance().isExistDownloadInfo(fileName);
```

获取下载中的个数。

```
VodDownloadManager.getInstance().getDownloadingCount();
```

获得暂停和等待中状态下的个数。

```
VodDownloadManager.getInstance().getPauseAndWaitCount();
```

### 3.5.7 批量获取下载地址

批量最多获取10个视频的下载地址，超过10个的则只返回前10个视频的下载信息。

```
DownloaderHelper downloaderHelper = new DownloaderHelper("USERID","API_KEY");
List<DownloadModel> downloadModels = new ArrayList<>();
DownloadModel downloadModel1 = new DownloadModel("videoId1","授权码，没有的留空");
DownloadModel downloadModel2 = new DownloadModel("videoId2","授权码，没有的留空");
downloadModels.add(downloadModel1);
downloadModels.add(downloadModel2);
downloaderHelper.getDownloadInfos(downloadModels, new OnDownloadInfoListener() {
             @Override
             public void onDownloadInfo(List<DownloadInfo> downloadInfos) {
                 //在这里获得下载信息，当前处于子线程，不可直接进行UI操作           
             }
})
```

DownloadInfo的字段信息。

```
private String videoId;//视频ID
private boolean isSuccess;//获取视频下载信息是否成功，为true的时候才有之后的视频信息，为false表示失败
private String title;//视频标题
private String statusinfo;//视频状态
private int defaultquality;//默认清晰度
private ArrayList<DownloadQuality> qualities;//清晰度和地址信息
```

DownloadQuality的字段信息。

```
private int quality;//清晰度标识
private int mediatype;//媒体文件类型，1视频，2音频
private String desp;//清晰度文字描述
private ArrayList<DownloadCopy> copies;//文件地址和优先级信息
```

DownloadCopy的字段信息。

```
private String url;//下载地址
private int priority;//优先级，数字越大，优先级越高
```


## 3.6 音频支持

SDK音频播放由DWMediaPlayer类实现，DWMediaPlayer继承了Android的媒体播放器MediaPlayer类，并重载其prepare()和prepareAsync()方法。

### 3.6.1 音频在线播放

目前播放器默认支持的为视频播放，想要进行音频播放，在prepareAsync()之前则需要如下设置：

```
player.setDefaultPlayMode(MediaMode.AUDIO, onPlayModeListener);
player.setAudioPlay(true);
player.prepareAsync();
```

如果默认设置的为支持音视频模式，那么从视频切换到音频的方法为如下：

```
player.reset();
player.setAudioPlay(true);
player.prepareAsync();
```

注：onPlayModeListener的回调返回该视频节点信息支持的播放模式。如果没有节点信息，onPlayModeListener的回调返回为null。

### 3.6.2 音频本地播放

参考章节3.3.2

### 3.6.3 音频下载

参考3.5。
下载前需要调用setDownloadMode(MediaMode downloadMode)来设置下载的模式。