如何注册 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-sameSettings.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 [重复]
当且仅当 ContactsContract.Contacts.CONTENT_URI 更改时,ContentObserver 应该调用