javaandroidservicecontentobserver

How to register ContentObserver for media volume change?


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();
 }
}

Solution

  • 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;
        }
    }