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

【発端】
自作Androidアプリで作成したファイル（一度に複数生成される。）を
サーバーで管理して、別端末で受け取る必要が出てきたので、
MobileHubからのS3で取り急ぎ実装。


【つまづき】
・s3Clientを指定して！
　というエラーが出る。
・AWS S3　Access Denied
　というエラーが出る。
・同期処理のなかでサーバーとやり取りしないで！
　というエラーが出る。
・複数ファイルのアップロードをどうしたら実装できるのか
　チュートリアルには書かれていない。
・一旦実装したものの、s3Clientを呼び出す所で度々エラーが起きる

似たような悩みを持っていた人たち。
→[AWS S3 Java SDK - Access Denied](https://stackoverflow.com/questions/24139352/aws-s3-java-sdk-access-denied)
→[Amazon s3 upload multiple files android](https://stackoverflow.com/questions/46059515/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に複数のアップロード情報を持たせる。

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