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

Posted

技术标签:

【中文标题】如何注册 ContentObserver 以更改媒体音量?【英文标题】:How to register ContentObserver for media volume change? 【发布时间】:2013-06-16 01:08:18 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

将您的 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;
    

【讨论】:

谢谢。但这并不是我想要的。当然,它会阻止更新我的 UI,但是当任何设置更改时仍然会调用它。问题是如何为某些特定设置注册 ContentObserver。 这无法完成,因为没有可用的 obserevr。您当前正在做的是,观察 System. 层次结构中的所有后代。设置。读取developer.android.com/reference/android/content/…, boolean, android.database.ContentObserver) 如何使用内容观察器来检测按住音量按钮?【参考方案2】:

您可以使用比 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);

【讨论】:

如何使用内容观察器来检测按住音量按钮? 我也有一个内容观察者的问题:***.com/questions/35256364/volume-always-the-same Settings.System.VOLUME_SETTINGS 不可用【参考方案3】:

安迪·丹尼:

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

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

完美运行。

【讨论】:

以上是关于如何注册 ContentObserver 以更改媒体音量?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法可以知道在将 ContentObserver 用于 android 联系人时更改了哪个联系人?

在 Android 服务中注册 ContentObserver

在旧版本的 API 上更改 ContentObserver Onchange 上的 uri [重复]

联系人 ContentObserver 随机调用

当且仅当 ContactsContract.Contacts.CONTENT_URI 更改时,ContentObserver 应该调用

Android 如何检测更改了哪个联系人?