文档首页> > 上传SDK> 客户端上传> Android上传SDK

Android上传SDK

分享
更新时间: 2019/08/23 16:30

前提条件

环境准备

已安装JDK1.8及以上版本并完成环境配置,可参考安装JDK完成配置。

SDK下载

请从SDK开发者中心下载对应SDK包。

SDK集成

本节以Android Studio,说明如何集成Android上传SDK。您可以从Android官网下载并安装Android Studio最新版本。

  1. 解压下载的SDK包,得到压缩包中的libs文件夹下的所有JAR文件。
  2. 运行Android Studio工具。
  3. 单击“Start a new Android Studio project”,进入创建工程引导界面。
  4. 配置相关参数,完成工程创建。
  5. 从文件系统中找到新建的工程,将解压的lib目录下的所有jar文件拷贝至新建工程下的“app/libs”子文件夹内。
  6. 配置APP权限。

    由于SDK需要上传音视频文件,所以需要在“AndroidManifest.xml”文件中配置如下权限:

    1
    2
    3
    4
    5
    6
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" 
    
    说明:

    Android6.0系统及以上需要动态获取权限。

代码示例

断点续传

支持断点续传,大文件上传持续时间长,当上传过程中出现网络异常程序崩溃登导致上传中断情况时,可以调用断点续传接口继续上传,断点续传是将文件分成若干段进行上传,当所有段上传完成时会合并成完整文件,完成整个文件上传。文件上传时断点续传接口将会自动记录当前上传进度信息,当发生异常中断时,不需要用户手动调用,再次上传时会从上次中断记录点继续上传,节省时间和流量成本。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
/*
* 业务流程:
* 1、首先需要导入点播sdk包cloud-java-sdk-vod-upload-1.1.0.jar和其他相关依赖jar包
* 2、设置点播服务配置项,包括点播服务节点地址、AK、SK和ProjectId等,用于连接点播服务和进行授权等。
* 3、设置OBS对象存储服务的配置项,用于进行对象上传
* 4、构造媒资上传请求参数。
* 5、发送媒资上传请求。
* 6、返回处理信息。
*/

import com.google.gson.Gson;
import com.huawei.upload.common.obs.ObsConfig;
import com.huawei.upload.common.obs.model.FileMeta;
import com.huawei.upload.vod.client.VodClient;
import com.huawei.upload.vod.client.VodConfig;
import com.huawei.upload.vod.service.ObsService;
import com.obs.services.model.CompleteMultipartUploadResult;
import com.obs.services.model.PartEtag;

//设置点播服务配置项构造方法
VodConfig vodConfig = new VodConfig();

//必选,设置项目ID,可参考“获取关键参数”章节获取
vodConfig.setProjectId("projectId");

//必选,设置点播的Endpoint,可参考“获取关键参数”章节获取
vodConfig.setEndPoint("https://vod.cn-north-4.myhuaweicloud.com");

//必选,设置临时AK、SK、securitytoken,可参考“获取关键参数”章节获取
vodConfig.setAk("ak");
vodConfig.setSk("sk");
vodConfig.setSecuritytoken("securityToken");

/*if you need proxy*/
//可选,设置代理,根据实际情况选择设置
/*
ClientConfig clientConfig = new ClientConfig();
//设置代理服务器主机IP
clientConfig.setProxyHost(proxyHost);
//设置代理服务器端口号
clientConfig.setProxyPort(Integer.parseInt(proxyPort));
//设置代理服务器用户名
clientConfig.setProxyUserName(proxyUserName);
//设置代理服务器用户密码
clientConfig.setProxyPassword(proxyPassword);

//设置连接OBS的相关配置
ObsConfig obsConfig = new ObsConfig();

//必选,OBS的Endpoint,设置的OBS和点播服务需要在同一个区域
obsConfig.setEndPoint("obs.cn-north-4.myhuaweicloud.com");
//设置上传文件时每个分段的大小,单位为M,最小5M
obsConfig.setPartSize(5);
//设置是否分段并发上传,传入参数为并发数量,当入参小于等于1时代表串行上传。
obsConfig.setConcurrencyLevel(0);

*/      
//点播服务构造方法,在没有配置代理的情况下使用该构造方法
VodClient vodClient=new VodClient(VodConfig, obsConfig);

/*
* proxy provided
* //点播服务构造方法,在需要配置代理的情况下使用该构造方法
* VodClient vodClient=new VodClient(VodConfig, clientConfig, obsConfig);
*/

/**初始化上传信息,需要传入待上传文件的本地文件地址(绝对路径)、媒资所在的桶名、媒资所在的ObjectKey
*    此处的filePath指本地文件的文件地址的绝对路径,如 d://test.mp4
*    bucket、objectKey 需要服务端调用创建媒资接口后获得并返回给客户端,详情需要参考点播服务端的创建媒资接口
*/
FileMeta fileMeta = new FileMeta("filePath", "bucket", "objectKey");

/*
 * 传入FileMeta后开始上传,不支持回调
 * CompleteMultipartUploadResult result = vodClient.multipartUploadFile(fileMeta);
 */

// 开始上传,可以传入一个回调内部类来实时获取上传信息。
CompleteMultipartUploadResult result = vodClient.multipartUploadFile(fileMeta, new ObsService.OnPartEtagUploadedListener() {
      
      @Override  //初始化段结束时回调
      public void onInitMultiUploadPart(String uploadId) {
      Log.d("Init end: ", uploadId+"");
      }

      @Override   //上传完每一段时回调,可以获取回调时的PartEtag,上传进度。 
      public void onUploadEachPart(PartEtag partEtag, String uploadId, int progess) {
      Log.d(partEtag.toString() + " is end !  Progress: ", progress + "");
          }      

      @Override   // 上传完成时回调
      public void onCompleteMultiUpload(String uploadId) {
      Log.d("Complete end: ", uploadId + "");
      }

      @Override
      public void onError(Throwable e) {
      e.printStackTrace();
      }});
