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

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

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

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

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

566閲覧

ユーザーが入力した時刻に通知が来るようにしたい。

chiryou

総合スコア3

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2023/02/22 10:39

編集2023/02/22 10:49

実現したいこと

  • 時刻指定の通知機能を動作するようにする

前提

kotlinでアプリを作っています。
TimePickerで指定した時刻に通知を飛ばす機能を実装中に以下のエラーメッセージが発生しました。

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

java.lang.NumberFormatException: For input string: ""

AlarmActivty.kt

kotlin

1package com.example.ohurocchi 2 3import android.app.AlarmManager 4import android.app.PendingIntent 5import android.app.TimePickerDialog 6import android.content.Intent 7import android.icu.text.SimpleDateFormat 8import android.icu.util.Calendar 9import android.media.MediaPlayer 10import android.os.Bundle 11import android.util.Log 12import android.widget.* 13import androidx.appcompat.app.AppCompatActivity 14import com.google.firebase.firestore.ktx.firestore 15import com.google.firebase.ktx.Firebase 16 17 18class AlarmActivity : AppCompatActivity(){ 19 20 lateinit var text_et: EditText 21 22 private var am: AlarmManager? = null 23 private var pending: PendingIntent? = null 24 private val requestCode = 1 25 26 override fun onCreate(savedInstanceState: Bundle?) { 27 super.onCreate(savedInstanceState) 28 setContentView(R.layout.activity_alarm) 29 30 text_et = findViewById<EditText>(R.id.text_et) //EditText(入力エリア) 31 32 //EditTextのクリックイベントを設定 33 text_et.setOnClickListener { 34 showTimePickerDialog() 35 } 36 var number : Int = text_et.text.toString().toInt() 37 //アラームを設定するボタン 38 val buttonAlarm: Button = findViewById(R.id.buttonAlarm) 39 buttonAlarm.setOnClickListener { 40 val calendar = java.util.Calendar.getInstance() 41 calendar.timeInMillis = System.currentTimeMillis() 42 // 10sec 43 calendar.add(java.util.Calendar.SECOND, number) 44 val intent = Intent(applicationContext, AlarmNotification::class.java) 45 intent.putExtra("RequestCode", requestCode) 46 pending = PendingIntent.getBroadcast( 47 applicationContext, requestCode, intent, 48 PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE 49 ) 50 51 // アラームをセットする 52 am = getSystemService(ALARM_SERVICE) as AlarmManager 53 if (am != null) { 54 am!!.setExact( 55 AlarmManager.RTC_WAKEUP, 56 calendar.timeInMillis, pending 57 ) 58 59 // トーストで設定されたことをを表示 60 Toast.makeText( 61 applicationContext, 62 "入浴する時間を決定しました!", Toast.LENGTH_SHORT 63 ).show() 64 Log.d("debug", "start") 65 } 66 } 67 } 68 /* 時間ダーダイアログを開くためのメソッド */ 69 fun showTimePickerDialog() { 70 val calendar: Calendar = Calendar.getInstance() 71 72 val cal = Calendar.getInstance() 73 val timeSetListener = TimePickerDialog.OnTimeSetListener { timePicker, hour, minute -> 74 cal.set(Calendar.HOUR_OF_DAY, hour) 75 cal.set(Calendar.MINUTE, minute) 76 //EditTextに選択された時間を設定 77 text_et.setText(SimpleDateFormat("HH:mm").format(cal.time)) 78 } 79 80 //タイムピッカーダイアログを生成および設定 81 TimePickerDialog(this, timeSetListener, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true).show() 82 } 83

AlarmNotification.kt

kotlin

1package com.example.ohurocchi 2 3import android.annotation.SuppressLint 4import android.app.NotificationChannel 5import android.app.NotificationManager 6import android.app.PendingIntent 7import android.content.BroadcastReceiver 8import android.content.Context 9import android.content.Intent 10import androidx.core.app.NotificationCompat 11import androidx.core.app.NotificationManagerCompat 12import java.text.SimpleDateFormat 13import java.util.* 14 15class AlarmNotification : BroadcastReceiver() { 16 // データを受信した 17 @SuppressLint("MissingPermission") 18 override fun onReceive(context: Context, intent: Intent) { 19 val requestCode = intent.getIntExtra("RequestCode", 0) 20 val pendingIntent = PendingIntent.getActivity( 21 context, requestCode, intent, 22 PendingIntent.FLAG_UPDATE_CURRENT or 23 PendingIntent.FLAG_IMMUTABLE 24 ) 25 val channelId = "default" 26 // app name 27 val title = context.getString(R.string.app_name) 28 val currentTime = System.currentTimeMillis() 29 val dataFormat = SimpleDateFormat("HH:mm:ss", Locale.JAPAN) 30 val cTime = dataFormat.format(currentTime) 31 32 // メッセージ 33 val message = "お風呂の時間です! $cTime" 34 35 36 // Notification Channel 設定 37 val channel = NotificationChannel( 38 channelId, title, 39 NotificationManager.IMPORTANCE_DEFAULT 40 ) 41 channel.description = message 42 val notificationManager = 43 // (NotificationManager)context.getSystemService(NotificationManager.class); 44 context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager 45 notificationManager.createNotificationChannel(channel) 46 val builder = NotificationCompat.Builder(context, channelId) 47 .setSmallIcon(R.drawable.ohurocchi_logo) 48 .setContentTitle("おふろっち") 49 .setContentText(message) 50 .setPriority(NotificationCompat.PRIORITY_DEFAULT) 51 .setContentIntent(pendingIntent) 52 .setAutoCancel(true) 53 val notificationManagerCompat = NotificationManagerCompat.from(context) 54 55 56 57 // 通知 58 notificationManagerCompat.notify(R.string.app_name, builder.build()) 59 } 60} 61

試したこと

Edittextのtext_etに値を入れてみたり、Int型に変換など試してみましたが指定された時刻ではなくあらかじめ入っている値で通知が来る状態です。(10なら10秒後)

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

以下参考にしたサイトです。

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

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

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

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

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

jimbe

2023/02/22 11:37

> NumberFormatException はコードのどこで発生していますか。
chiryou

2023/02/22 12:31

質問ありがとうございます。 AlarmActivity.ktの36行目 > var number : Int = text_et.text.toString().toInt() の部分のようです。
jimbe

2023/02/22 13:10 編集

その 36 行目を実行する時点で、 text_et には何も入っていないですよね。 ボタンを押したら text_ex から取り込むのであれば、その行は buttonAlarm.setOnClickListener の処理の中にある必要があるでしょう。
chiryou

2023/02/22 13:51

ご指摘いただいた通りにbuttonAlarm.setOnClickListenerの処理の中に入れてみました。 その結果、 > java.lang.NumberFormatException: For input string: "22:48" というエラーが吐かれました。 該当コードはbuttonAlarm.setOnClickListener内の > var number : Int = text_et.text.toString().toInt() です。 変換がうまくいっていないのでしょうか?
jimbe

2023/02/22 13:54

"22:48" を数値に変換したらどんな値になるとお考えでしょうか。 toInt() は、数字列を整数値に変換するだけです。元の数字列になんの前提もありません。 ":" が入っているから何かの時間に変換されるとかは全くありません。
chiryou

2023/02/22 15:10

ありがとうございます!! おかげさまで解決することができました!
guest

回答1

0

自己解決

ご指定いただいた通り:が邪魔をしていたので:以外を取得することで解決できました。
ありがとうございました。

解決できたコード

kotlin

1 var number : String = text_et.text.toString() 2 Log.d("TAG", number) 3 val HH : String = number.toString().take(2) 4 val hh : Int = HH.toInt() 5 Log.d("TAG", HH) 6 val MM : String = number.toString().takeLast(2) 7 val mm : Int = MM.toInt() 8 9 calendar.set(java.util.Calendar.HOUR_OF_DAY, hh) 10 calendar.set(java.util.Calendar.MINUTE, mm) 11 calendar.set(java.util.Calendar.SECOND, 0)

投稿2023/02/22 15:13

chiryou

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問