android studioにてkotlinにて、以下を実装したいです。
初歩的な問題なのかと思いますが、実装できずに困っており、対応方法ご存知の方がおりましたらご教授いただけないでしょうか?
〇やりたいこと
1.AlarmManagerにてアラームをセット
2.アラーム時間になるとBroadcastReceiverが反応
3.Notificationを出す
4.MainActivityの処理に戻る
5.soundPoolで音を鳴らす ←ここができずに困っております。
〇追記
MyNotification.ktで、mainActivityのplayOneReady()メソッドを実行するものの、
soundManagerが初期化されていないということで以下エラーが出ます。
MainActivity.ktで、soundManagerの宣言、初期化はしているものの、
再度MainActiviyを呼び出す際に、soundManagerが再度宣言されるが、onCreate()を経由しないため、
初期化されずエラーになっていると考えています。
対応方法をご存知の方がおりましたらご教授いただけないでしょうか。
エラー
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property soundManager has not been initialized
kotlin
1 2class MainActivity : FragmentActivity(), TimePickerDialog.OnTimeSetListener { 3 private lateinit var binding: ActivityMainBinding 4 private lateinit var soundManager: SoundManager 5 6 var pickedHour: String = "hourTime" //選択された時間 7 var pickedMinute: String = "minuteTime" //選択された分 8 9 var hourInt = 0 10 var minuteInt = 0 11 12 var msg: String? = null 13 14 15 override fun onCreate(savedInstanceState: Bundle?) { 16 super.onCreate(savedInstanceState) 17 binding = ActivityMainBinding.inflate(layoutInflater) 18 setContentView(binding.root) 19 20 soundManager = SoundManager(this) 21 22 23 //決定ボタン押す 24 binding.btnDecide.setOnClickListener { 25 if (hourInt == 0){ 26 Log.d("debug", "時間設定されていない") 27 msg = "時間を設定して下さい" 28 Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() 29 30 } else { 31 Log.d("debug", "時間設定された") 32 val str = String.format(Locale.US, "%d:%d", hourInt, minuteInt) 33 binding.alarmTime.text = str 34 35 msg = "アラーム設定しました" 36 Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() 37 alarmSet() //アラームセット 38 } 39 } 40 } 41 42 43 44 private fun alarmSet() { 45 Log.d("debug", "alarmSet") 46 val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager 47 val calendar = Calendar.getInstance() 48 49 var year = calendar.get(Calendar.YEAR) 50 var month = calendar.get(Calendar.MONTH) 51 var day = calendar.get(Calendar.DAY_OF_MONTH) 52 53 val intent = Intent(this, MyReceiver::class.java) 54 val pendingIntent = PendingIntent.getBroadcast( 55 this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT 56 ) 57 58 calendar.add(Calendar.SECOND, 10) 59 alarmManager.setExact( //正確な時間を設定するsetExact() 60 AlarmManager.RTC_WAKEUP, 61 //calendar.getTimeInMillis(), 62 calendar.timeInMillis, 63 pendingIntent 64 ) 65 Log.d("debug", "alarmSet End") 66 } 67 68 69 //タイマーセット(データを受け取る) TimePickクラスではなくこちらで処理 70 override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) { 71 72 val str = String.format(Locale.US, "%d:%d", hourOfDay, minute) 73 binding.showTime.text = str 74 75 hourInt = hourOfDay 76 minuteInt = minute 77 78 hourZero = hourOfDay.toString() 79 pickedHour = hourZero 80 pickedMinute = minuteZero 81 } 82 83 //時計ダイアログを表示 84 fun showTimePickerDialog(v: View) { 85 val newFragment = TimePick() //TimePickクラスのインスタンス化 86 newFragment.show(supportFragmentManager, "timePicker") 87 } 88}
kotlin
1 2class MyReceiver : BroadcastReceiver() { 3 4 private lateinit var mainActivity: MainActivity 5 6 override fun onReceive(context: Context?, intent: Intent?) { 7 Log.d("debug", "MyReceiver") 8 9 if (context != null) { 10 Log.d("debug", "MyReceiver Inside") 11 MyNotification.sendNotification(context) 12 13 Log.d("debug", "MyReceiver playOneReady ") 14 } 15 } 16}
kotlin
1 2class MyNotification { 3 4 companion object { 5 private const val NOTIFICATION_CHANNEL_ID = "com.example.sample_alarm_manager_channel_id" 6 private const val NOTIFICATION_CHANNEL_NAME = "Time for Workout!!" 7 private const val NOTIFICATION_CHANNEL_DESCRIPTION = "Go To The Gym" 8 private const val NOTIFICATION_TITLE = "sample alarm manager" 9 private const val NOTIFICATION_MESSAGE = "test message." 10 11 fun sendNotification(context: Context) { 12 Log.d("debug", "MyNotification sendNotification") 13 14 val channelId = NOTIFICATION_CHANNEL_ID 15 val channelName = NOTIFICATION_CHANNEL_NAME 16 val channelDescription = NOTIFICATION_CHANNEL_DESCRIPTION 17 18 //Android 8.0 以上ではアプリの通知チャンネルを登録することが必要。 19 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 20 val importance = NotificationManager.IMPORTANCE_DEFAULT 21 val channel = NotificationChannel(channelId, channelName, importance).apply { 22 description = channelDescription 23 } 24 val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager 25 manager.createNotificationChannel(channel) 26 } 27 28 //通知をシステムに登録しています。 29 val builder = NotificationCompat.Builder(context, channelId).apply { 30 setSmallIcon(R.drawable.ic_baseline_info_24) 31 setContentTitle(NOTIFICATION_TITLE) 32 setContentText(NOTIFICATION_MESSAGE) 33 priority = NotificationCompat.PRIORITY_DEFAULT 34 } 35 36 val id = 0 37 NotificationManagerCompat.from(context).notify(id, builder.build()) 38 39 Log.d("debug", "MyNotification sendNotification End") 40 41 //mainActivityのplayOneReady()メソッドを実行 42 val mainActivity = MainActivity() 43 mainActivity.playOneReady() 44 } 45 } 46 47}
回答1件
あなたの回答
tips
プレビュー