//返回处理消息
Log.d("result", new Gson().toJson(result));
说明:
  • 此处是断点续传示例,租户客户端在调用前需要从租户服务端获取媒资上传需要的bucket、objectKey、临时AK、SK和securityToken。
  • 客户端可以在初始化ObsConfig时设置分段大小以及并发数。但再次调用断点续传上传剩余段时设置分段大小无效,默认第一次设置的分段大小。
  • 断点续传前需要与第一次上传一致的bucket、objectKey、文件,否则默认为未上传过从第一段开始上传。
  • 待文件上传成功后,需要服务端调用点播确认媒资上传接口完成媒资的整个创建流程。

在Android中,不能在UI线程调用同步接口,只能在子线程调用,否则将出现异常。如果希望直接在UI线程中上传,请使用异步接口。

错误处理

在使用Java SDK时,当服务端或者SDK端出错时,SDK会返回相应的异常信息。这些异常信息有两种,一种是和VOD进行交互获取临时授权时产生的错误,这种错误一般会以抛异常方式抛出,用户需要注意捕获。还有一种是上传过程中产生的错误,可以在调用上传接口的时候传入回调内部类,并在onError(Throwable th)中捕获处理。

如果您需要对SDK的错误进行处理,可以参考如下示例编写代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import com.google.gson.Gson;
import com.huawei.upload.common.obs.ObsConfig;
import com.huawei.upload.common.obs.model.FileMeta;
import com.huawei.upload.vod.client.VodClient;
import com.huawei.upload.vod.client.VodConfig;
import com.huawei.upload.vod.service.ObsService;
import com.obs.services.model.CompleteMultipartUploadResult;
import com.obs.services.model.PartEtag;

//设置点播服务配置项构造方法
VodConfig vodConfig = new VodConfig();

//必选,设置项目ID,可参考“获取关键参数”章节获取
vodConfig.setProjectId("projectId");

//必选,设置点播的Endpoint,可参考“获取关键参数”章节获取
vodConfig.setEndPoint("vod.cn-north-4.myhuaweicloud.com");

//必选,设置临时AK、SK、securitytoken,可参考“获取关键参数”章节获取
vodConfig.setAk("ak");
vodConfig.setSk("sk");
vodConfig.setSecuritytoken("securityToken");

/*if you need proxy*/
//可选,设置代理,根据实际情况选择设置
/*
ClientConfig clientConfig = new ClientConfig();
//设置代理服务器主机IP
clientConfig.setProxyHost(proxyHost);
//设置代理服务器端口号
clientConfig.setProxyPort(Integer.parseInt(proxyPort));
//设置代理服务器用户名
clientConfig.setProxyUserName(proxyUserName);
//设置代理服务器用户密码
clientConfig.setProxyPassword(proxyPassword);

//设置连接OBS的相关配置
ObsConfig obsConfig = new ObsConfig();

//必选,OBS的Endpoint,设置的OBS和点播服务需要在同一个区域
obsConfig.setEndPoint("obs.cn-north-4.myhuaweicloud.com");
//设置上传文件时每个分段的大小,单位为M,最小5M
obsConfig.setPartSize(5);
//设置是否分段并发上传,传入参数为并发数量,当入参小于等于1时代表串行上传。
obsConfig.setConcurrencyLevel(0);


*/      
//点播服务构造方法,在没有配置代理的情况下使用该构造方法
VodClient vodClient=new VodClient(VodConfig, obsConfig);

/*
* proxy provided
* //点播服务构造方法,在需要配置代理的情况下使用该构造方法
* VodClient vodClient=new VodClient(VodConfig, clientConfig, obsConfig);
*/

// 初始化上传信息,需要传入待上传文件的文件地址、媒资所在的桶名、媒资所在的ObjectKey
FileMeta fileMeta = new FileMeta("filePath", "bucket", "objectKey");

/*
 * 传入FileMeta后开始上传,不支持回调
 * CompleteMultipartUploadResult result = vodClient.multipartUploadFile(fileMeta);
 */

// 开始上传,可以传入一个回调内部类来实时获取上传信息。如需要断点续传,则需要记录下上传任务的uploadID和所有已上传的PartEtag,用于断点续传时告诉sdk已有哪些段已上传
try{
  CompleteMultipartUploadResult result = vodClient.multipartUploadFile(fileMeta, new ObsService.OnPartEtagUploadedListener() {
      
      @Override  //初始化段结束时回调
      public void onInitMultiUploadPart(String uploadId) {
      System.out.println("Init end, uploadId is : " + uploadId);
      }

      @Override   //上传完每一段时回调,可以获取回调时的PartEtag,上传进度。 若需要断点续传则需要保留该PartEtag
      public void onUploadEachPart(PartEtag partEtag, String uploadId, int progess) {
      System.out.println("The partEtag " + partEtag.toString() + " is end !  Current progress: " + uploadId);
      }      

      @Override   // 上传完成时回调
      public void onCompleteMultiUpload(String uploadId) {
      System.out.println("Complete end: " + uploadId);
      }

      @Override
      public void onError(Throwable e) {
      // 处理上传过程中产生的错误
      e.printStackTrace();
      }});
  } catch(Exception ex)
      {  // 处理和VOD交互产生的错误
         ex.printStackTrace();
       } 

//返回处理消息
System.out.println(new Gson().toJson(result));
如果您喜欢这篇文档,您还可以:

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区