X

Androidの音量を設定する

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指定時は音量は変更されません。現在設定値の確認などに利用できます)。

以上、音量設定について解説でした。おつかれさまでした。

mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org