カテゴリー: Android

Android JavaでS3への画像アップロード

はじめに

こんにちは、初Androidの記事になります!

iOSの初記事と同じく、AWSのS3へ画像をアップロードする方法について、ブログを書きたいと思います(笑)。

今回も簡単にIAMユーザを作成し、ACCESS KEYとSECRET ACCESS KEYを利用した方法で紹介したいと思います。

アプリをリリースする場合は、AWS Cognitoを利用するか、IAMユーザの場合はアクセス権限を十分に絞ってください。

また、iOSのSwiftでS3への画像アップロードの記事も合わせてお読みいただければと思います。

AWS上での事前準備

AWS上での準備については、省略しますが下記の2つを準備してください。

  • S3にバケットを作成
  • IAMユーザの作成(上記のバケットへの「s3:PutObject」権限あり)

Android StudioのGradleでAWS SDKをインストール

app/build.gradleに下記を記載して、インストールします。

dependencies {
    compile 'com.amazonaws:aws-android-sdk-core:2.4.+'
    compile 'com.amazonaws:aws-android-sdk-s3:2.4.+'
}

ManifestにPermissionの追加

AndroidManifest.xmlにインターネット接続のPermissionを追加します。

<uses-permission android:name="android.permission.INTERNET" />

カメラで写真を撮影し、保存先のPathを取得

Intentを使い、標準のカメラアプリで写真を撮影します。カメラ撮影された写真のUriはmImageUriに保存され、後ほど説明するS3へのアップロードにも利用されます。

...
private final static int RESULT_CAMERA = 1001;

private Uri mImageUri;
...
...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState != null){
        mImageUri = savedInstanceState.getParcelable("ImageUri");
    }
    ...
    ...
}

protected void onSaveInstanceState(Bundle outState){
    outState.putParcelable("ImageUri", mImageUri);
}

private void takePicture() {
        // 画像保存先Uriの生成
    File imageDir = new File(
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "IMG"
    );
    imageDir.mkdirs();
    String fileName = DateFormat.format("yyyyMMddHHmmss", Calendar.getInstance()) + ".jpg";
    File imageFile = new File(imageDir, fileName);
    mImageUri = Uri.fromFile(imageFile);

    // Intentでカメラアプリの起動
    Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
    startActivityForResult(intentCamera, RESULT_CAMERA);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == RESULT_CAMERA) {
        if(cameraUri != null){
            // 写真の表示などをする
        }
    }
}

S3へアップロード

カメラ撮影された写真のUriを引数に渡して、S3へアップロードします。

accessKeyとsecretKeyにはAWSで作成したIAMユーザのものを設定してください。

contentTypeには「image/jpeg」、リージョンには「AP_NORTHEAST_1」を指定してください。

あとは、PutObjectRequestクラスのコンストラクタの引数である、bucketNameにはAWS上で作成したバケット名を、keyにはS3上で重複しないようなファイル名を指定してください。

なお、ファイル名はtest/hello.jpgとするとAWSコンソールなどから見た際にtestフォルダ内にhello.jpgファイルが保存されているように見えるので、ファイルをまとめて管理したい場合には、「test/」などのプレフィックスをつけるとよいでしょう。

private void uploadPicture(final Uri imageUri) {
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentType("image/jpeg");
    AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected Boolean doInBackground(Void... params) {
            // 本来はファイルのリサイズなどをして、不必要に大きな画像をアップロードしないこと
            File imageFile = new File(imageUri);

            AmazonS3Client s3Client = new AmazonS3Client(
                                new BasicAWSCredentials("your access key", "your secret key"));
            s3Client.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1));
            PutObjectRequest putRequest = 
                                new PutObjectRequest("your S3 bucket name", "your file name on S3", imageFile);
            putRequest.setMetadata(metadata);
            try {
                s3Client.putObject(putRequest);
            } catch (Exception e) {
                //アップロード失敗
                e.printStackTrace();
                return false;
            }
            return true;
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            if (aBoolean) {
                // アップロード成功
            } else {
                // アップロード成功
            }
        }
    };
    task.execute();
}

 

さいごに

iOSのSwiftでS3への画像アップロードの記事の文書構成となるべく合わせるようにブログを書きました。iOS / AndroidのスマートフォンアプリでAWS S3へファイルアップロードする場合は、ご参考にしていただければと思います。

原弘

twitter: @hir_hara

シェア
執筆者:
原弘
タグ: AndroidAWS

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前