如何注册ContentObserver以更改媒体卷?

当我想实现音量变化检测时遇到了问题。 由于必须通过服务在后台检测到变化检测,我无法拦截音量键按下。

我已经尝试过ContentObserver来监听音量设置的变化,但它没有奏效。 但是我挖了一些,发现我的ContentObserver在我注册时会检测到音量变化:

this.getApplicationContext().getContentResolver().registerContentObserver( android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver ); 

我已经尝试更改第一个参数 – 设置为要监听的URI,如果我理解正确的话。 但我什么也没做到。 那么,怎么做呢? 我不想在每次设置更改时更新我的​​UI(我将Seekbar设置为某个位置)。

那么,如何注册内容观察者来监听媒体卷的变化?

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

将您的onChange meathod更改为以下内容

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

您可以使用比Settings.System.CONTENT_URI更具体的URI来监视特定流的更改。 Settings.System.getUriFor()方法将返回特定流的URI。

例如:

 Uri uri = Settings.System.getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_RING]); appContext.getContentResolver().registerContentObserver(uri, true, myObserver); 

安迪丹尼:

我刚刚测试过您建议的方法:

Uri uri = Settings.System .getUriFor(Settings.System.VOLUME_SETTINGS[AudioManager.STREAM_MUSIC]); appContext.getContentResolver().registerContentObserver(uri, true, myObserver);

如果我注册此URI,则不会检测到STREAM_MUSIC上的卷更改。 但是,如果我使用

android.provider.Settings.System.CONTENT_URI

它完美地运作。