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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

Q&A

解決済

1回答

1227閲覧

お助けください。Android Studio API

MM_LL

総合スコア18

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

0グッド

0クリップ

投稿2022/01/17 21:38

編集2022/01/28 06:27
package com.test.nhkapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.text.method.ScrollingMovementMethod import android.widget.Button import android.widget.TextView import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.json.JSONException import org.json.JSONObject import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader import java.net.URL class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val apiKey = "******" val mainUrl = "https://api.nhk.or.jp/v2/pg/list/130/g1/2022-01-29.json" val tv:TextView = findViewById(R.id.tv) tv.setMovementMethod(ScrollingMovementMethod()) val btn:Button = findViewById(R.id.btn) btn.setOnClickListener { val nhk = "$mainUrl?key=$apiKey" nhkTask(nhk) } } private fun nhkTask(nhk:String) { lifecycleScope.launch { val result = nhkBackgroundTask(nhk) nhkJsonTask(result) } } private suspend fun nhkBackgroundTask(nhk: String): String { val response = withContext(Dispatchers.IO) { var httpResult = "" try { val nhkObj = URL(nhk) val br = BufferedReader(InputStreamReader(nhkObj.openStream())) httpResult = br.use { it.readText() } } catch (e: IOException) { e.printStackTrace() } return@withContext httpResult } return response } private fun nhkJsonTask(result: String) { val tv:TextView = findViewById(R.id.tv) try { val jsonObj = JSONObject(result) val nhkAry = jsonObj.getJSONArray("g1") val nhkObj = nhkAry.getJSONObject(0) val nhk = nhkObj.getString("title") tv.text = nhk } catch (e: JSONException) { e.printStackTrace() } } }

【NHK 番組表API】を作成にあたり、不明点がありご回答いただきたいです。
解決策を教えていただきたいです。
下記URL貼っていますので、確認いただきたいです。

Buttonを押したら、番組名と開始時間、終了時間が出る番組表アプリを作りたいです。
現在"title"と記載し、実行しましたが表示されませんでした。
数日試行錯誤しましたが、まだ分からずにいます
ご教授いただければ幸いです。
よろしくお願いします。

URL

【基本情報】
・開発環境 Android Studio
・言語 Kotlin
・Windows10

【接続環境】
AndroidMaifest.xml
<uses-permission android:name="android.permission.INTERNET"/>

activity_main.xml
TextView、Buttonのみになります。

build.gradle(Module:NHK_App.app)
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.0"}
を追加しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず以下の変更で動きましたよ。

diff

1 // import 追加 (TextView のスクロール用) 2+import android.text.method.ScrollingMovementMethod 3 4 class MainActivity : AppCompatActivity() { 5 6 override fun onCreate(savedInstanceState: Bundle?) { 7 super.onCreate(savedInstanceState) 8 setContentView(R.layout.activity_main) 9 10 val apiKey = "****************" 11- val mainUrl = "https://api.nhk.or.jp/v2/pg/list/" 12 // list には地域 (130:東京)、チャンネル (g1:総合1)、日付 (過去の日付は不可) および拡張子 .json が必要。 13+ //val mainUrl = "https://api.nhk.or.jp/v2/pg/list/130/g1/2022-01-20.json" 14 // list だと丸一日分で結果が長いので、とりあえず試すなら現在放送中の番組がお勧め。 15+ val mainUrl = "https://api.nhk.or.jp/v2/pg/now/130/g1.json" 16 17 val tv:TextView = findViewById(R.id.tv) 18 // tv に結果をたくさん表示できるように、サイズを大きくしてスクロール可能にしておくと良いかも。 19+ tv.setMovementMethod(ScrollingMovementMethod()) 20 val btn:Button = findViewById(R.id.btn) 21 22 btn.setOnClickListener { 23- val nhk = "$mainUrl$apiKey" 24 // key は URL パラメータなので、〜?key=*** とする必要があります。 25+ val nhk = "$mainUrl?key=$apiKey" 26 nhkTask(nhk) 27 } 28 } 29 30 private fun nhkTask(nhk:String) { 31 lifecycleScope.launch { 32 val result = nhkBackgroundTask(nhk) 33 // result を使わずに捨ててしまうのはもったいない…。 34+ nhkJsonTask(result) 35 } 36 } 37 38 private suspend fun nhkBackgroundTask(nhk: String): String { 39 val response = withContext(Dispatchers.IO) { 40 var httpResult = "" 41 42 try { 43 val nhkObj = URL(nhk) 44 val br = BufferedReader(InputStreamReader(nhkObj.openStream())) 45 46- httpResult = br.readLine() 47 // readLine だと 1 行しか読まない (API の結果は改行を含まないことが多いとはいえ…) ので、 48 // readText でまとめて全部読む。また、use を使ってストリームを自動で閉じる。 49+ httpResult = br.use { it.readText() } 50 } catch (e: IOException) { 51 e.printStackTrace() 52 // ここでは JSON のパーズはしてないので、JSONException は不要なはず。 53- } catch (e: JSONException) { 54- e.printStackTrace() 55 } 56 return@withContext httpResult 57 } 58 return response 59 } 60 61 private fun nhkJsonTask(result: String) { 62 val tv:TextView = findViewById(R.id.tv) 63 64- val jsonObj = JSONObject(result) 65- val nhkName = jsonObj.getString("name") 66- tv.text = nhkName 67+ try { 68+ val jsonObj = JSONObject(result) 69 // 結果の JSON のトップレベルには name はないので、代わりに JSON 全体を整形して表示。 70+ tv.text = jsonObj.toString(2) 71 // JSONException を捕まえるならここで。 72+ } catch (e: JSONException) { 73+ e.printStackTrace() 74+ } 75 } 76 }

投稿2022/01/20 02:15

hoshi-takanori

総合スコア7893

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

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

MM_LL

2022/01/27 09:21

ご丁寧な回答ありがとうございます。 とても分かりやすく、無事実行出来ました! 現在、番組名と開始時間、終了時間の表示に悩まされています。 お手数でなければ、またご教授いただきたいです。 このページの質問に追記、変更してあります。 ご確認お願いします。 お手数おかけしますが、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問