当我想实现音量变化检测时遇到了问题。 由于必须通过服务在后台检测到变化检测,我无法拦截音量键按下。
我已经尝试过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();
}
}
答案 0 :(得分: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;
}
}
答案 1 :(得分: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);
答案 2 :(得分:0)
Andy Dennie:
我刚刚测试了您建议的方法:
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
它完美无缺。