昔からあるレガシーな方法ですが、ググって出てくる情報が少し実用性には欠けるため、書いておきます。
手法
音量変更もしくは音量ボタンが押された事を検出する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
}
}
}
}