使用Android SDK上传文件

本文介绍如何使用Android SDK将媒体文件从本地上传至点播存储。

前提条件

  • 您的Android终端系统版本为4.0及以上版本。

  • 支持范围:Android 4.0(API 14)及以上版本。

使用限制

  • 目前Android SDK 只支持上传音、视频,不支持上传辅助媒资。

集成SDK

1、安装Android SDK

在项目的app/build.gradle文件中加入Android SDK的依赖项。

dependencies {
    implementation 'com.aliyun.video.android:upload:1.6.9'
}

在根目录下的build.gradle文件增加阿里云Maven仓库地址。

allprojects {
    repositories {
        maven { url "https://maven.aliyun.com/nexus/content/repositories/releases" }
    }
}

2、安装OSS Android SDK

点播上传Android SDK依赖OSS SDK,您需要额外安装OSS Android SDK详细信息,请参见安装OSS Android SDK,同样在Gradle项目中添加依赖项。

基础设置

1、获取凭证

请先了解客户端上传的整体上传流程,并根据上传的授权方式部署对应的授权服务:

  1. 选择使用上传地址和凭证方式, 请在授权服务中获取上传地址和凭证

  2. 选择使用STS Token方式,请在授权服务中获取STS Token

2、初始化上传实例

请根据业务需求选择用上传地址和凭证方式STS Token方式初始化上传实例。

上传地址和凭证方式(推荐)

  1. 声明上传实例(VODUploadClient)初始化回调。

    uploader = new VODUploadClientImpl(getApplicationContext());
  2. 初始化上传实例(VODUploadClient)。

    说明
    • 上传地址和凭证方式调用init方法初始化。

    • 在上传开始后触发的onUploadStarted回调中调用setUploadAuthAndAddress(uploadFileInfo, uploadAuth, uploadAddress)方法设置上传地址和凭证。

    • 音视频上传场景下,如果上传地址和凭证过期,会触发onUploadTokenExpired回调,需要调用resumeWithAuth(uploadAuth)方法,设置新的上传凭证继续上传。

    展开查看代码

    // create VODUploadClient
    final VODUploadClient uploader = new VODUploadClientImpl(getApplicationContext());
    // setup callback
    VODUploadCallback callback = new VODUploadCallback(){
        @Override
        public void onUploadSucceed(UploadFileInfo info) {
            OSSLog.logDebug("onsucceed ------------------" + info.getFilePath());
        }
    
        @Override
        public void onUploadFailed(UploadFileInfo info, String code, String message) {
            OSSLog.logError("onfailed ------------------ " + info.getFilePath() + " " + code + " " + message);
        }
    
        @Override
        public void onUploadProgress(UploadFileInfo info, long uploadedSize, long totalSize) {
            OSSLog.logDebug("onProgress ------------------ " + info.getFilePath() + " " + uploadedSize + " " + totalSize);
        }
    
        @Override
        public void onUploadTokenExpired() {
            OSSLog.logError("onExpired ------------- ");
            //重新刷新上传凭证:RefreshUploadVideo。
            uploadAuth = "此处需要设置重新刷新凭证之后的值";
            uploader.resumeWithAuth(uploadAuth);
        }
    
        @Override
        public void onUploadRetry(String code, String message) {
            OSSLog.logError("onUploadRetry ------------- ");
        }
    
        @Override
        public void onUploadRetryResume() {
            OSSLog.logError("onUploadRetryResume ------------- ");
        }
    
        @Override
        public void onUploadStarted(UploadFileInfo uploadFileInfo) {
            OSSLog.logError("onUploadStarted ------------- ");
            //uploadAuthuploadAddress即为上传凭证和地址。
            uploader.setUploadAuthAndAddress(uploadFileInfo, uploadAuth, uploadAddress);
        }
    };
    //上传初始化
    uploader.init(callback);

