阿里云对象存储(OSS)是一种云存储解决方案,提供安全、高可用、高扩展、低成本的数据存储服务。它可用于存储图片、音视频、文档等各种多媒体文件,也可用于搭建各种类型的网站文件系统、移动APP数据存储等。 OSS 还提供 Restful API 接口、SDK 工具和丰富的管理控制台,使开发人员和管理员能够更轻松地管理和访问存储的文件。
本文将主要介绍 OSS 在安卓开发中的原理和使用方式。
## OSS 安卓 SDK
OSS 安卓 SDK 通常是以 jar 包的形式提供给开发者使用。在安卓开发中,我们可以将其下载到本地文件,然后在工程中导入,就可以使用 OSS 提供的 API 接口进行开发。
目前 OSS 提供在安卓端的 SDK 可以在官网上进行下载,其链接如下:
```
https://help.aliyun.com/document_detail/32013.html
```
## SDK 使用流程
下面我们就以安卓 APP 开发为例,介绍 OSS SDK 的使用流程。
### 1.导入 SDK
下载 OSS SDK 并在项目中导入oss-android-sdk-x.x.x.jar 包。
### 2.配置权限
在安卓Manifest.xml 文件中配置以下权限:
```
```
### 3.初始化 SDK
在 Application 中初始化 OSSClient:
```java
public class MyApplication extends Application{
private OSS oss;
@Override
public void onCreate() {
super.onCreate();
OSSLog.enableLog();
OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider("YourAccessKeyId", "YourAccessKeySecret");
OSS oss = new OSSClient(getApplicationContext(), "YourEndpoint", credentialProvider);
}
public OSS getOss() {
return oss;
}
}
```
其中,`YourAccessKeyId` 和 `YourAccessKeySecret` 是你在阿里云账号中申请的 Access Key,`YourEndpoint` 是给 OSS 分配的域名。
### 4.简单上传
使用 OSSClient 的 `putObject`接口进行简单上传。
```java
public class OssService {
private static final String endpoint = "**YourEndpoint**";
private static final String callbackAddress = "**YourCallbackAddress**";
private static final String accessKeyId = "**YourAccessKeyId**";
private static final String accessKeySecret = "**YourAccessKeySecret**";
private static final String testBucket = "**YourBucketName**";
private static final String testObject = "**YourObjectName**";
private static final String uploadFilePath = "**YourUploadFilePath**";
public OSS getOss(Context context) {
OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret);
OSS oss = new OSSClient(context, endpoint, credentialProvider);
return oss;
}
public void asyncPutObjectFromLocalFile() {
// 构造上传请求
PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath);
OSSAsyncTask task = getOss(context).asyncPutObject(put, new OSSCompletedCallback
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
Log.d("PutObject", "UploadSuccess");
Log.d("ETag", result.getETag());
Log.d("RequestId", result.getRequestId());
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {
// 请求异常
if (clientException != null) {
// 本地异常如网络异常等
clientException.printStackTrace();
}
if (serviceException != null) {
// 服务异常
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
}
}
```
其中,`PutObjectRequest` 中设置待上传文件的 Bucket 名称、上传路径和本地文件的绝对路径;OSSAsyncTask 控制上传任务的异步执行结果。
### 5. 简单下载
使用 OSSClient 的 `getObject` 接口进行简单下载。
```java
public class OssService {
// 上文代码省略...
public void asyncGetObject() {
// 构造下载文件请求
GetObjectRequest get = new GetObjectRequest(testBucket, testObject);
OSSAsyncTask task = getOss(context).asyncGetObject(get, new OSSCompletedCallback
@Override
public void onSuccess(GetObjectRequest request, GetObjectResult result) {
InputStream inputStream = result.getObjectContent();
try {
FileOutputStream outputStream = new FileOutputStream(Environment.getExternalStorageDirectory() + "/oss/" + testObject);
byte[] buffer = new byte[2048];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(GetObjectRequest request, ClientException clientException, ServiceException serviceException) {
// 请求异常
if (clientException != null) {
// 本地异常如网络异常等
clientException.printStackTrace();
}
if (serviceException != null) {
// 服务异常
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
}
}
```
其中,`GetObjectRequest` 中设置下载文件的 Bucket 名称和下载路径;OSSAsyncTask 控制下载任务的异步执行结果。
## 结语
OSS 提供安卓 SDK,方便开发者在安卓 APP 中使用它的服务,通过本文,希望可以帮助读者掌握 OSS 安卓开发的核心原理和使用方式。