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

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

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

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

Android

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

Kotlin

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

Q&A

0回答

1157閲覧

Retrofit2でAPIをリクエストした際にアプリが落ちてしまう

okamoto1234

総合スコア0

HTTP

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

Android

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

Kotlin

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

0グッド

0クリップ

投稿2021/12/16 08:33

前提・実現したいこと

MacOSのPCでlocalhostサーバーを立ててそこのAPIへリクエストを試みています。
エミュレーターではうまくいっていて、実機ではうまく行きません。
実機でうまくいかないのはどういうことなんでしょうか。

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

java.net.ConnectException: Failed to connect to /172.21.*

該当のソースコード

kotlin

1package com.websarva.wings.android.test 2 3import android.content.Context 4import androidx.appcompat.app.AppCompatActivity 5import android.os.Bundle 6import android.util.Log 7import android.view.MotionEvent 8import android.view.View 9import android.widget.Button 10import android.widget.EditText 11import android.widget.LinearLayout 12import androidx.lifecycle.lifecycleScope 13import com.squareup.moshi.Moshi 14import kotlinx.coroutines.launch 15import okhttp3.OkHttpClient 16import retrofit2.Response 17import retrofit2.Retrofit 18import retrofit2.converter.moshi.MoshiConverterFactory 19import retrofit2.create 20import retrofit2.http.Body 21 22class MainActivity : AppCompatActivity() { 23 override fun onCreate(savedInstanceState: Bundle?) { 24 super.onCreate(savedInstanceState) 25 setContentView(R.layout.activity_main) 26 val t1 = findViewById<EditText>(R.id.t1e) 27 val t2 = findViewById<EditText>(R.id.t2e) 28 val t3 = findViewById<EditText>(R.id.t3e) 29 val t4 = findViewById<EditText>(R.id.t4e) 30 val t5 = findViewById<EditText>(R.id.t5e) 31 val t6 = findViewById<EditText>(R.id.t6e) 32 val t7 = findViewById<EditText>(R.id.t7e) 33 val t8 = findViewById<EditText>(R.id.t8e) 34 val btn = findViewById<Button>(R.id.btnSave) 35 btn.setOnClickListener { 36 val moshi = Moshi.Builder() 37 .add(ApplicationJsonAdapterFactory) 38 .build() 39 40 val retrofit = Retrofit.Builder() 41 .baseUrl("http://172.21.*:8080") 42 .addConverterFactory(MoshiConverterFactory.create(moshi)) 43 .build() 44 45 val api = retrofit.create<API>() 46 val device = Device( 47 t1.text.toString(), 48 t2.text.toString(), 49 t3.text.toString(), 50 t4.text.toString(), 51 t5.text.toString(), 52 t6.text.toString(), 53 t7.text.toString(), 54 t8.text.toString() 55 ) 56 lifecycleScope.launch { 57 api.postDevice(device) 58 } 59 } 60 } 61}
dependencies { implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.2' implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0" implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation("se.ansman.kotshi:api:2.7.0") kapt("se.ansman.kotshi:compiler:2.7.0") implementation 'com.squareup.retrofit2:converter-moshi:2.9.0' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }

試したこと

エミュレータを使って10.0.2.2で実行したところうまくいきました。
Macのファイヤーウォールはオフにしています。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

hoshi-takanori

2021/12/16 16:36

baseUrl("http://172.21.*:8080") ですが、接続先の IP アドレスに * なんて使えましたっけ?
okamoto1234

2021/12/16 22:06

すみません。一応IPアドレスを非公開にするためにこんな感じで書いてしまいました。実際には普通のIPアドレスを入れています
hoshi-takanori

2021/12/16 22:26

なるほど。172.21.* はプライベートアドレスのようですが、実機も同じネットワークに属している (Wifi) ってことですよね。Firewall やセキュリティソフトが設定されてたりしますか? また、実機のブラウザから http://172.21.*:8080 にアクセスできますか?
okamoto1234

2021/12/17 03:21

はい。同じwifiをつないでいます。firewallはオフにしてあり、セキュリティソフトは使っていません。chrome://inspect/#devicesを使ってlocalhost:8080へアクセスできました。直接ブラウザにhttp://172.21.*:8080打ち込んでもアクセスはできていません。これが原因でしょうか?
hoshi-takanori

2021/12/17 07:14

サーバーの言語やフレームワークは何を使ってますか?
okamoto1234

2021/12/17 07:27

node.jsとexpress使っています。
okamoto1234

2021/12/18 10:53

してないんですよね、、 とりあえずngrokを使って一時的にURL作成してやることにしてみました、、 いろいろ考えていただいてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問