如何注册ContentObserver介质体积的变化? [英] How to register ContentObserver for media volume change?

查看:184
本文介绍了如何注册ContentObserver介质体积的变化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了一个问题,当我想要实现体积变化的检测。
由于变化检测在通过服务后台进行检测,我不能拦截音量键presses。

我试过ContentObserver监听音量设置改变,但它并没有奏效。
但是我已经挖多一点,发现我的ContentObserver检测体积变化,当我注册这样的:

  this.getApplicationContext()。getContentResolver()。registerContentObserver(
    android.provider.Settings.System.CONTENT_URI,真实,
    mSettingsContentObserver);

我试图改变的第一个参数 - 设定听,如果我理解正确的URI。但我一无所获。那么,如何才能做到这一点?我不想更新我的每一个设置变化的UI(我设置SeekBar以一定的positin)。

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

下面是ContentObserver的code:

 公共类SettingsContentObserver扩展ContentObserver { 公共SettingsContentObserver(处理程序处理){
     超(处理);
 } @覆盖
 公共布尔deliverSelfNotifications(){
      返回super.deliverSelfNotifications();
 } @覆盖
 公共无效的onChange(布尔selfChange){
     super.onChange(selfChange);
     myMethod的();
 }
}


解决方案

更改您的onChange meathod以下

  @覆盖
公共无效的onChange(布尔selfChange){
    super.onChange(selfChange);    AudioManager音频=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    INT currentVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);    INT三角洲= previousVolume,currentVolume;    如果(增量大于0)
    {
        Logger.d(下降);
        previousVolume = currentVolume;
    }
    否则如果(增量℃,)
    {
        Logger.d(增加);
        previousVolume = currentVolume;
    }
}

I encountered a problem when I wanted to implement volume change detection. As the change detection has to be detected in the background via Service, I can not intercept volume key presses.

I've tried ContentObserver to listen for volume settings change, but it didn't worked. But I've dig a bit more, and found that my ContentObserver detects volume change when I register it like this:

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

I've tried to change the first parameter - the URI of setting to listen, if I understand correctly. But I achieved nothing. So, how can this be done? I don't want to update my UI(I'm setting Seekbar to certain positin) on every settings change.

So, how do I register content observer to listen for media volume change?

Here's the code of 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();
 }
}

解决方案

Change your onChange meathod to the following

@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介质体积的变化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