はじめに
こんにちは、初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 | ... privatefinalstaticintRESULT_CAMERA=1001; privateUri mImageUri; ... ... @Override protectedvoidonCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState!=null){ mImageUri=savedInstanceState.getParcelable("ImageUri"); } ... ... } protectedvoidonSaveInstanceState(Bundle outState){ outState.putParcelable("ImageUri",mImageUri); } privatevoidtakePicture(){ // 画像保存先Uriの生成 File imageDir=newFile( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"IMG" ); imageDir.mkdirs(); StringfileName=DateFormat.format("yyyyMMddHHmmss",Calendar.getInstance())+".jpg"; File imageFile=newFile(imageDir,fileName); mImageUri=Uri.fromFile(imageFile); // Intentでカメラアプリの起動 Intent intentCamera=newIntent(MediaStore.ACTION_IMAGE_CAPTURE); intentCamera.putExtra(MediaStore.EXTRA_OUTPUT,mImageUri); startActivityForResult(intentCamera,RESULT_CAMERA); } @Override protectedvoidonActivityResult(intrequestCode,intresultCode,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 | privatevoiduploadPicture(finalUri imageUri){ ObjectMetadata metadata=newObjectMetadata(); metadata.setContentType("image/jpeg"); AsyncTask<Void,Void,Boolean>task=newAsyncTask<Void,Void,Boolean>(){ @Override protectedBooleandoInBackground(Void...params){ // 本来はファイルのリサイズなどをして、不必要に大きな画像をアップロードしないこと File imageFile=newFile(imageUri); AmazonS3Client s3Client=newAmazonS3Client( newBasicAWSCredentials("your access key","your secret key")); s3Client.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1)); PutObjectRequest putRequest= newPutObjectRequest("your S3 bucket name","your file name on S3",imageFile); putRequest.setMetadata(metadata); try{ s3Client.putObject(putRequest); }catch(Exceptione){ //アップロード失敗 e.printStackTrace(); returnfalse; } returntrue; } @Override protectedvoidonPostExecute(BooleanaBoolean){ if(aBoolean){ // アップロード成功 }else{ // アップロード成功 } } }; task.execute(); } |
さいごに
iOSのSwiftでS3への画像アップロードの記事の文書構成となるべく合わせるようにブログを書きました。iOS / AndroidのスマートフォンアプリでAWS S3へファイルアップロードする場合は、ご参考にしていただければと思います。