端末の音量を取得してSoundPoolの音量を設定
前回書いた記事で、SoundPoolでアラームの音を鳴らした。ただ、今の方法だと音の大きさをKotlinのコード中で手打ちで設定しており、スマートフォン端末で設定した音量と合っていない。これだと音量を0にしていても音が鳴ってしまってちょっと困るので、端末に設定している音量に従った音量で、SoundPoolの音量を設定するようにしてみる。
環境
開発PC環境
Windows 10
Android Studio 4.1.1
実行Android環境
機種:Xperia X Performance SOV33
Androidバージョン:7.0
オーディオファイル(mp3)の置き場所
まず、android.content.Contextをインポートする。
import android.content.Context
次に、以下のようにgetStreamVolumeで音量を取得するのだが、返り値はintになっている。SoundPoolのplayで指定するのは0.0f~1.0fのfloatなので、getStreamVolumeで現在の音量を、getStreamMaxVolumeで最大音量を取得してFloatに変換し、割ることで最大値に対する現在の音量の割合をfloatで算出してSoundPoolのplayで設定している。
val am = getSystemService(Context.AUDIO_SERVICE) as AudioManager val alarmVol: Float = am.getStreamVolume(AudioManager.STREAM_RING).toFloat() var alarmMaxVol: Float = am.getStreamMaxVolume(AudioManager.STREAM_RING).toFloat() var setVol: Float = (alarmVol / alarmMaxVol).toFloat() soundPool.play(soundAlarm, setVol, setVol, 0, 0, 1.0f)
もっと良い方法がありそうな気がするが、とりあえず今回はこれでデバイスの音量を設定することが出来た。
Kotlinのコードとレイアウト
上記のコードは以下のカップ麺タイマーのコードから引用している。
こちらがレイアウトのxml。レイアウトは前回の記事と変わっていない。
実行画面も前回と変わらないので省略するが、これでタイマーが0になったときにアラームで通知されるようになった。ただ、実装してから気づいたけどSoundPoolで音を鳴らすとスマホで設定した音量ではアラームが再生されず、あくまでSoundPool.playのrightVolumeとleftVolumeで設定した音量でされてしまう。
これだと音量を小さく設定していても大きな音でアラームが鳴ってしまってちょっと困るので、次回は現在のスマホの設定ボリュームを取得して、その値をrightVolume/leftVolumeに設定するようにコードを変えてみたいと思う。
参考文献
今回は以下のサイトを参考にさせて頂きましたm(_ _)m
AudioManager | Android デベロッパー | Android Developers
Androidアプリをつくって遊ぼう日記まとめ
以下にAndoirdアプリで遊んでみた軌跡を残しています。興味があればのぞいてみてください。