Androidでのサウンド再生はストリームの種類にあわせて細かく設定できます。7種類のストリームそれぞれに音量を設定できます。
AudioManagerで設定できるストリームの種類
ストリームの種類 | 説明 |
---|---|
STREAM_ALARM | アラーム音量 |
STREAM_DTMF | ダイヤル音量 |
STREAM_MUSIC | 音楽再生音量 |
STREAM_NOTIFICATION | 通知音量 |
STREAM_RING | 着信音量 |
STREAM_SYSTEM | システムメッセージ音量 |
STREAM_VOICE_CALL | 通話音量 |
これらのストリームに対しての音量設定はAudioManagerを通じて行います。アプリケーション終了後も変更値は維持されます(システムに反映されたままとなる)。
音量の変更は、Androidシステムの設定アプリが担当する機能です。アプリケーションで音量を変更する場合、ユーザーが予測できる挙動としましょう。たとえばミュージックアプリであればSTREAM_MUSIC(音楽再生)以外の音量を変更しないほうがいいでしょう。ユーザーが予測できないボリュームの変更やミュート設定は混乱の元となります。
また設定値は恒久的であるためアプリケーション内で完結する場合、onResumeメソッドでアプリ起動時の音量を覚えておき、onPauseメソッドなどで元の値に復帰させるなど工夫するとよいでしょう。
ここではAudioManagerで音量変更に使う主なメソッドを紹介します。
AudioManagerのおもな音量設定用メソッド
メソッド名 | 説明 |
---|---|
getStreamVolume | ストリームごと現在の音量を取得する |
getStreamMaxVolume | ストリームごと最大音量を取得する |
setStreamVolume | ストリームごと音量を設定する |
setStreamMute | ミュートON/OFFを設定する |
それぞれストリームごとに音量を調整できます。設定値は0~100、0~7などストリームによって様々です。最大値はストリームごとに異なるため、複数のストリーム種別の音量を同時に変更する場合は、調整幅に注意してください。複数のストリームに対してボリュームを加算(+1)した場合でも再生音量には差があります。
サンプルコードは次のとおりです。
AudioManagerをつかった音量変更サンプルコード
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // AudioManagerを取得する AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); // 現在の音量を取得する int ringVolume = am.getStreamVolume(AudioManager.STREAM_ALARM); // ストリームごとの最大音量を取得する int ringMaxVolume = am.getStreamMaxVolume(AudioManager.STREAM_ALARM); // 音量を設定する am.setStreamVolume(AudioManager.STREAM_ALARM, ringVolume, 0); // ミュート設定をONにする am.setStreamMute(AudioManager.STREAM_ALARM, true); } }
AudioManager経由で音量を取得、変更できます(15,18,21行目)。setStreamVolumeメソッドでは第1引数にストリーム種別、第2引数には音量、第3引数にはフラグを指定します。setStreamMuteメソッドでは第2引数でミュートのON,OFFを指定できます。
setStreamVolumeメソッドと第3引数のflags設定
setStreamVolume (int streamType, int index, int flags)メソッドの引数
引数 | 説明 |
---|---|
int streamType | AudioManagerのストリーム種別定数値を指定 |
int index | 音量の設定値 |
int flags | 音量設定時のインタラクションを指定する |
サンプルコードでsetStreamVolumeメソッドの第3引数は0としましたが、このフラグにはインタラクションを設定できます。AudioManager.FLAG_SHOW_UIを指定すれば、シークバーが画面上に表示され、AudioManager.FLAG_PLAY_SOUNDを指定すると指定音量でサンプルサウンドが流れます。
// 音量を設定する(UI表示かつサウンドを再生する) int flags = AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_PLAY_SOUND; am.setStreamVolume(AudioManager.STREAM_ALARM, ringVolume, flags);
flagsを使えば音量の変更をわかりやすくユーザーに伝えられます。
ボリュームの調整
上記の方法以外にもadjustVolumeメソッド、adjustStreamVolumeメソッドなど音量の大小を指定する調整方法があります。ただし、こちらの方法は音量設定アプリや電話アプリ以外での利用は推奨されていません(システムにゆだねるべき、という思想のもとです)。
adjustVolume (int direction, int flags)メソッドの引数
メソッドの引数 | 説明 |
---|---|
direction | 変更方向(ADJUST_LOWER、ADJUST_RAISE、ADJUST_SAME) |
flags | 音量設定時のインタラクションを指定する |
adjustVolumeメソッドは現在アクティブなストリームに対して音量を調整します(音楽再生中なら音楽、着信中なら着信音量など時々に応じて。またadjustStreamVolumeメソッドではストリーム種別ごとに調整可能です)。
adjustVolumeメソッドの第2引数のdirectionには AudioManager.ADJUST_LOWER, ADJUST_RAISE, ADJUST_SAMEが指定可能です。ボリュームUP/DOWNボタンなどを利用して1ステップごと変更するためのインターフェイスです(ADJUST_SAME指定時は音量は変更されません。現在設定値の確認などに利用できます)。
以上、音量設定について解説でした。おつかれさまでした。