今回の記事はAndroidStudio環境のJavaでAndroid端末からAWSのS3バケットに対して、ファイルをアップロードするまでの記事になります。
FluttreでAndroid APPを作成することになっており、その際にどうしてもAWSのS3バケットにファイルをアップロードする必要がありました。しかし、FlutterではAWSのSDKがなかったためFlutterからJavaをcallし、JavaのSDKを用いてS3にファイルアップロードを行うという仕組みになっているので「FluttreからJavaをcallするメソッドチャンネルの使い方」が気になる方はリンクから飛んでください。また、「FluttreでAWSのS3にファイルをアップロードする手順」に関しても記述しているのでで気になる方は見てみてください。
では今回の方針についてです。方針としてはまずは「AWS側でS3のバケットを準備」→「S3バケットにフルアクセスできるIAMロールのユーザを作成し、そのアクセスキーとシークレットキーを入手する」→「Android studioの設定(Javaの設定)」→「JavaでAWSのS3にファイル転送を行うコードご紹介」
では早速メインの記事の方に進んでいきます。
AWS側でS3のバケットを作成
まずAWSのアカウントを持っていない方はアカウントを作成してください。
S3バケットの作成の仕方は簡単で「サービス」から「S3」を選択して「S3」のコンソール画面に進みましょう。
バケット名は適当に決めて「パブリックアクセスを全てブロック」の設定を外します。
あとの設定はいじらずにページ下部のバケット作成をクリックすると先ほどのコンソール画面にバケットが表示されています。
S3バケットにフルアクセスできるIAMロール、そのアクセスキー&シークレットキーを入手する
次に作成したバケットにアクセスできるようにIAMロールでユーザを作成してS3バケットへの通信への権限を付与します。付与されたユーザとして処理を行うためのアクセスキーとシークレットキーが同時に作成されるのでそれらを控えるまでが作業です。
まずは「サービス」から「IAM」をクリックします。
まずはユーザをクリックします。
次にユーザを追加。
「ユーザ名」を適当につける。アクセスに関しては「プログラムによるアクセス」にチェックをつけ次に進みます。
ここで権限を付与するので今回はS3のフル権限を付与します。権限を指定して付与する場合は左上のポリシーの作成から自身で権限ポリシーを作成してください。様々なサイトで権限ポリシーの書き方を紹介しているのでそちらをご参照ください。
次にタグの画面にいきますがそこは何もタグを入れなくとも次に進めるのでそのままで最後の確認まで進めるとダイアログでアクセスキーとシークレットキーが表示されます。これらを控えておくことでAWSでの設定と処理は完了です。
Android studioの設定(Javaの設定)
次にAndroidStudioでのJavaを使用する設定に関してご紹介します。AWSアプロードに必要なSDKはネット経由で拾ってくるためそのための設定を記載しておきます。
ここで申し訳ないのですがAWSアップロード機能単体でコードを書いていたのではないので余分なコードが見られると思います。そこはご了承ください。基本的に下記の設定で問題ないので適宜どの設定が必要かは確認して設定を減らしても問題ないです。
<service
android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
android:enabled="true" />
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
</manifest>
もともとのマニフェストファイルに追加した箇所は「<service・・・」「<uses-perm・・・」の二箇所です。
次にapp/build.gladleの設定に関してです。
dependencies {
implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.6.7@aar') { transitive = true }
implementation 'com.amazonaws:aws-android-sdk-s3:2.6.+'
implementation 'com.amazonaws:aws-android-sdk-cognito:2.6.+'
implementation 'com.amazonaws:aws-android-sdk-s3:2.2.+'
}
flutter {
source '../..'
}
「source ‘../..’」の上にSDKをダウンロードする用のコードを記載しましょう。
以上でjavaを使用できるように設定が完了しました。
JavaでAWSのS3にファイル転送を行うコードご紹介
package com.example.test;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.os.Bundle;
import android.os.AsyncTask;
import android.content.Intent;
import android.content.Context;
import android.content.IntentFilter;
import android.content.ContextWrapper;
import androidx.annotation.NonNull;
import android.device.ScanManager;
import android.device.scanner.configuration.PropertyID;
import android.device.scanner.configuration.Triggering;
//AWS_S3アップロード関連で必要なライブラリ
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.mobile.client.AWSMobileClient;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferState;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver;
//////////////////////////////////////////////////////////////////////////
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String accessKey = "[IAMで作成したアクセスキー]";
String secKey = "[IAMで作成したシークレットキー]";
String buchet = "[作成したバケット名]";
//アップロード用のpath(仮で動画ファイルにしていますがここはなんでもOKです。)
String path = "/data/user/0/com.example.test/app_flutter/Videos/1.mp4";
BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secKey); // AWS認証情報の作成
AmazonS3Client s3Client = new AmazonS3Client(basicAWSCredentials);
//クライアント接続用オブジェクト
TransferUtility transferUtility = new TransferUtility(s3Client, getApplicationContext());//転送用オブジェクト
//バケット名,S3内のファイル名(デイレクトり指定も可能),uploadファイル
TransferObserver observer = transferUtility.upload(buchet, "[upload時のファイル名]", new java.io.File(path));
//log出力用
observer.setTransferListener(new TransferListener() {
@Override
public void onStateChanged(int id, TransferState state) {
Log.d("AwsSample", "status: "+state);
}//完了時(COMPLETED)
@Override
public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
Log.d("AwsSample", "progress: "+id+" bytesCurrent:"+bytesCurrent+" bytesTotal:"+bytesTotal);
}//転送時
@Override
public void onError(int id, Exception ex) {
ex.printStackTrace();
}//失敗時
});
}
}
基本的にはJavaのもともとの設定ファイルに記載しているのみなのでその辺りは適宜編集して作成してみてください。
コード内に説明は多数記載しているので省略します。メインは「Transfer」関連のライブラリで転送を行なっております。
では今回の記事は以上です。先ほども述べましたがFlutterでS3にカメラ画像をアップするなどの記事を書いている際にこの記事のJava操作を合わせて記載しているので気になる方はそちらの記事もご参照ください。
コメント