在我的应用程序中,我有一个 VerticalSeekBar
(SeekBar
的一些自定义实现),当用户使用硬件按钮更改媒体音量时,它的进度应该会改变。下面是使用 ContentObserver
的半工作解决方案:
public class SettingsContentObserver extends ContentObserver {
private VerticalSeekBar sb;
private AudioManager am;
public SettingsContentObserver(Handler handler, VerticalSeekBar sb, AudioManager am) {
super(handler);
this.sb = sb;
this.am = am;
}
@Override
public boolean deliverSelfNotifications() {
return super.deliverSelfNotifications();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
sb.setProgress(am.getStreamVolume(AudioManager.STREAM_MUSIC));
}
}
Activity :
@Override
protected void onResume() {
super.onResume();
mSettingsContentObserver = new SettingsContentObserver( new Handler(), vBar, audioMan );
this.getApplicationContext().getContentResolver().registerContentObserver(
android.provider.Settings.System.CONTENT_URI, true,
mSettingsContentObserver );
}
问题:检测到音量变化但是有几秒钟的延迟,直到它们被检测到并且 SeekBar
的进度发生变化。
问题:是否有更可靠的方法来监听特定音量流上的音量变化?如果您有一些解决方案,请分享您的解决方案
最佳答案
我已经做了一个在通话时监控音量的解决方案,所以这应该是相似的。
您可以在 Activity (onKey) 中监听按键并检查相应的键码(VOLUME_UP 或 VOLUME_DOWN)。
或者,如果由于某种原因(某些远程 View )您无法监听按键事件,只需以足够快的频率轮询音量级别即可:
使用
am.getStreamVolume(AudioManager.STREAM_MUSIC)
轮询音量。以您想要的频率运行此程序。例如:
private Runnable mVolumeUpdateRunnable = new Runnable() { public void run() { if (shouldUpdate) { updateCurrentVolume(); new Handler().postDelayed(mVolumeUpdateRunnable, VOLUME_SAMPLING_DELAY); } } };
通话费不贵,更新频率高应该问题不大。
关于android - 检测流音量变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16169747/