java - 如何为媒体音量变化注册 ContentObserver?

标签 java android service 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 方法更改为以下内容

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

关于java - 如何为媒体音量变化注册 ContentObserver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17192253/

相关文章:

java - 跳帧,不显示进度对话框

java - 如何检查DELETE API是否被调用

.net - "Overloaded"方法的 WCF 最佳实践

java - 集成测试每个测试具有不同属性值的 spring 配置

java - java中使用nio包的socketChannel可以从客户端套接字中获取的最大数据大小

java - 致命异常 : main , MainActivity.java

java - JPanel:实现我自己的 PaintComponent() 和渲染子项都不起作用

c# - Xamarin Forms IOS "Entry"不可编辑

Android facebook 4.0.0 分享对话框不分享内容

java - 检查数据库并接收android通知