4

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

我试过 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();
 }
}
4

3 回答 3

3

将您的 onChange 肉食更改为以下内容

@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;
    }
}
于 2013-07-01T06:35:40.827 回答
0

安迪丹尼:

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

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

它完美地工作。

于 2015-03-08T13:04:48.043 回答
0

您可以使用比 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);
于 2014-05-02T13:38:56.010 回答