【発端】
自作Androidアプリで作成したファイル(一度に複数生成される。)を
サーバーで管理して、別端末で受け取る必要が出てきたので、
MobileHubからのS3で取り急ぎ実装。
【つまづき】
・s3Clientを指定して!
というエラーが出る。
・AWS S3 Access Denied
というエラーが出る。
・同期処理のなかでサーバーとやり取りしないで!
というエラーが出る。
・複数ファイルのアップロードをどうしたら実装できるのか
チュートリアルには書かれていない。
・一旦実装したものの、s3Clientを呼び出す所で度々エラーが起きる
似たような悩みを持っていた人たち。
→AWS S3 Java SDK - Access Denied
→Amazon s3 upload multiple files android
【解決】
class AsyncAWS_upload extends AsyncTask<String, Void, String> {
Activity BaseActivity;
AsyncAWS_upload(Activity activity) {
this.BaseActivity = activity;
}
@Override
protected String doInBackground(String... strings) {
uploadData();
return null;
}
public void uploadData() {
TransferUtility transferUtility =
TransferUtility.builder()
.context(getApplicationContext())
.awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
.s3Client(new AmazonS3Client(AWSMobileClient.getInstance().getCredentialsProvider()))
.build();
TransferObserver uploadObserver =
transferUtility.upload(
"protected/hoge.file",
new File(Environment.getExternalStorageDirectory() + "/hoge.file"));
transferUtility.upload(
"hogehoge_test/hoge.csv",
new File(Environment.getExternalStorageDirectory() + "/hoge.csv"));
uploadObserver.setTransferListener(new TransferListener() {
@Override
public void onStateChanged(int id, TransferState state) {
if (TransferState.COMPLETED == state) {
LOGD("XXXTransferStateonStateChanged", "FINISH");
// Handle a completed upload.
}
}
@Override
public void onProgressChanged(
int id, long bytesCurrent, long bytesTotal) {
LOGD("XXXTransferStateonProgressChanged", "HERE");
// TODO Auto-generated method stub
}
@Override
public void onError(int id, Exception ex) {
// TODO Auto-generated method stub
LOGD("XXXTransferStateonError", String.valueOf(ex));
}
});
// If your upload does not trigger the onStateChanged method inside your
// TransferListener, you can directly check the transfer state as shown here.
if (TransferState.COMPLETED == uploadObserver.getState()) {
}
}
}
・s3Clientを指定してあげる。(コードは公式のものを使用)
・buold.gradeleには
compile ('com.amazonaws:aws-android-sdk-mobile-client:2.6.+@aar') { transitive = true; }
と正しく記載しないと、com.amazonaws.mobile.client.AWSMobileClient
が読み込まれません。
・バゲットへのアクセス権限をホスト側で設定変更。
・非同期処理のためのサブクラスをつくり、メインクラスから実行させる。
・transferUtilityに複数のアップロード情報を持たせる。
で動くように。
細かい部分の理解は飛ばしてしまっているので、ドキュメントを確認次第補足します。
英文ドキュメントありがとう。