
Androidアプリを触る際にメディアボリュームの現在値が必要だったのですが、音量取得のAPIを調べていると何故か多くの場合STREAM_ALARMの取得サンプルが書かれているのですが、大体の場合取得したいのはメディアボリューム(media volume)だと思います。(STREAM_ALARMはアラームです)
メディアボリュームはAudioManager.STREAM_MUSICで取得可能です。
1 2 3 |
AudioManager audioManager = (AudioManager)getSystemService(AUDIO_SERVICE); int amsm = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); Log.d("Debug STREAM_MUSIC", String.valueOf(amsm)); |
取得だけではなくボリュームを制御したいケースもあると思います。
古くからある多くのブログや質問でonKeyDownとonKeyUpボタンをオーバーライド(override)しているものも見かけますが基本的にはしない方が望ましく、
onCreate()でsetVolumeControlStream(AudioManager.STREAM_MUSIC);
この1行を使用する方がはるかに良いです。
アプリケーションが表示されているときはボリュームボタンがメディアボリュームに影響を与えるべきであり、それがアプリケーションに使用するボリュームであることをOSに伝えます。
ユーザーが予測しないボリュームの変更やミュートは混乱を生みます。また、どのアプリが表示されているかに関係なくメディアの音量を制御することに関しては、アプリ自身がそのタイミングで変更可能かどうかは分かりません。
海外向けのGoogle Groupsを介したやり取りで下記の様なものがありました。
ボリュームキーを自分で処理しないでください。ボリュームキーの動作を壊さないことを保証するのはほぼ不可能です。
onCreate()でこのAPIを呼び出します。
setVolumeControlStream(AudioManager.STREAM_MUSIC);
これは、アプリケーションにフォーカスがあるときに、音量キーで音楽の音量を調整する必要があることをAudioManagerに伝えます。
Androidの4種類のサウンド設定する場合はそれぞれ下記の様な感じになります。
- 通知
- アラーム
- 音楽
- 着信音
1 2 3 4 5 6 7 8 9 10 11 12 |
AudioManager audioManager = (AudioManager)getSystemService(AUDIO_SERVICE); int audioFlags = AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_PLAY_SOUND; // それぞれの設定音量 int setVolume = 5; //通知 audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION,setVolume,audioFlags); //アラーム audioManager.setStreamVolume(AudioManager.STREAM_ALARM,setVolume,audioFlags); //音楽 audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,setVolume,audioFlags); //着信音 audioManager.setStreamVolume(AudioManager.STREAM_RING,setVolume,audioFlags); |