前提・実現したいこと
現在、andoidアプリから画像をサーバーへ送る機能をkotlinで実装しています。
画像はbase64文字列に変換して、文字列として送っています。
サーバーはNode.jsで作られています。
サーバーへ画像の送信はできているのですが、送った後しばらくするとアプリが落ちてしまいます。原因がわからなかったため質問させていただきました。
発生している問題・エラーメッセージ
java.io.InterruptedIOException: timeout
該当のソースコード
MainActivity
package com.websarva.wings.android.testhttpphoto import android.graphics.Bitmap import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Base64 import android.widget.Button import android.widget.ImageView import androidx.core.graphics.drawable.toBitmap import androidx.lifecycle.lifecycleScope import com.squareup.moshi.Moshi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import retrofit2.Retrofit import retrofit2.Retrofit.* import retrofit2.converter.moshi.MoshiConverterFactory import retrofit2.create import java.io.ByteArrayOutputStream import java.util.concurrent.TimeUnit class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val imageView = findViewById<ImageView>(R.id.image) val bit = imageView.drawable.toBitmap(200,200,) val btn = findViewById<Button>(R.id.button2) val moshi = Moshi.Builder() .add(ApplicationJsonAdapterFactory) .build() val okHttpClient = OkHttpClient.Builder() .readTimeout(80, TimeUnit.SECONDS) .connectTimeout(80, TimeUnit.SECONDS) .writeTimeout(80, TimeUnit.SECONDS) .callTimeout(80, TimeUnit.SECONDS) .build() val retrofit = Builder() .client(okHttpClient) .baseUrl("サーバー名") .addConverterFactory(MoshiConverterFactory.create(moshi).asLenient()) .build() val api = retrofit.create<API>() btn.setOnClickListener { val base64 = toBase64toString(bit) val photo1 = Photo( "test", base64 ) lifecycleScope.launch { withContext(Dispatchers.IO) { api.postPhoto(photo1) } } } } private fun toBase64toString(bm: Bitmap):String { val baos = ByteArrayOutputStream() bm.compress(Bitmap.CompressFormat.JPEG,100,baos) val b = baos.toByteArray() return Base64.encodeToString(b, Base64.DEFAULT) } }
API
package com.websarva.wings.android.testhttpphoto import kotlinx.coroutines.delay import okhttp3.RequestBody import retrofit2.Response import retrofit2.http.* import java.io.File import java.util.* interface API { @POST("/register_photo") suspend fun postPhoto(@Body photo: Photo) : Response<Unit> }
Photo
package com.websarva.wings.android.testhttpphoto import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import se.ansman.kotshi.JsonSerializable import se.ansman.kotshi.KotshiJsonAdapterFactory @JsonSerializable data class Photo( val id: String?, val photo: String? ) @KotshiJsonAdapterFactory object ApplicationJsonAdapterFactory : JsonAdapter.Factory by KotshiApplicationJsonAdapterFactory
補足情報(FW/ツールのバージョンなど)
android {
compileSdk 31
defaultConfig { applicationId "com.websarva.wings.android.testhttpphoto" minSdk 21 targetSdk 31 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 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding true }
}
まだ回答がついていません
会員登録して回答してみよう