相关资源
SDK 源码下载请参见 XML Android SDK。
示例 Demo 请参见 XML Android SDK Demo。
SDK 接口与参数文档请参见 SDK API 参考。
SDK 文档中的所有示例代码请参见 SDK 代码示例。
SDK 更新日志请参见 ChangeLog。
SDK 常见问题请参见:Android SDK 常见问题。
说明:
如果您在使用 XML 版本 SDK 时遇到函数或方法不存在等错误,请先将 XML 版本 SDK 升级到最新版再重试。如果您仍在使用 JSON 版本 SDK,请 升级到 XML Android SDK。
准备工作
1. 您需要一个 Android 应用,这个应用可以是您现有的工程,也可以是您新建的一个空的工程。
2. 请确保您的 Android 应用目标为 API 级别 15 (Ice Cream Sandwich) 或更高版本。
3. 您需要一个可以获取腾讯云临时密钥的远程地址,关于临时密钥的有关说明请参见 移动应用直传实践。
第一步:安装 SDK
方式一:自动集成(推荐)
说明:
bintray 仓库已经下线,COS SDK 已经迁移到 mavenCentral,引用路径和之前不同,您在更新的时候请使用新的引用路径。
使用 mavenCentral 仓库
在项目级别(通常是根目录下)的
build.gradle
中添加:repositories {google()// 增加这行mavenCentral()}
标准版 SDK
在应用级别(通常是 App 模块下)的
build.gradle
中添加依赖:dependencies {...// 增加这行implementation 'com.qcloud.cos:cos-android:5.9.+'}
精简版 SDK
如果您仅仅使用到上传和下载功能,并且对 SDK 体积要求较高,可以使用我们的精简版 SDK。
在应用级别(通常是 App 模块下)的
build.gradle
中添加依赖:dependencies {...// 增加这行implementation 'com.qcloud.cos:cos-android-lite:5.9.+'}
说明:
如果使用的是精简版 SDK,请将下面实例代码以及其他 Android 文档中的 CosXmlService 改为 CosXmlSimpleService。
关闭腾讯灯塔上报功能
说明:
腾讯灯塔只对 COS 侧的请求性能进行监控,不会上报业务侧数据。
若是想关闭该功能,可以进行以下 1 或 2 操作:
1. 调用 PrivacyService.closeReport() 方法进行关闭(sdk 版本需要大于等于5.9.24)。
2. 请在应用级别(通常是 App 模块下)的 build.gradle 中进行如下操作:
版本为5.8.0以及以上:
修改 cos-android 的依赖为
dependencies {...// 修改为implementation 'com.qcloud.cos:cos-android-nobeacon:x.x.x'//lite 版本修改为implementation 'com.qcloud.cos:cos-android-lite-nobeacon:x.x.x'}
版本为5.5.8至5.7.9:
添加去掉 beacon 的语句
dependencies {...implementation ('com.qcloud.cos:cos-android:x.x.x'){// 增加这行exclude group: 'com.tencent.qcloud', module: 'beacon-android-release'}}
获取腾讯灯塔上报的个人信息
可以调用 PrivacyService.getPrivacyParams(context) 接口查看本 sdk 上报的个人信息(sdk 版本需要大于等于5.9.24)。
/** * 获取可能采集的参数 * 这些参数用于分析系统运行状态,优化系统性能和稳定性,不会用于其他用途 * os_version: 系统版本 * client_local_ip: 本地IP地址 * network_type: 网络状态 */ public static Map<String, String> getPrivacyParams(Context context)
方式二:手动集成
1. 下载归档文件
下载完成并解压后,您可以看到里面包含了数个
jar
或 aar
包。下面是对它们的简单说明,请根据需要选择集成的包。必选的库:
cos-android:COS 协议实现
qcloud-foundation:基础库
qcloud-cos-android-base:COS 基础协议实现
qcloud-track:日志封装相关
bolts-tasks:第三方 Task 库
okhttp:第三方 Networking 库
okio:第三方 IO 库
可选的库:
quic:QUIC 协议,当您使用到 QUIC 协议来传输数据时需要。
beacon: beacon 移动分析,用于改进 SDK。
2. 集成到项目中
把需要的包放到您应用模块下的
libs
文件夹下,并在应用级别(通常是 App 模块下)的 build.gradle
文件中添加如下依赖:dependencies {...// 增加这行implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])}
第二步:配置权限
网络权限
SDK 需要网络权限,用于与 COS 服务器进行通信,请在应用模块下的
AndroidManifest.xml
中添加如下权限声明:<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
存储权限
如果您的应用场景中需要从外部存储中读写文件,请在应用模块下的
AndroidManifest.xml
中添加如下权限声明:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
注意:
在 Android 6.0(API level 23)以上,您需要在运行时动态申请存储权限。
第三步:开始使用
1. 初始化密钥
将单个密钥设置给具体的 CosXmlRequest(例如上传的 PutObjectRequest等),该密钥仅用于本次 COS 操作(例如上传等)。
// 获取临时密钥(业务层控制获取的方式) String tmpSecretId = "SECRETID"; // 临时密钥 SecretIdString tmpSecretKey = "SECRETKEY"; // 临时密钥 SecretKeyString sessionToken = "SESSIONTOKEN"; // 临时密钥 Tokenlong expiredTime = 1556183496L;//临时密钥有效截止时间戳,单位是秒// 建议返回服务器时间作为签名的开始时间,避免由于用户手机本地时间偏差过大导致请求过期long startTime = 1556182000L; //临时密钥有效起始时间,单位是秒SessionQCloudCredentials sessionQCloudCredentials = new SessionQCloudCredentials(tmpSecretId, tmpSecretKey,sessionToken, startTime, expiredTime);
注意:
COS Android SDK 版本需要大于等于 v5.9.31。
采用回调的方式给 COS SDK 提供获取临时密钥的方法,SDK 会在首次和缓存的临时密钥快过期时使用该回调重新获取临时密钥。
// 实现一个BasicLifecycleCredentialProvider
的子类,实现请求临时密钥并返回结果的过程。public static class MySessionCredentialProviderextends BasicLifecycleCredentialProvider {@Overrideprotected QCloudLifecycleCredentials fetchNewCredentials()throws QCloudClientException {// 首先从您的临时密钥服务器获取包含了密钥信息的响应// 然后解析响应,获取临时密钥信息String tmpSecretId = "SECRETID"; // 临时密钥 SecretIdString tmpSecretKey = "SECRETKEY"; // 临时密钥 SecretKeyString sessionToken = "SESSIONTOKEN"; // 临时密钥 Tokenlong expiredTime = 1556183496L;//临时密钥有效截止时间戳,单位是秒//建议返回服务器时间作为签名的开始时间,避免由于用户手机本地时间偏差过大导致请求过期// 返回服务器时间作为签名的起始时间long startTime = 1556182000L; //临时密钥有效起始时间,单位是秒// 最后返回临时密钥信息对象return new SessionQCloudCredentials(tmpSecretId, tmpSecretKey,sessionToken, startTime, expiredTime);}}
实现一个
QCloudSelfSigner
的子类,实现获取服务端签名并加入请求授权。QCloudSelfSigner myQCloudSelfSigner = new QCloudSelfSigner() {/*** 对请求进行签名** @param request 需要签名的请求* @throws QCloudClientException 客户端异常*/@Overridepublic void sign(QCloudHttpRequest request) throws QCloudClientException {// 1. 把 request 的请求参数传给服务端计算签名String auth = "get auth from server";// 2. 给请求添加签名request.addHeader(HttpConstants.Header.AUTHORIZATION, auth);}});
您可以使用腾讯云的永久密钥来进行开发阶段的本地调试。由于该方式存在泄露密钥的风险,请务必在上线前替换为临时密钥的方式。
String secretId = "SECRETID"; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140String secretKey = "SECRETKEY"; //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140// keyDuration 为请求中的密钥有效期,单位为秒QCloudCredentialProvider myCredentialProvider =new ShortTimeCredentialProvider(secretId, secretKey, 300);// 5.9.33版本开始支持设置起始时间,不配置起始时间则以系统当前时间作为起始时间// 密钥有效起始时间,单位是秒,建议返回服务器时间作为签名的开始时间,避免由于用户手机本地时间偏差过大导致请求过期// long startTime = 1556182000L;// QCloudCredentialProvider myCredentialProvider =// new ShortTimeCredentialProvider(secretId, secretKey, startTime, 300);
2. 初始化 COS 服务
a. 通过 CosXmlServiceConfig 配置 COS 服务。
// 存储桶所在地域简称,例如广州地区是 ap-guangzhouString region = "COS_REGION";// 创建 CosXmlServiceConfig 对象,根据需要修改默认的配置参数CosXmlServiceConfig serviceConfig = new CosXmlServiceConfig.Builder().setRegion(region).isHttps(true) // 使用 HTTPS 请求, 默认为 HTTP 请求.builder();
说明:
b. 初始化一个
CosXmlService
的实例,CosXmlService
提供了访问 COS 的所有接口,建议作为 程序单例 使用。a. 初始化一个
CosXmlService
的实例,可以不设置临时密钥回调。CosXmlService cosXmlService = new CosXmlService(context,serviceConfig);
b. 给 CosXmlRequest 设置临时密钥并使用,
单次临时密钥的优先级高于 CosXmlService 中初始化配置的 CredentialProvider,因此 CosXmlService 中配置的 CredentialProvider 不会影响单次临时密钥的设置,直接给CosXmlRequest通过 setCredential 设置临时密钥即可。
// 任何CosXmlRequest都支持这种方式,例如上传PutObjectRequest、下载GetObjectRequest、删除DeleteObjectRequest等// 以下用上传进行示例PutObjectRequest putRequest = new PutObjectRequest("examplebucket-1250000000", "exampleobject.txt", "本地文件路径");// sessionQCloudCredentials为第一步“初始化密钥”中获取到的单次临时密钥putRequest.setCredential(sessionQCloudCredentials);// 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档TransferConfig transferConfig = new TransferConfig.Builder().build();// 初始化 TransferManagerTransferManager transferManager = new TransferManager(cosXmlService, transferConfig);COSXMLUploadTask uploadTask = transferManager.upload(putRequest, null);
上传文件实践:
注意:
COS Android SDK 版本需要大于等于 v5.9.31。
// 这里假设类名为MySessionCredentialProvider
。初始化一个实例,来给 SDK 提供密钥。QCloudCredentialProvider myCredentialProvider = new MySessionCredentialProvider();CosXmlService cosXmlService = new CosXmlService(context,serviceConfig, myCredentialProvider);
通过服务端签名授权初始化 COS Service,获取实例。
CosXmlService cosXmlSelfService = new CosXmlService(context,serviceConfig, myQCloudSelfSigner);
您可以使用腾讯云的永久密钥来进行开发阶段的本地调试。由于该方式存在泄露密钥的风险,请务必在上线前替换为临时密钥的方式。
CosXmlService cosXmlService = new CosXmlService(context,serviceConfig, myCredentialProvider);
第四步:访问 COS 服务
上传对象
SDK 支持上传本地文件、二进制数据、Uri 以及输入流。下面以上传本地文件为例:
高级上传时二进制数据和输入流仅支持普通上传,不支持分块上传。
// 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档TransferConfig transferConfig = new TransferConfig.Builder() // 设置启用分块上传的最小对象大小 默认为2M .setDivisionForUpload(2097152) // 设置分块上传时的分块大小 默认为1M .setSliceSizeForUpload(1048576) // 设置是否强制使用简单上传, 禁止分块上传 .setForceSimpleUpload(false) .build();// 初始化 TransferManagerTransferManager transferManager = new TransferManager(cosXmlService,transferConfig);// 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucketString bucket = "examplebucket-1250000000";String cosPath = "exampleobject.txt"; //对象在存储桶中的位置标识符,即称对象键String srcPath = new File(context.getCacheDir(), "exampleobject.txt").toString(); //本地文件的绝对路径//若存在初始化分块上传的 UploadId,则赋值对应的 uploadId 值用于续传;否则,赋值 nullString uploadId = null;// 上传文件COSXMLUploadTask cosxmlUploadTask = transferManager.upload(bucket, cosPath,srcPath, uploadId);//设置初始化分块上传回调,用于获取uploadId (5.9.7版本以及后续版本支持)cosxmlUploadTask.setInitMultipleUploadListener(new InitMultipleUploadListener() {@Overridepublic void onSuccess(InitiateMultipartUpload initiateMultipartUpload) {//用于下次续传上传的 uploadIdString uploadId = initiateMultipartUpload.uploadId;}});//设置上传进度回调cosxmlUploadTask.setCosXmlProgressListener(new CosXmlProgressListener() {@Overridepublic void onProgress(long complete, long target) {// todo Do something to update progress...}});//设置返回结果回调cosxmlUploadTask.setCosXmlResultListener(new CosXmlResultListener() {@Overridepublic void onSuccess(CosXmlRequest request, CosXmlResult result) {COSXMLUploadTask.COSXMLUploadTaskResult uploadResult =(COSXMLUploadTask.COSXMLUploadTaskResult) result;}// 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:// clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?@Overridepublic void onFail(CosXmlRequest request,@Nullable CosXmlClientException clientException,@Nullable CosXmlServiceException serviceException) {if (clientException != null) {clientException.printStackTrace();} else {serviceException.printStackTrace();}}});//设置任务状态回调, 可以查看任务过程cosxmlUploadTask.setTransferStateListener(new TransferStateListener() {@Overridepublic void onStateChanged(TransferState state) {// todo notify transfer state}});
授权说明
{"version": "2.0","statement": [{"action": [//head操作"name/cos:HeadObject",//简单上传操作"name/cos:PutObject",//分块上传:初始化分块操作"name/cos:InitiateMultipartUpload",//分块上传:List 进行中的分块上传"name/cos:ListMultipartUploads",//分块上传:List 已上传分块操作"name/cos:ListParts",//分块上传:上传分块操作"name/cos:UploadPart",//分块上传:完成所有分块上传操作"name/cos:CompleteMultipartUpload",//取消分块上传操作"name/cos:AbortMultipartUpload"],"effect": "allow","resource": ["qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"]}]}
说明:
更多完整示例,请前往 GitHub 查看。
上传之后,您可以用同样的 Key 生成文件下载链接,具体使用方法见 生成预签名链接 文档。但注意如果您的文件是私有读权限,那么下载链接只有一定的有效期。
下载对象
// 高级下载接口支持断点续传,所以会在下载前先发起 HEAD 请求获取文件信息。// 如果您使用的是临时密钥或者使用子账号访问,请确保权限列表中包含 HeadObject 的权限。// 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档TransferConfig transferConfig = new TransferConfig.Builder().build();//初始化 TransferManagerTransferManager transferManager = new TransferManager(cosXmlService,transferConfig);// 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucketString bucket = "examplebucket-1250000000";String cosPath = "exampleobject.txt"; //对象在存储桶中的位置标识符,即称对象键//本地目录路径String savePathDir = context.getExternalCacheDir().toString();//本地保存的文件名,若不填(null),则与 COS 上的文件名一样String savedFileName = "exampleobject.txt";Context applicationContext = context.getApplicationContext(); // application// contextCOSXMLDownloadTask cosxmlDownloadTask =transferManager.download(applicationContext,bucket, cosPath, savePathDir, savedFileName);//设置下载进度回调cosxmlDownloadTask.setCosXmlProgressListener(new CosXmlProgressListener() {@Overridepublic void onProgress(long complete, long target) {// todo Do something to update progress...}});//设置返回结果回调cosxmlDownloadTask.setCosXmlResultListener(new CosXmlResultListener() {@Overridepublic void onSuccess(CosXmlRequest request, CosXmlResult result) {COSXMLDownloadTask.COSXMLDownloadTaskResult downloadTaskResult =(COSXMLDownloadTask.COSXMLDownloadTaskResult) result;}// 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:// clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?@Overridepublic void onFail(CosXmlRequest request,@Nullable CosXmlClientException clientException,@Nullable CosXmlServiceException serviceException) {if (clientException != null) {clientException.printStackTrace();} else {serviceException.printStackTrace();}}});//设置任务状态回调,可以查看任务过程cosxmlDownloadTask.setTransferStateListener(new TransferStateListener() {@Overridepublic void onStateChanged(TransferState state) {// todo notify transfer state}});
授权说明
{"version": "2.0","statement": [{"action": [//head操作"name/cos:HeadObject",//下载操作"name/cos:GetObject",],"effect": "allow","resource": ["qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/doc/*"]}]}
说明:
更多完整示例,请前往 GitHub 查看。
高级下载接口支持断点续传,所以会在下载前先发起 HEAD 请求获取文件信息。如果您使用的是临时密钥或者使用子账号访问,请确保权限列表中包含 HeadObject 的权限。