kotlinにて、android studioでアプリの開発を行っております。
カウントダウンタイマーを実装しており、タイマーが0になったとき、soundPoolにて音を再生しています。
〇アプリが開いた状態
タイマーが0になり、音が再生されたとき、停止ボタンを押すことで、音を止めることができます。
〇スリープ状態
カウントダウン中に端末がスリープ状態になり、タイマーが0になり、音が再生されたとき、
端末のスリープを解除し、停止ボタンを押しても音が停止しません。
おそらくsoundpoolの設定を onResume, onPause で最適化できていないからなのかと思っておりますが、
この辺が解決できずに大変困っております。
解決方法がお分かりになる方がおりましたらご教授いただけないでしょうか?
宜しくお願い致します。
コードはその他機能も実装して冗長なため一部切り出して貼りました。
kotlin
1package com.example.xxxxxxxxx 2 3import android.media.AudioAttributes 4import android.media.SoundPool 5import androidx.appcompat.app.AppCompatActivity 6import android.os.Bundle 7import android.os.Handler 8import android.util.Log 9import com.example.handler.databinding.ActivityMainBinding 10 11 12class MainActivity : AppCompatActivity() { 13 private lateinit var binding: ActivityMainBinding 14 private var pomoTimerStarted = false //最初は停止 15 private var soundRunning = false //音が鳴っているかどうか 16 17 val handler = Handler() //一度だけ代入 18 var pomodoroTimeTime = 300 //5min 19 20 21 //音鳴らす////////////////////////////////////////////////////////////////////////////// 22 private lateinit var soundPool: SoundPool 23 private var soundResId = 0 24 private var soundOne = 0 25 var streamId = 0 26 27 //count Down 28 val runnableDown = object : Runnable { 29 override fun run() { 30 pomodoroTimeTime-- 31 32 // ?.letを用いて、nullではない場合のみ更新 33 timeToText(pomodoroTimeTime)?.let{ 34 binding.showTextTime.text = it 35 } 36 handler.postDelayed(this, 1000) 37 38 39 if(pomodoroTimeTime == 0) { 40 soundPlay() 41 } 42 else if(pomodoroTimeTime < 0){ 43 pomodoroTimeTime = 0 44 } 45 else{ 46 } 47 } 48 } 49 50 //アラーム再生 51 val runnableSound = object : Runnable{ 52 override fun run(){ 53 streamId = soundPool.play(soundOne, 1.0f, 1.0f, 0, 0, 1.0f) 54 } 55 } 56 57 override fun onCreate(savedInstanceState: Bundle?) { 58 super.onCreate(savedInstanceState) 59 binding = ActivityMainBinding.inflate(layoutInflater) 60 setContentView(binding.root) 61 62 binding.playStop.setOnClickListener{ 63 if(pomoTimerStarted && !soundRunning) { //downが動作⇒停止 64 breakStopTimer() 65 } 66 67 else if(!pomoTimerStarted && !soundRunning) { //downが停止⇒動作 68 breakStartTimer() 69 } 70 71 else { //音が鳴っている 72 stopAlarm() 73 } 74 } 75 76 77 public fun breakStartTimer(){ 78 binding.playStop.setImageResource(R.drawable.stop) 79 handler.post(runnableDown) 80 81 pomoTimerStarted = true 82 soundRunning = false 83 } 84 85 public fun breakStopTimer(){ 86 binding.playStop.setImageResource(R.drawable.play) 87 handler.removeCallbacks(runnableDown) 88 89 pomoTimerStarted = false 90 soundRunning = false 91 } 92 93 public fun soundPlay(){ 94 Log.d("debug", "soundPlay") 95 96 pomoTimerStarted = false 97 soundRunning = true 98 99 handler.removeCallbacks(runnableDown) //カウントダウンタイマー停止 100 handler.post(runnableSound) //音を鳴らす 101 } 102 103 public fun stopAlarm(){ 104 soundPool.stop(streamId) //アラーム停止もやる 105 handler.removeCallbacks(runnableSound) 106 107 pomodoroTimeTime = 300 108 109 pomoTimerStarted = false 110 soundRunning = false 111 112 binding.playStop.setImageResource(R.drawable.play) 113 } 114 115 public fun soundStarted(){ 116 soundPool.play(soundOne, 1.0f, 1.0f, 0, 0, 1.0f) 117 } 118 119 120 override fun onResume() { 121 super.onResume() 122 Log.d("debug", "onResume") 123 124 //soundPool設定 125 val audioAttributes = AudioAttributes.Builder() 126 .setUsage(AudioAttributes.USAGE_GAME) 127 .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) 128 .build() 129 130 soundPool = SoundPool.Builder() 131 .setAudioAttributes(audioAttributes) 132 .setMaxStreams(2) 133 .build() 134 135 soundOne = soundPool.load(this, R.raw.bellsound, 1) 136 137 // load が終わったか確認する場合 138 soundPool.setOnLoadCompleteListener{ soundPool, sampleId, status -> 139 Log.d("debug", "sampleId=$sampleId") 140 Log.d("debug", "status=$status") 141 } 142 143 144 //サウンドをメモリにロード 145 soundPool = SoundPool.Builder().run { 146 val audioAttributes = AudioAttributes.Builder().run { 147 setUsage(AudioAttributes.USAGE_ALARM) 148 build() 149 } 150 setMaxStreams(1) 151 setAudioAttributes(audioAttributes) 152 build() 153 } 154 soundResId = soundPool.load(this, R.raw.lazer, 1) 155 } 156 157 override fun onPause() { //アクティビティ非表示 (バックグラウンドでの動作) 158 super.onPause() 159 Log.d("debug", "onPause") 160 161 if(pomodoroTimeTime < 0){ 162 soundPlay() 163 } 164 } 165 166}
回答1件
あなたの回答
tips
プレビュー