STS Token方式

  1. 声明上传实例(VODUploadClient)初始化回调。

    uploader = new VODUploadClientImpl(getApplicationContext());
  2. 初始化上传实例(VODUploadClient)。

    说明
    • STS方式调用init(accessKeyId, accessKeySecret, secretToken, expireTime, callback)方法初始化,

    • 初始化参数secretToken是请求获取的临时STS凭证。

    • STS临时凭证过期时,触发OnUploadTokenExpired回调,需要调用resumeWithToken(accessKeyId, accessKeySecret, secretToken, expireTime)方法,设置新的STS继续上传。

    展开查看代码

    // create VODUploadClient object
    uploader = new VODUploadClientImpl(getApplicationContext());
    // setup callback
    // setup callback
    VODUploadCallback callback = new VODUploadCallback() {
                public void onUploadSucceed(UploadFileInfo info) {
                    OSSLog.logDebug("onsucceed ------------------" + info.getFilePath());
                }
                public void onUploadFailed(UploadFileInfo info, String code, String message) {
                    OSSLog.logError("onfailed ------------------ " + info.getFilePath() + " " + code + " " + message);
                }
                public void onUploadProgress(UploadFileInfo info, long uploadedSize, long totalSize) {
                    OSSLog.logDebug("onProgress ------------------ " + info.getFilePath() + " " + uploadedSize + " " + totalSize);
                        }
                    }
                }
                public void onUploadTokenExpired() {
                    OSSLog.logError("onExpired ------------- ");
                        //重新获取STS之后调用resumeWithToken
                        uploader.resumeWithToken(accessKeyId, accessKeySecret, secretToken, expireTime);
                }
                public void onUploadRetry(String code, String message) {
                    OSSLog.logError("onUploadRetry ------------- ");
                }
                public void onUploadRetryResume() {
                    OSSLog.logError("onUploadRetryResume ------------- ");
                }
                public void onUploadStarted(UploadFileInfo uploadFileInfo) {
                    OSSLog.logError("onUploadStarted ------------- ");
                }
            };
    //初始化,临时账号过期时,在onUploadTokenExpired事件中,用resumeWithToken更新临时账号,上传默认支持断点续传
    uploader.init(accessKeyId, accessKeySecret, secretToken, expireTime, callback);

3、设置上传状态回调类

设置VODUploadCallback对象,该对象是上传状态的回调类。需要设置下列回调方法:

展开查看代码

/**
 上传完成回调
 @param info 上传文件信息
 */
void onUploadSucceed(UploadFileInfo info);
/**
 上传失败回调
 @param info 上传文件信息
 @param code 错误码
 @param message 错误描述
 */
 void onUploadFailed(UploadFileInfo info, String code, String message);
/**
 上传进度回调
 @param fileInfo 上传文件信息
 @param uploadedSize 已上传大小
 @param totalSize 总大小
 */
 void onUploadProgress(UploadFileInfo fileInfo, long uploadedSize, long totalSize);
/**
 上传地址和凭证过期回调
 上传地址和凭证方式上传需要调用resumeWithAuth方法继续上传
 STS方式上传需要调用resumeWithToken方法继续上传
 */
 void onUploadTokenExpired();
/**
 上传开始重试回调
 */
 void onUploadRetry(String code, String message);
/**
 上传结束重试,继续上传回调
 */
 void onUploadRetryResume ();
/**
 开始上传回调
 上传地址和凭证方式上传需要调用setUploadAuthAndAddress:uploadAuth:uploadAddress:方法设置上传地址和凭证
 @param fileInfo 上传文件信息
 */
  void onUploadStarted(UploadFileInfo fileInfo);

4、构造上传请求函数

音视频文件参数

构造添加音视频文件到上传列表的上传请求函数。

String filePath = "文件地址";
VodInfo vodInfo = new VodInfo();
vodInfo.setTitle("标题" + index);
vodInfo.setDesc("描述." + index);
vodInfo.cateId (19);
vodInfo.tags("sports");
uploader.addFile(filePath,vodInfo);

图片文件参数

构造添加图片文件到上传列表的上传请求函数。

String filePath = “图片文件地址”;
VodInfo vodInfo = new VodInfo();
vodInfo.setTitle(“标题” + index);
vodInfo.setDesc(“描述.” + index);
vodInfo.cateId (19);
vodInfo.tags(“sports”);
uploader.addFile(filePath,vodInfo);

vodInfo说明

//标题
String title;
//标签
List tags;
//描述
String desc;
//分类
idInteger cateId;
//封面url(完整的URL https://)
String coverUrl;
说明

添加文件后,SDK会将待上传文件封装为UploadFileInfo对象,具体结构如下:

//文件本地路径
String filePath;
//endpoint
String endpoint;
//bucket
String bucket;
//object
String object;
//VodInfo
VodInfo vodInfo;

5、开始上传

  1. 调用start()方法开始上传。

    void start();

    该方法调用后,会触发onUploadStarted回调。如果通过上传地址和凭证方式上传,需要在该回调方法中设置上传地址和凭证。示例代码如下:

    void setUploadAuthAndAddress(UploadFileInfo uploadFileInfo, String uploadAuth, String uploadAddress)

  2. 文件开始上传后,onUploadProgress回调开始同步上传进度。

  3. 文件上传成功后,onUploadSucceed回调会返回上传结果。回调包含上传结果的videoIdimageUrl属性。

执行结果

  • 视频上传成功后会返回videoId作为视频ID,拿到videoId之后需要获取播放地址进行播放。更多信息,请参见获取播放凭证

  • 图片上传完成后会返回imageUrl,开启URL鉴权后imageUrl会有过期时间。更多信息,请参见URL鉴权

高级功能

上传加速

上传实例(VODUploadClient)支持设置加速上传。

