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
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
int delta=previousVolume-currentVolume;
if(delta>0)
{
Logger.d("Decreased");
previousVolume=currentVolume;
}
else if(delta<0)
{
Logger.d("Increased");
previousVolume=currentVolume;
}
}