前段時間項目需求需要接入亞馬遜的S3云服務(wù)存儲視頻、圖片資源,但是發(fā)現(xiàn)網(wǎng)上關(guān)于Android 端Amazon S3的資料寫的都不是特別充足,于是專門寫一篇給需要接入此功能的作為參考币叹。
**1.準備工作**
1. 首先你得去Amazon平臺注冊一個賬號(傳送門)
? ? 注冊賬號以后在你的電腦上安裝CLI,這個工具是為應(yīng)用創(chuàng)建模狭,集成和管理AWS云服務(wù)颈抚。
2. 假如你還沒有安裝:node.js和npm請點擊連接下載最新版本
3. 安裝成功以后在AS的Terminal里面輸入 node -v 查看當前node 版本
輸入npm -v 查看當前npm版本
4. npm更新命令:npm-check 檢查更新 npm-upgrade更新,保證正在運行至少運行Node.js的版本大于8.11+嚼鹉,NPM版本大于5.x
**2.開始接入**
- 先依賴一下所需要的架包
????????//AWS
? ? ? ? implementation 'com.amazonaws:aws-android-sdk-s3:2.12.+'
? ? ? ? implementation('com.amazonaws:aws-android-sdk-mobile-client:2.12.+@aar') { transitive = true }
? ? ? ? implementation('com.amazonaws:aws-android-sdk-auth-userpools:2.12.+@aar') { transitive = true }
? ? ? ? implementation 'org.testng:testng:6.9.6'
? ? ? ? //Base SDK
? ? ? ? implementation 'com.amazonaws:aws-android-sdk-core:2.12.+'
? ? ? ? //AppSync SDK
? ? ? ? implementation 'com.amazonaws:aws-android-sdk-appsync:2.7.+'
? ? ? ? implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
? ? ? ? implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
- 在清單文件里添加
? ? <service android:name="org.eclipse.paho.android.service.MqttService" />
? ? <service android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService" android:enabled="true" />
- 輸入命令? `npm install -g @aws-amplify/cli`
輸入命令? `amplify configure`
輸入完成以后如圖提示跳轉(zhuǎn)到官網(wǎng)去進行用戶創(chuàng)建和配置根據(jù)網(wǎng)站提示操作
創(chuàng)建完成用戶以后會有一個用戶的KeyID和Secret access key 記得保存下來
- 在控制臺Enter后會提示你選擇地區(qū)我這里選擇的是美國東部贩汉,控制臺選擇的地區(qū)和你的桶地區(qū)一致。配置好你在官網(wǎng)創(chuàng)建的Access key ID和Secret access key反砌,之后Enter再創(chuàng)建你的文件名雾鬼。
輸入命令 `amplify init`初始化配置
- 輸入命令 `amplify push`
最后輸入命令 `amplify update api` 我這里已經(jīng)配置好了就直接顯示了
- 這個時候去你的項目里 `./app/src/main/res/raw` 查看 可以看見存在一個
? `awsconfiguration.json`的配置文件,`Buket`是你的桶名宴树,`Region`則是你的地區(qū)策菜,之后需要更換桶名和地區(qū)直接在這更換就好了。
**3.代碼部分**
10. 由于從2.7.0版開始TransferService將不會自動啟動或停止TransferUtility酒贬。所以你必須在你的`Application`里面添加以下代碼去啟動TransferService服務(wù)又憨。
? ? //AWS 上傳
? ? ? ? ? ? mAWSAppSyncClient = AWSAppSyncClient.builder()
? ? ? ? ? ? ? ? ? ? .context(getApplicationContext())
? ? ? ? ? ? ? ? ? ? .awsConfiguration(new AWSConfiguration(getApplicationContext()))
? ? ? ? ? ? ? ? ? ? .build();
? ? ? ? getApplicationContext().startService(new Intent(getApplicationContext(), TransferService.class));
- 上傳文件代碼,我這里上傳一張圖片作為案例锭吨。Constants類里填好自己的Key和密鑰
? ? private static String IMAGE_DATA_NAME = "public/user2"+DateUtil.getYear()+""+DateUtil.getMonth()+""+DateUtil.getDay()+""+ RandomUntil.getNewRandomCode(6)+".jpg";
? ? ? ? //上傳頭像地址(用于下次加載圖片)
? ? ? ? private static String PAHT =? Constants.AMAZON_S3_PIC + IMAGE_DATA_NAME;
? ? /**
? ? ? ? * 上傳到AWS
? ? ? ? */
? ? ? ? private void AwsTest() {
? ? ? ? ? ? AWSMobileClient.getInstance().initialize(getApplicationContext(), new Callback<UserStateDetails>() {
? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void onResult(UserStateDetails userStateDetails) {
? ? ? ? ? ? ? ? ? ? Log.i(TAG, "AWSMobileClient initialized. User State is " + userStateDetails.getUserState());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void onError(Exception e) {
? ? ? ? ? ? ? ? ? ? Log.e(TAG, "Initialization error.", e);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? });
? ? ? ? ? ? uploadWithTransferUtility();
? ? ? ? }
? ? ? ? public void uploadWithTransferUtility() {
? ? ? ? AWSCredentials credentials = new BasicAWSCredentials(Constants.AMAZON_S3_KEY, Constants.AMAZON_S3_KEY_PWD);
? ? ? ? TransferUtility transferUtility =
? ? ? ? ? ? ? ? TransferUtility.builder()
? ? ? ? ? ? ? ? ? ? ? ? .context(getApplicationContext())
? ? ? ? ? ? ? ? ? ? ? ? .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
? ? ? ? ? ? ? ? ? ? ? ? .s3Client(new AmazonS3Client(credentials))
? ? ? ? ? ? ? ? ? ? ? ? .build();
? ? ? ? TransferObserver uploadObserver =
? ? ? ? ? ? ? ? transferUtility.upload(
? ? ? ? ? ? ? ? ? ? ? ? IMAGE_DATA_NAME,
? ? ? ? ? ? ? ? ? ? ? ? new File(mImageCropPath));
? ? ? ? // Attach a listener to the observer to get state update and progress notifications
? ? ? ? uploadObserver.setTransferListener(new TransferListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onStateChanged(int id, TransferState state) {
? ? ? ? ? ? ? ? if (TransferState.COMPLETED == state) {
? ? ? ? ? ? ? ? ? ? // Handle a completed upload.
? ? ? ? ? ? ? ? ? ? LogUtil.d(TAG,"AWS上傳圖片:"+IMAGE_DATA_NAME+"成功");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
? ? ? ? ? ? ? ? float percentDonef = ((float) bytesCurrent / (float) bytesTotal) * 100;
? ? ? ? ? ? ? ? int percentDone = (int)percentDonef;
? ? ? ? ? ? ? ? Log.d("YourActivity", "ID:" + id + " bytesCurrent: " + bytesCurrent
? ? ? ? ? ? ? ? ? ? ? ? + " bytesTotal: " + bytesTotal + " " + percentDone + "%");
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onError(int id, Exception ex) {
? ? ? ? ? ? ? ? // Handle errors
? ? ? ? ? ? ? ? LogUtil.d(TAG,"AWS上傳圖片:"+IMAGE_DATA_NAME+"失敗");
? ? ? ? ? ? ? ? PAHT = "";
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? // If you prefer to poll for the data, instead of attaching a
? ? ? ? // listener, check for the state and progress in the observer.
? ? ? ? if (TransferState.COMPLETED == uploadObserver.getState()) {
? ? ? ? ? ? // Handle a completed upload.
? ? ? ? }
? ? ? ? Log.d("YourActivity", "Bytes Transferred: " + uploadObserver.getBytesTransferred());
? ? ? ? Log.d("YourActivity", "Bytes Total: " + uploadObserver.getBytesTotal());
? ? }
- 在你需要下載的`Activity`的`onCreat`方法中添加
```
? /**
? ? * AWS下載
? ? */
? ? ? private void AwsDownld() {
? ? ? ? ? ? AWSMobileClient.getInstance().initialize(getApplicationContext(), new Callback<UserStateDetails>() {
? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void onResult(UserStateDetails userStateDetails) {
? ? ? ? ? ? ? ? ? ? Log.i(TAG, "AWSMobileClient initialized. User State is " + userStateDetails.getUserState());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void onError(Exception e) {
? ? ? ? ? ? ? ? ? ? Log.e(TAG, "Initialization error.", e);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? });
? ? ? ? ? ? downloadWithTransferUtility();
? ? }
? ? private void downloadWithTransferUtility() {
? ? ? ? TransferUtility transferUtility =
? ? ? ? ? ? TransferUtility.builder()
? ? ? ? ? ? ? ? ? ? .context(getApplicationContext())
? ? ? ? ? ? ? ? ? ? .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
? ? ? ? ? ? ? ? ? ? .s3Client(new AmazonS3Client(AWSMobileClient.getInstance()))
? ? ? ? ? ? ? ? ? ? .build();
? ? ? ? TransferObserver downloadObserver =
? ? ? ? ? ? transferUtility.download(
? ? ? ? ? ? ? ? ? ? "public/s3Key.txt",
? ? ? ? ? ? ? ? ? ? new File("/path/to/file/localFile.txt"));
? ? ? ? // Attach a listener to the observer to get state update and progress notifications
? ? ? ? downloadObserver.setTransferListener(new TransferListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onStateChanged(int id, TransferState state) {
? ? ? ? ? ? ? ? if (TransferState.COMPLETED == state) {
? ? ? ? ? ? ? ? ? ? // Handle a completed upload.
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
? ? ? ? ? ? ? ? ? ? float percentDonef = ((float)bytesCurrent/(float)bytesTotal) * 100;
? ? ? ? ? ? ? ? ? ? int percentDone = (int)percentDonef;
? ? ? ? ? ? ? ? ? ? Log.d("Your Activity", "? ID:" + id + "? bytesCurrent: " + bytesCurrent + "? bytesTotal: " + bytesTotal + " " + percentDone + "%");
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onError(int id, Exception ex) {
? ? ? ? ? ? ? ? // Handle errors
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? // If you prefer to poll for the data, instead of attaching a
? ? ? ? // listener, check for the state and progress in the observer.
? ? ? ? if (TransferState.COMPLETED == downloadObserver.getState()) {
? ? ? ? ? ? // Handle a completed upload.
? ? ? ? }
? ? ? ? Log.d("Your Activity", "Bytes Transferred: " + downloadObserver.getBytesTransferred());
? ? ? ? Log.d("Your Activity", "Bytes Total: " + downloadObserver.getBytesTotal());
? ? }
}
- 最后上傳成功后就可以在Amazon S3控制臺的桶里查看了
**總結(jié)**
Amazon S3上傳蠢莺、下載只是其中兩個比較簡單一些的操作,還有跟蹤轉(zhuǎn)移零如、暫停躏将、恢復(fù)刪除、推送考蕾、驗證等等一系列操作祸憋。