如何为媒体音量更改注册ContentObserver?

4

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

我尝试使用ContentObserver来监听音量设置的更改,但它没有工作。但是我进一步发掘了一下,发现我的ContentObserver在像这样注册时可以检测到音量变化:

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

我尝试更改第一个参数(要侦听的设置URI),但未成功。那么,如何实现这一点?我不想在每次更改设置时更新用户界面(我正在将 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();
 }
}
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;
    }
}

谢谢,但这并不是我想要的。当然,它将防止更新我的用户界面,但仍然在任何设置更改时调用。问题是如何为某些特定设置注册ContentObserver。 - Alexander Woodblock
1
无法完成此操作,因为没有可用的观察器。您当前正在执行的操作是观察 System.Settings 层次结构中所有后代。请阅读 http://developer.android.com/reference/android/content/ContentResolver.html#registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver)。 - Aditya
如何使用内容观察器来检测音量按钮的按下操作? - Ruchir Baronia

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

如何使用内容观察器来检测音量按钮的按住操作? - Ruchir Baronia
我还有一个关于内容观察器的问题:http://stackoverflow.com/questions/35256364/volume-always-the-same - Ruchir Baronia
1
Settings.System.VOLUME_SETTINGS 不可用。 - behelit

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

它完美地工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接