Volume change Listener: Is registerMediaButtonEventReceiver preferable to onKeyDown?

uTubeFan picture uTubeFan · Mar 5, 2013 · Viewed 11.2k times · Source

Looking for a "most comprehensive & compatible (i.e. all Android versions...)" way to listen to volume changes, I found 2 different approaches to handle this:

  1. registerMediaButtonEventReceiver
  2. onKeyDown + SettingsContentObserver

Which method is preferable?

And why?

UPDATE 1: Thanks to the comment below, I discovered that onKeyDown() actually takes over the volume key, which may not be a complete solution as one of the posts mentioned that volume could be changed via interfaces other than the hardware buttons (not to mention that Google seems to be gradually taking away those "take over" capabilities).

OTOH, android.media.VOLUME_CHANGED_ACTION is a hack and isn't even documented. Which probably means it will cease to work in Android 5 or so...

UPDATE 2: registerMediaButtonEventReceiver doesn't work at all! (for the volume hardware buttons that is, I just tried it).

Additional insights?

Answer

jBilbo picture jBilbo · Mar 14, 2013

It would be great to have in future APIs a BroadcastReceiver for volume streams, but today maybe the best solution is to register a ContentObserver for the settings (that includes 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: https://stackoverflow.com/a/7017516/117382

Edit: Corrected with working code. Maybe this solution is better: https://stackoverflow.com/a/17398781/117382