音量変更の取得と検索したら、キー取得で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());