Androidアプリを触る際にメディアボリュームの現在値が必要だったのですが、音量取得のAPIを調べていると、何故か多くの場合STREAM_ALARM(STREAM_ALARMはアラームです)の取得サンプルが書かれているのですが、大体の場合取得したいのはメディアボリューム(media volume)だと思います。
メディアボリュームはAudioManager.STREAM_MUSICで取得可能です。
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種類のサウンド設定する場合はそれぞれ下記の様な感じになります。
- 通知
- アラーム
- 音楽
- 着信音
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);