To listen to all volumes, the best way for me is to use ContentObserver. Here is my code:
public class AudioVolumeObserver { public interface OnAudioStreamVolumeChangedListener { void onAudioStreamVolumeChanged(ArrayList<Integer> audioStreamType); } public interface OnAudioModeVolumeChangedListener { void onAudioModeVolumeChanged(int volumeMode); } private static class AudioVolumeContentObserver extends ContentObserver { private final AudioManager mAudioManager; private final OnAudioStreamVolumeChangedListener mVolumeStreamListener; private final OnAudioModeVolumeChangedListener mVolumeModeListener; private int[] currentVolumeStreams = new int[6]; private int[] lastVolumeStreams = new int[6]; private int currentVolumeMode; private int lastVolumeMode; ArrayList<Integer> changedVolumeStreams = new ArrayList<>(); public AudioVolumeContentObserver( @NonNull Handler handler, @NonNull AudioManager audioManager, @NonNull OnAudioModeVolumeChangedListener volumeModeListener, @NonNull OnAudioStreamVolumeChangedListener volumeStreamListener) { super(handler); mAudioManager = audioManager; mVolumeModeListener = volumeModeListener; mVolumeStreamListener = volumeStreamListener; lastVolumeMode = mAudioManager.getRingerMode(); lastVolumeStreams[0] = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); lastVolumeStreams[1] = mAudioManager.getStreamVolume(AudioManager.STREAM_SYSTEM); lastVolumeStreams[2] = mAudioManager.getStreamVolume(AudioManager.STREAM_RING); lastVolumeStreams[3] = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); lastVolumeStreams[4] = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM); lastVolumeStreams[5] = mAudioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION); } @Override public void onChange(boolean selfChange) { currentVolumeMode = mAudioManager.getRingerMode(); currentVolumeStreams[0] = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); currentVolumeStreams[1] = mAudioManager.getStreamVolume(AudioManager.STREAM_SYSTEM); currentVolumeStreams[2] = mAudioManager.getStreamVolume(AudioManager.STREAM_RING); currentVolumeStreams[3] = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); currentVolumeStreams[4] = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM); currentVolumeStreams[5] = mAudioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION); if (currentVolumeMode != lastVolumeMode){ lastVolumeMode = currentVolumeMode; mVolumeModeListener.onAudioModeVolumeChanged(currentVolumeMode); } changedVolumeStreams.clear(); for (int i=0; i<6; i++) if (currentVolumeStreams[i] != lastVolumeStreams[i]) { lastVolumeStreams[i] = currentVolumeStreams[i]; changedVolumeStreams.add(i); } if (!changedVolumeStreams.isEmpty()){ mVolumeStreamListener.onAudioStreamVolumeChanged(changedVolumeStreams); } } } private final Context mContext; private AudioVolumeContentObserver mAudioVolumeContentObserver; public AudioVolumeObserver( @NonNull Context context) { mContext = context; } public void start(@NonNull OnAudioModeVolumeChangedListener volumeModeListener, @NonNull OnAudioStreamVolumeChangedListener volumeStreamListener) { stop(); Handler handler = new Handler(); AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); mAudioVolumeContentObserver = new AudioVolumeContentObserver(handler, audioManager, volumeModeListener, volumeStreamListener); mContext.getContentResolver() .registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mAudioVolumeContentObserver); } public void stop() { if (mAudioVolumeContentObserver == null) { return; } mContext.getContentResolver() .unregisterContentObserver(mAudioVolumeContentObserver); mAudioVolumeContentObserver = null; } }
polis
source share