AndroidStudio: OpenWeather から気温を取得

こちらのプログラムを AndroidStudio に移植しました。
[Kotlin の例題　(OpenWeather から気温を取得）](https://qiita.com/ekzemplaro/items/5eef9b6d482c9dd143e4)
取得した気温は、ログに出力されます。

## プロジェクトの作成
プロジェクト名: oct2101
Empty Views Activity を選びます。

## 環境設定

インターネットにアクセスできるようにします。

```xml:manifests/AndroidManifest.xml
（省略）
<uses-permission android:name="android.permission.INTERNET" />
（省略）
```

```kts:app/build.gradle.kts
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

android {
    namespace = "com.example.oct2101"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.example.oct2101"
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = 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"
    }
}

dependencies {

    implementation("androidx.core:core-ktx:1.9.0")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.10.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")

        // Retrofit
    val retrofit_version = "2.9.0"
    implementation("com.squareup.retrofit2:retrofit:$retrofit_version")

    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
}
```

## プログラム

```kt:MainActivity.kt
package com.example.oct2101

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Query
import kotlin.concurrent.thread

import com.google.gson.JsonObject

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

       println("*** start ***")
    val baseUrl = "https://api.openweathermap.org/data/2.5/"

    // Retrofitを設定
    val retrofit = Retrofit.Builder()
        .baseUrl(baseUrl)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

        println("*** check bbb ***")
        thread {
            try {

                // Retrofitサービスを作成
                val service = retrofit.create(ApiService::class.java)

                println("*** check ddd ***")
                // HTTPリクエストを送信
                val cityName = "Utsunomiya"
                val apiKey = "*****"
                val units = "metric"
                val response = service.fetchWeather(
                    cityName,
                    apiKey,
                    units
                ).execute()

                println("*** check fff ***")

                if (response.isSuccessful) {
                    val jsonData = response.body()
                    val data = jsonData?.getAsJsonObject("main")
                    println(data)
                    val temp: String? = data?.get("temp")?.asString
                    println("temp = $temp")

                } else {
                    println("HTTPリクエストが失敗しました。ステータスコード: ${response.code()}")
                }
                println("*** end ***")
            } catch (e: Exception) {
                Log.d("response-weather", "debug $e")
            }
        }


    }
}

// Retrofitインターフェースを定義
interface ApiService {
    @GET("weather")
    fun fetchWeather(
    	@Query("q") cityName: String,
        @Query("appid") apiKey: String,
    	@Query("units") units: String
	): Call<JsonObject>
}
```

## 実行

File -> Sync Project with Gradle Files

右三角をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/6e038d15-1756-4dff-a878-b21265c7de68.png)

## 実行結果

View -> Tool Windows -> Logcat
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/9bcc8d35-5b84-caf1-9bf6-290e11e010f6.png)

```text
2023-10-21 10:01:28.206 30224-30245 System.out              com.example.oct2101                  I  *** check fff ***
2023-10-21 10:01:28.211 30224-30245 System.out              com.example.oct2101                  I  {"temp":16.89,"feels_like":16.02,"temp_min":16.89,"temp_max":16.89,"pressure":1008,"humidity":53,"sea_level":1008,"grnd_level":993}
2023-10-21 10:01:28.211 30224-30245 System.out              com.example.oct2101                  I  temp = 16.89
2023-10-21 10:01:28.211 30224-30245 System.out              com.example.oct2101                  I  *** end ***
```

## 画面に表示するように変更

```xml:activity_main.xml
（省略）
<TextView
        android:id="@+id/text_view"
        android:textSize="50sp"
（省略）
```

```kt:Main_Activity.kt
（省略）
import android.widget.TextView
（省略）
var textMessage = findViewById<TextView>(R.id.text_view)
（省略）
   println("temp = $temp")
runOnUiThread {
                            textMessage.text = temp
                        }
（省略）
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ae21fd60-7fb9-c30a-00bf-1250fbacce55.png)