はじめに
こんにちは、初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に下記を記載して、インストールします。
|   1 2 3 4  |  dependencies {     compile 'com.amazonaws:aws-android-sdk-core:2.4.+'     compile 'com.amazonaws:aws-android-sdk-s3:2.4.+' }  |  
ManifestにPermissionの追加
AndroidManifest.xmlにインターネット接続のPermissionを追加します。
|   1  |  <uses-permission android:name="android.permission.INTERNET" />  |  
カメラで写真を撮影し、保存先のPathを取得
Intentを使い、標準のカメラアプリで写真を撮影します。カメラ撮影された写真のUriはmImageUriに保存され、後ほど説明するS3へのアップロードにも利用されます。
|   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46  |  ... 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/」などのプレフィックスをつけるとよいでしょう。
|   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  |  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へファイルアップロードする場合は、ご参考にしていただければと思います。