Android Amazon S3 功能接入

前段時間項目需求需要接入亞馬遜的S3云服務(wù)存儲視頻、圖片資源,但是發(fā)現(xiàn)網(wǎng)上關(guān)于Android 端Amazon S3的資料寫的都不是特別充足,于是專門寫一篇給需要接入此功能的作為參考币叹。

Amazon 官網(wǎng)

Amazon S3 Andoroid SDK文檔

**1.準備工作**

1. 首先你得去Amazon平臺注冊一個賬號(傳送門)

? ? 注冊賬號以后在你的電腦上安裝CLI,這個工具是為應(yīng)用創(chuàng)建模狭,集成和管理AWS云服務(wù)颈抚。

2. 假如你還沒有安裝:node.jsnpm請點擊連接下載最新版本

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ù)刪除、推送考蕾、驗證等等一系列操作祸憋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肖卧,隨后出現(xiàn)的幾起案子蚯窥,更是在濱河造成了極大的恐慌,老刑警劉巖塞帐,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拦赠,死亡現(xiàn)場離奇詭異,居然都是意外死亡葵姥,警方通過查閱死者的電腦和手機荷鼠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牌里,“玉大人颊咬,你說我怎么就攤上這事务甥∧盗桑” “怎么了喳篇?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長态辛。 經(jīng)常有香客問我麸澜,道長,這世上最難降的妖魔是什么奏黑? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任炊邦,我火速辦了婚禮,結(jié)果婚禮上熟史,老公的妹妹穿的比我還像新娘馁害。我一直安慰自己,他們只是感情好蹂匹,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布碘菜。 她就那樣靜靜地躺著,像睡著了一般限寞。 火紅的嫁衣襯著肌膚如雪忍啸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天履植,我揣著相機與錄音计雌,去河邊找鬼。 笑死玫霎,一個胖子當著我的面吹牛凿滤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庶近,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼翁脆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拦盹?” 一聲冷哼從身側(cè)響起鹃祖,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎普舆,沒想到半個月后恬口,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡沼侣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年祖能,在試婚紗的時候發(fā)現(xiàn)自己被綠了站玄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片短蜕。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡窑滞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厘惦,到底是詐尸還是另有隱情,我是刑警寧澤悔醋,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布绸狐,位于F島的核電站,受9級特大地震影響鳞滨,放射性物質(zhì)發(fā)生泄漏洞焙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一拯啦、第九天 我趴在偏房一處隱蔽的房頂上張望澡匪。 院中可真熱鬧,春花似錦褒链、人聲如沸唁情。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甸鸟。三九已至,卻和暖如春赛惩,著一層夾襖步出監(jiān)牢的瞬間哀墓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工喷兼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篮绰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓季惯,卻偏偏與公主長得像吠各,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勉抓,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345