[ Android ] 音量変更の取得 VOLUME_CHANGED_ACTIONをBroadcastReceiverで処理

音量変更の取得と検索したら、キー取得でKEYCODE_VOLUME_UP/DOWNの処理が出たけど、キー操作以外でも音量変えれるので対応するものを作ってみた。

android.media.VOLUME_CHANGED_ACTIONをBroadcastReceiverで処理する。

・Android 7.1.1

1.前処理として、アプリごとに固有の音量を持たせる

MainActivityなど最初のほうに書いとく、必要なければ無くてもいい。

super.setVolumeControlStream(AudioManager.STREAM_ALARM);

// 音量に関してはこんな感じで取得
AudioManager audioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
int volume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
int volume_max = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
// 音量セット
int volume_set = 5;
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, volume_set, 0);

2.BroadcastReceiverを継承したclassの作成

※ エラー処理は含めてません。nullチェックなどお好みで。

public class VolumeReceiver extends BroadcastReceiver {

    public static final int RINGER_MODE_CHANGED = 0;
    public static final int VOLUME_CHANGED_ACTION = 1;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.media.RINGER_MODE_CHANGED")) {
            volumeEventCallback.onEventInvoked(RINGER_MODE_CHANGED);
        } else if (intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")) {
            volumeEventCallback.onEventInvoked(VOLUME_CHANGED_ACTION);
        }
    }

    public interface VolumeEventCallback {
        void onEventInvoked(int id);
    }

    private VolumeEventCallback volumeEventCallback;

    private VolumeReceiver(Context context, VolumeEventCallback callback) {
        super();
        volumeEventCallback = callback;

        IntentFilter filter = new IntentFilter();
        filter.addAction("android.media.RINGER_MODE_CHANGED");
        filter.addAction("android.media.VOLUME_CHANGED_ACTION");

        context.registerReceiver(this, filter);
    }

    public static VolumeReceiver register(Context context, VolumeEventCallback callback) {
        return new VolumeReceiver(context, callback);
    }

    public void unregister(Context context) {
        if (context != null)
            context.unregisterReceiver(this);
    }
}

RINGER_MODE_CHANGED:ミュートのイベント
VOLUME_CHANGED_ACTION:音量変更

3.作ったVolumeReceiverを使う

    VolumeReceiver volumeReceiver;
    private void volumeEvent() {
        volumeReceiver = VolumeReceiver.register(getApplicationContext(), new VolumeReceiver.VolumeEventCallback() {
            @Override
            public void onEventInvoked(int id) {
                switch (id) {
                    case VolumeReceiver.RINGER_MODE_CHANGED:
                    case VolumeReceiver.VOLUME_CHANGED_ACTION:
                        final AudioManager audioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
                        int volume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
                        break;
                }
            }
        });
    }

4.いらなくなった時に解除(release?)

volumeReceiver.unregister(getApplicationContext());