当您需要上传较大文件(GB、TB级别)或进行跨区域上传(比如在中国内地将视频上传到新加坡存储地域的存储地址)时,您可以启用上传加速功能。详情请参见开通方式。开通后需要您在上传实例的vodInfo配置中的UserData字符串赋值增加相应的key-value值(以Jsontring的方式传递)。示例如下:

vodInfo.setUserData("{\"Type\":\"oss\",\"Domain\":\"oss-accelerate.aliyuncs.com\"}");

参数描述

名称

类型

说明

Type

string

开启上传加速的类型(仅支持oss)。

Domain

string

用户bucket的加速地址(默认为https)。

说明

使用开通后分配的一个加速地址,例如:vod-*******.oss-accelerate.aliyuncs.com。

队列管理

上传实例(VODUploadClient)支持添加多个文件顺序上传,并提供了以下方法管理上传队列:

说明

尽管VODUploadClient支持多文件上传,如果使用上传凭证和上传地址方式上传,每个文件还是需要单独设置。基于多文件上传代码复杂度的考虑,建议只添加单文件上传。

  • 从队列中删除上传文件。如果待删除的文件正在上传中,则取消上传并自动上传下一个文件。

    void deleteFile(int index)
  • 清空上传队列。如果有文件在上传,则取消上传。

    void clearFiles()
  • 获取上传文件队列。

    List<UploadFileInfo> listFiles()
  • 将文件标记为取消,文件仍保留在上传列表中。如果待取消的文件正在上传中,则取消上传并自动上传下一个文件。

    cancelFile(int index)
  • 恢复已取消上传的文件,并自动开始上传。

    resumeFile(int index)

上传控制

上传实例(VODUploadClient)支持以下上传控制方法:

  • 停止上传。如果有文件正在上传中,则取消上传。

    void stop();
    说明

    停止上传后如需恢复上传,请调用resumeFile恢复待上传文件,或者清空队列后重新添加文件上传。

  • 暂停上传。

    void pause();
  • 恢复上传。

    void resume();

回调处理

上传实例(VODUploadClient)支持以下回调:

  • 上传失败

    上传失败时,会触发onUploadFailed回调。在该回调方法中,可以通过codemessage查看具体原因,并在页面上提示。更多错误码信息,请参见错误码表OSS错误码

  • 上传地址和凭证过期

    上传凭证过期,会触发onUploadTokenExpired回调。在该回调方法中,可以向AppServer重新请求新的上传凭证,并调用以下方法继续上传。

    说明

    需要在回调中设置刷新后的上传凭证。

  • 上传超时

    上传超时,会触发uploadRetry回调并自动重试。在该回调方法中,可以在页面上给予提示或者调用cancel方法停止上传。此外,可以设置maxRetryCount属性,指定最大重试次数。超时重试可以继续上传时,会触发uploadRetryResume回调并恢复上传。

超时处理

上传实例(VODUploadClient)支持设置最大超时次数:

/**
配置最大超时重试次数,默认值INT_MAX,超时时间
 */
void setVodHttpClientConfig(VodHttpClientConfig var);

分片上传设置

上传实例(VODUploadClient)支持设置文件大小来控制是否需要启用分片上传。如果文件超过partSize设置的大小就会采用分片上传。

/**
 分片大小,默认值1024 * 1024。单位字节。如果文件超过partSize设置的大小就会采用分片上传。
*/
void setPartSize(long partSize);

指定存储地址

上传实例(VODUploadClient)支持指定上传文件的存储地址。不指定时文件上传到默认存储地址。存储地址需要提前启用或配置。更多信息请参见存储说明

/**
* 指定文件的存储地址。登录点播控制台,选择配置管理 > 媒资管理配置 > 存储管理查看存储地址。
*/
void setStorageLocation(String storageLocation);

设置转码

上传实例(VODUploadClient)支持通过指定转码模板组ID设置转码。

/**
* 设置转码模板组Id。登录点播控制台,选择配置管理 > 媒体处理配置 > 转码模板组,查看转码模板组ID。
*/
void setTemplateGroupId(String templateGroupId);

上传实例(VODUploadClient)支持通过指定工作流ID设置工作流。

/**
* 设置工作流Id。登录点播控制台,选择配置管理 > 媒体处理配置 > 工作流管理,查看工作流ID。
*/
void setWorkflowId(String workflowId);
重要

同时设置转码模板组ID和工作流ID时,以工作流配置为准。

断点续传

客户端上传SDK支持断点续传。用户仅需保证以下方法的值为YES。

/**
 * 是否记录上传进度(断点续传),默认值YES。仅当参数值设为YES时上传SDK内部自动实现断点续传。如果设置为NO,断点续传功能为关闭状态。
 */
void setRecordUploadProgressEnabled(boolean var1);

设置点播服务地域

上传实例(VODUploadClient)支持设置存储地域。

/**
 vod region,默认值"cn-shanghai"。
 */
void setRegion(String var);