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

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

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

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

Android Studio

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

Kotlin

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

Q&A

0回答

983閲覧

AlarmManagerによる通知の実装

Hdjjnnn

総合スコア1

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2022/11/24 15:23

編集2022/12/07 14:48

前提

kotlinで目覚ましアプリを作ろうとしています.
TimePickerによる時刻の設定はできています.

実現したいこと

AlarmManagerを利用して,TimePickerで指定した時刻と現在時刻が一致したら,アラームを鳴らしたいと思っています.

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

設定した時刻になっても通知がきません.

ソースコード

MainActivity.kt

kotlin

1package com.example.select_alarm 2 3import android.annotation.SuppressLint 4import android.app.AlarmManager 5import android.app.PendingIntent 6import android.content.Intent 7import android.icu.util.Calendar 8import androidx.appcompat.app.AppCompatActivity 9import android.os.Bundle 10import android.os.Handler 11import android.os.Looper 12import android.widget.Button 13import android.widget.TextView 14import android.icu.util.TimeZone 15import android.widget.Switch 16 17class MainActivity : AppCompatActivity() { 18 companion object { 19 const val REQUESTKEY_TIMEPICKER = "selectTime" 20 } 21 22 @SuppressLint("SetTextI18n", "MissingInflatedId") 23 override fun onCreate(savedInstanceState: Bundle?) { 24 super.onCreate(savedInstanceState) 25 setContentView(R.layout.activity_main) 26 27 val switch = findViewById<Switch>(R.id.switch1) 28 switch.setOnCheckedChangeListener{_,ischecked -> 29 if(ischecked){ 30 val alarmManager: AlarmManager = this.getSystemService(ALARM_SERVICE) as AlarmManager 31 val alarmIntent: PendingIntent = Intent(this, AlarmReceiver::class.java).let { intent -> 32 PendingIntent.getBroadcast(this, 0, intent, 0) 33 } 34 val calendar: Calendar = Calendar.getInstance().apply { 35 supportFragmentManager.setFragmentResultListener(REQUESTKEY_TIMEPICKER, this@MainActivity) { _, result -> 36 val Hour = result.getInt(TimePickerDialogFragment.RESULT_HOUR) 37 val Minute = result.getInt(TimePickerDialogFragment.RESULT_MINUTE) 38 timeInMillis = System.currentTimeMillis() 39 set(Calendar.HOUR_OF_DAY, Hour) 40 set(Calendar.MINUTE,Minute) 41 } 42 } 43 alarmManager.setInexactRepeating( 44 AlarmManager.RTC_WAKEUP, 45 calendar.timeInMillis, 46 AlarmManager.INTERVAL_DAY, 47 alarmIntent 48 ) 49 } 50 } 51 52 val nowText = findViewById<TextView>(R.id.nowText) 53 val alarmText = findViewById<TextView>(R.id.alarmText) 54 55 //TimePickerの表示 56 supportFragmentManager.setFragmentResultListener(REQUESTKEY_TIMEPICKER, this) { _, result -> 57 val hour = result.getInt(TimePickerDialogFragment.RESULT_HOUR) 58 val minute = result.getInt(TimePickerDialogFragment.RESULT_MINUTE) 59 if (minute in 0..9) { 60 alarmText.text = "${hour}時0${minute}分" 61 } else { 62 alarmText.text = "${hour}${minute}分" 63 } 64 } 65 //ボタンによる時刻の設定 66 val btnSelectTime = findViewById<Button>(R.id.btnSelectTime) 67 btnSelectTime.setOnClickListener { 68 TimePickerDialogFragment.getInstance(REQUESTKEY_TIMEPICKER).show(supportFragmentManager, null) 69 } 70 71 72 73 val handler = Handler(Looper.getMainLooper()) 74 class TimeDrawer : Runnable { 75 override fun run() { 76 val calendar = Calendar.getInstance() 77 //タイムゾーンを設定⇒日本 78 val tz=TimeZone.getTimeZone("Asia/Tokyo") 79 calendar.timeZone=tz 80 //現在時間の表示 81 val hour = calendar.get(Calendar.HOUR_OF_DAY) 82 val minute = calendar.get(Calendar.MINUTE) 83 val second = calendar.get(Calendar.SECOND) 84 85 if(minute in 0..9){ 86 nowText.text = "${hour}時0${minute}分" 87 }else{ 88 nowText.text = "${hour}${minute}分" 89 } 90 handler.postDelayed(this, (60 - second) * 1000L) 91 } 92 } 93 handler.post(TimeDrawer()) 94 95 } 96} 97

AndroidManifest.xml

kotlin

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools"> 4 5 <application 6 android:allowBackup="true" 7 android:dataExtractionRules="@xml/data_extraction_rules" 8 android:fullBackupContent="@xml/backup_rules" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/Theme.SelectAlarm" 14 tools:targetApi="31"> 15 <activity 16 android:name=".MainActivity" 17 android:exported="true"> 18 <intent-filter> 19 <action android:name="android.intent.action.MAIN" /> 20 21 <category android:name="android.intent.category.LAUNCHER" /> 22 </intent-filter> 23 24 <meta-data 25 android:name="android.app.lib_name" 26 android:value="" /> 27 </activity> 28 <receiver android:name=".AlarmReceiver" android:process=":remote" /> 29 </application> 30 31</manifest>

AlarmReceiver.kt

kotlin

1package com.example.select_alarm 2 3import android.content.BroadcastReceiver 4import android.content.Context 5import android.content.Intent 6import android.widget.Toast 7 8class AlarmReceiver : BroadcastReceiver() { 9 override fun onReceive(context: Context, intent: Intent) { 10 val toast = Toast.makeText(context, "アラームによる処理が実行されました。", Toast.LENGTH_SHORT) 11 toast.show() 12 } 13}

試したこと

どこのコードの部分を改善したら、通知が来るようになるでしょうか?
また、他にこのようにしたほうが良いなど意見がございましたらよろしくお願いします.

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

下記のサイトをもとに作成にあたりました.

https://pg.akihiro-takeda.com/android-alarm/

API:31
Android 12.0(s)

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

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

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

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

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

jimbe

2022/11/25 17:01

アラームマネージャに何もセットしていないようですが。 アラームマネージャの使い方等は調べられましたでしょうか。参考にされたサイトがありましたら URL を追記してください。
Hdjjnnn

2022/11/26 14:50

回答ありがとうございます。 補足情報に追記いたしました。
jimbe

2022/11/27 18:59 編集

リンク先のコードで、「//ここにこの後説明する処理を加える」となっている部分に当てはめるコードが中途半端なのとテキトウに書かれている(Calendar に "set(alarmText.text==nowText.text)" なんて、どうなることもありません) ので、動作していないものと思います。 まずはリンク先の "一定時間後にアラームを実行" をやってみては如何でしょうか。 コードを流用するにしても、それぞれの部分で何をしているのかを理解しなければ身に付きません。
Hdjjnnn

2022/11/30 08:44

回答ありがとうございます。 ご指摘通り、参照したサイトやdevelopersなどを使いコード上で指定した時刻になった場合などは出来ました。しかし、TimePickerで指定した時刻をset()で使おうとすると第2引数の部分が何にすればよいか分かりません。 MainActivityを編集したので見ていただけるとありがたいです。 よろしくお願いいたします。
jimbe

2022/11/30 09:21

> alarmManager.setInexactRepeating( > AlarmManager.RTC_WAKEUP, > calendar.timeInMillis, > AlarmManager.INTERVAL_DAY, > alarmIntent > ) というコードは、毎日 calendar の示す時刻に alarmIntent が実行されることになります。 ですので calendar は実行したい時刻に設定する必要があります。 TimePickerDialogFragment によって FragmentResult として実行したい時刻が届くのであれば、 その時刻を calendar に設定することになるでしょう。 > val hour = result.getInt(TimePickerDialogFragment.RESULT_HOUR) > val minute = result.getInt(TimePickerDialogFragment.RESULT_MINUTE) の hour や minute のことですね。 どのような構造でどのようなタイミングでどの変数にアクセスするかはそれぞれの設計思想に依り、それがプログラミングのキモですので、どうやるのかはご自身次第です。 例えば FragmentResult で受け取った hour や minute を アクティビティのプロパティとしておけば、アクティビティ内ではどこからでもアクセスできます。 Calendar.set(int,int) https://docs.oracle.com/javase/jp/8/docs/api/java/util/Calendar.html#set-int-int- ちなみに第一引数のカレンダ・フィールドというのは、 Calendar.HOUR_OF_DAY とかのことです。 https://www.javadrive.jp/start/calendar/index3.html
Hdjjnnn

2022/12/07 05:48 編集

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問