LoginSignup
4
6

More than 3 years have passed since last update.

[Android] 音量変更(=音量ボタン押下)の検出方法

Last updated at Posted at 2019-11-01

昔からあるレガシーな方法ですが、ググって出てくる情報が少し実用性には欠けるため、書いておきます。

手法

音量変更もしくは音量ボタンが押された事を検出するIntentとして、AudioManager.VOLUME_CHANGED_ACTION (android.media.VOLUME_CHANGED_ACTION)があります。これをBroadcastReceiverで受ければ良いだけです。

ここまではググってすぐに出てくる情報ですが、AudioManager.VOLUME_CHANGED_ACTIONは以下の点に注意する必要があります。

  • 一度の音量変更操作で複数のイベントが通知される
    • AudioManager.STREAM_MUSICなどSTREAM毎に通知され、しかも音量変わって無くても通知される
  • 画面ON中の初回ボタン操作時は音量UI表示され、実際には音量が変わらないためにイベント通知されない
  • 画面OFF中は音楽アプリ等で音楽再生していないと、ボタン押してもイベント通知されない
    • ボリュームが変わらないため

ソースコード

AndroidManifest.xml
<receiver android:name=".VolumeChangedActionReceiver">
    <intent-filter>
        <actionandroid:name="android.media.VOLUME_CHANGED_ACTION" />
    </intent-filter>
</receiver>
VolumeChangedActionReceiver.java
public static class VolumeChangedActionReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")) {
            int newVolume = intent.getIntExtra("android.media.EXTRA_VOLUME_STREAM_VALUE", 0);
            int oldVolume = intent.getIntExtra("android.media.EXTRA_PREV_VOLUME_STREAM_VALUE", 0);
            int streamType = intent.getIntExtra("android.media.EXTRA_VOLUME_STREAM_TYPE", 0);

            if (streamType == AudioManager.STREAM_MUSIC) {
                // TODO: write your code
            }
        }
    }
}
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6