Java
Android
AWS
S3
mobilehub

【AWS・S3】 結局、複数ファイルのアップロードはどうやるの?

【発端】
自作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に複数のアップロード情報を持たせる。

で動くように。
細かい部分の理解は飛ばしてしまっているので、ドキュメントを確認次第補足します。
英文ドキュメントありがとう。