Change the volume. Listener: is registerMediaButtonEventReceiver preferable for onKeyDown?

We are looking for "the most complete and compatible (i.e. all versions of Android ...)" to listen to volume changes, I found two different approaches for this:

Which method is preferred?

And why?

UPDATE 1:. Thanks to the comment below, I found that onKeyDown () actually uses a volume key, which may not be a complete solution, as one of which can be changed through interfaces other than hardware buttons (not to mention that Google apparently, gradually removing these "exciting" features).

OTOH, android.media.VOLUME_CHANGED_ACTION - this is a hack and is not even documented . This probably means that it will stop working on Android 5 or so ...

UPDATE 2: registerMediaButtonEventReceiver not working at all! (for the hardware volume buttons, which are, I just tried).

Additional Information?

+7
source share
2 answers

It would be great to have BroadcastReceiver for streaming in future APIs, but today, perhaps the best solution is to register ContentObserver for settings (including VOLUME_NOTIFICATION):

 mSettingsContentObserver = new SettingsContentObserver( new Handler() ); this.getApplicationContext().getContentResolver().registerContentObserver( android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver ); 

see this answer for more info: stack overflow

Edit: Fixed using working code. Perhaps this solution is better: stack overflow

+2
source

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; } } 
0
source

All Articles