質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1875閲覧

Androidアプリから画像をサーバーに送信した後にアプリが落ちてしまう

okamoto1234

総合スコア0

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/01/10 08:55

前提・実現したいこと

現在、andoidアプリから画像をサーバーへ送る機能をkotlinで実装しています。
画像はbase64文字列に変換して、文字列として送っています。
サーバーはNode.jsで作られています。
サーバーへ画像の送信はできているのですが、送った後しばらくするとアプリが落ちてしまいます。原因がわからなかったため質問させていただきました。

発生している問題・エラーメッセージ

java.io.InterruptedIOException: timeout

該当のソースコード

MainActivity

1package com.websarva.wings.android.testhttpphoto 2 3import android.graphics.Bitmap 4import androidx.appcompat.app.AppCompatActivity 5import android.os.Bundle 6import android.util.Base64 7import android.widget.Button 8import android.widget.ImageView 9import androidx.core.graphics.drawable.toBitmap 10import androidx.lifecycle.lifecycleScope 11import com.squareup.moshi.Moshi 12import kotlinx.coroutines.Dispatchers 13import kotlinx.coroutines.launch 14import kotlinx.coroutines.withContext 15import okhttp3.OkHttpClient 16import retrofit2.Retrofit 17import retrofit2.Retrofit.* 18import retrofit2.converter.moshi.MoshiConverterFactory 19import retrofit2.create 20import java.io.ByteArrayOutputStream 21import java.util.concurrent.TimeUnit 22 23class MainActivity : AppCompatActivity() { 24 override fun onCreate(savedInstanceState: Bundle?) { 25 super.onCreate(savedInstanceState) 26 setContentView(R.layout.activity_main) 27 28 val imageView = findViewById<ImageView>(R.id.image) 29 val bit = imageView.drawable.toBitmap(200,200,) 30 val btn = findViewById<Button>(R.id.button2) 31 val moshi = Moshi.Builder() 32 .add(ApplicationJsonAdapterFactory) 33 .build() 34 val okHttpClient = OkHttpClient.Builder() 35 .readTimeout(80, TimeUnit.SECONDS) 36 .connectTimeout(80, TimeUnit.SECONDS) 37 .writeTimeout(80, TimeUnit.SECONDS) 38 .callTimeout(80, TimeUnit.SECONDS) 39 .build() 40 val retrofit = Builder() 41 .client(okHttpClient) 42 .baseUrl("サーバー名") 43 .addConverterFactory(MoshiConverterFactory.create(moshi).asLenient()) 44 .build() 45 val api = retrofit.create<API>() 46 47 btn.setOnClickListener { 48 val base64 = toBase64toString(bit) 49 val photo1 = Photo( 50 "test", 51 base64 52 ) 53 lifecycleScope.launch { 54 withContext(Dispatchers.IO) { 55 api.postPhoto(photo1) 56 } 57 } 58 } 59 } 60 private fun toBase64toString(bm: Bitmap):String { 61 val baos = ByteArrayOutputStream() 62 bm.compress(Bitmap.CompressFormat.JPEG,100,baos) 63 val b = baos.toByteArray() 64 return Base64.encodeToString(b, Base64.DEFAULT) 65 } 66 67}

API

1package com.websarva.wings.android.testhttpphoto 2 3import kotlinx.coroutines.delay 4import okhttp3.RequestBody 5import retrofit2.Response 6import retrofit2.http.* 7import java.io.File 8import java.util.* 9 10interface API { 11 @POST("/register_photo") 12 suspend fun postPhoto(@Body photo: Photo) : Response<Unit> 13}

Photo

1package com.websarva.wings.android.testhttpphoto 2 3import com.squareup.moshi.JsonAdapter 4import com.squareup.moshi.Moshi 5import se.ansman.kotshi.JsonSerializable 6import se.ansman.kotshi.KotshiJsonAdapterFactory 7 8@JsonSerializable 9data class Photo( 10 val id: String?, 11 val photo: String? 12) 13@KotshiJsonAdapterFactory 14object 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 }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/01/10 09:48

> 原因がわからなかった > timeout 出てますけど。 送信した後、適切に始末していないのではないでしょうか。
okamoto1234

2022/01/10 10:04

始末とはどうゆうことでしょうか? 送信が成功した場合、何もしなくても勝手に終わってくれると思っていました。
jimbe

2022/01/10 10:10

> 何もしなくても勝手に終わってくれると思っていました そう思っていたとしても、現象からみて"そうではないかもしれない"と認識を疑う必要があるのではないでしょうか? そこから、使っているライブラリ等で、使った後に何をするべきとなっているのかを調べる動機が生まれると思います。
okamoto1234

2022/01/10 10:35

一応、成功しているのにtimeoutする理由はなんなのかは調べてみました。 スレッドの問題なのかライブラリの使用の仕方が悪いのか、いまいちわからなかったため質問してみました。同じ方法で複数の文字列をJSONサーバーに送った時は、timeoutでアプリが落ちることはなかったので、画像ではなぜそうなるのかが調べてもわかりませんでした。
guest

回答1

0

自己解決

サーバーの問題でした。

投稿2022/01/10 13:26

okamoto1234

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問