Balbas Code

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のインスタンスを指します。
}
}