I encountered a problem when I wanted to implement volume change detection. As the change detection has to be detected in the background via Service, I can not intercept volume key presses.
I've tried ContentObserver to listen for volume settings change, but it didn't worked. But I've dig a bit more, and found that my ContentObserver detects volume change when I register it like this:
this.getApplicationContext().getContentResolver().registerContentObserver(
android.provider.Settings.System.CONTENT_URI, true,
mSettingsContentObserver );
I've tried to change the first parameter - the URI of setting to listen, if I understand correctly. But I achieved nothing. So, how can this be done? I don't want to update my UI(I'm setting Seekbar to certain positin) on every settings change.
So, how do I register content observer to listen for media volume change?
Here's the code of ContentObserver:
public class SettingsContentObserver extends ContentObserver {
public SettingsContentObserver(Handler handler) {
super(handler);
}
@Override
public boolean deliverSelfNotifications() {
return super.deliverSelfNotifications();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
myMethod();
}
}
Change your onChange meathod to the following
You can monitor for changes to a specific stream by using a more specific URI than Settings.System.CONTENT_URI. The method
Settings.System.getUriFor()
will return the URI for a specific stream.For example:
Andy Dennie:
I have just tested approach suggested by you:
Uri uri = Settings.System .getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_MUSIC]); appContext.getContentResolver().registerContentObserver(uri, true, myObserver);
and if I register for this URI, volume changes on STREAM_MUSIC aren't detected. But If I use
android.provider.Settings.System.CONTENT_URI
it works perfectly.