AndroidからS3へアップロードする
公開日: 2023-10-22 22:07:28
AndroidからS3にアップロードする部分で非常に苦戦したので自分用にメモを置いておきます。
AndroidはSDKのverやらKotlinのVerの部分でエラーが出まくりで、そこの知識がないとどうやって直せばいいのか?わからないため非常に苦戦しました。
ファイルの構成はこんな感じです。
JavaフォルダにKotlinが突っ込んであるのは気にしないでください笑
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Test1"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
build.gradle(Project)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
// 使用するKotlinのバージョンに更新
kotlin_version = '1.7.10'
}
repositories {
// 必要なリポジトリがある場合はここに追加
google()
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.android.tools.build:gradle:7.3'
}
}
plugins {
id 'com.android.application' version '8.1.2' apply false
}
allprojects {
}
task clean(type: Delete) {
delete rootProject.buildDir
}
build.gradle(Module)
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
namespace 'com.example.test1'
compileSdk 33
defaultConfig {
applicationId "com.example.test1"
minSdk 29
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
implementation 'com.amazonaws:aws-android-sdk-s3:2.+'
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.7.10"
}
S3UploadFromKotlin(Kotlin)
package com.example.test1
import android.content.Context
import android.util.Log
import com.amazonaws.ClientConfiguration
import com.amazonaws.auth.BasicAWSCredentials
import com.amazonaws.regions.Region
import com.amazonaws.regions.Regions
import com.amazonaws.services.s3.AmazonS3Client
import java.io.File
import java.io.FileWriter
import java.util.concurrent.Executors
class S3UploadFromKotlin {
companion object {
// AWSアクセスキー
private const val ACCESS_KEY = "testAccessKey"
// AWSシークレットキー
private const val SECRET_KEY = "testSecretAccessKey"
// バケット名
private const val BUCKET_NAME = "BucketName"
}
private val executorService = Executors.newSingleThreadExecutor()
fun uploadFile(context: Context) {
executorService.execute {
try {
// アプリの内部ストレージに空のファイルを作成
val root = File(context.filesDir, "MyFolder")
if (!root.exists()) {
root.mkdirs()
}
val emptyFile = File(root, "emptyfile.txt")
FileWriter(emptyFile).use { writer ->
writer.flush() // 空のファイルを作成
}
// S3にファイルをアップロード
val awsCreds = BasicAWSCredentials(ACCESS_KEY, SECRET_KEY)
// AmazonS3クライアントのインスタンスを作成
val s3Client = AmazonS3Client(awsCreds, ClientConfiguration())
// エンドポイントを設定
s3Client.setEndpoint("https://s3-ap-northeast-1.amazonaws.com")
// リージョンを設定 ここでは東京(AP_NORTHEAST_1)を指定
s3Client.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1))
Log.d("S3", "アップロード中")
// S3にファイルをアップロード
s3Client.putObject(BUCKET_NAME, emptyFile.name, emptyFile)
Log.d("S3", "アップロード成功")
} catch (e: Exception) {
// エラーの場合は、ログに記録
Log.e("S3Upload", "Error during file upload", e)
}
}
}
}
MainActivity(Java)
package com.example.test1;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// パーミッションの確認はここでは行いませんので、直接ファイルアップロード処理を呼び出します
uploadFileToS3();
}
/**
* 空のファイルを作成し、それをAmazon S3にアップロードする
*/
private void uploadFileToS3() {
// S3UploadFromKotlinのインスタンスを作成
S3UploadFromKotlin s3Uploader = new S3UploadFromKotlin();
// uploadFileメソッドを呼び出します。
// このメソッドがContextを必要とする場合は、'this'を引数として渡すことができます。
s3Uploader.uploadFile(this); // 'this'はMainActivityのインスタンスを指します。
}
}