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:
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?
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