1

在我的应用程序中,我有一个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));

}
    }

活动:

        @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进度发生变化。

问题:是否有更可靠的方法来监听特定音量流的音量变化?请分享你的解决方案,以防你有一些

4

2 回答 2

3

我已经制定了一个在通话时监控音量的解决方案,所以这应该是相似的。

您可以在活动中监听按键(onKey)并检查相应的键码(VOLUME_UP 或 VOLUME_DOWN)。

或者,如果您由于某种原因(某些远程视图)无法监听关键事件,只需以足够快的频率轮询音量级别:

  1. 用于am.getStreamVolume(AudioManager.STREAM_MUSIC)轮询音量级别。

  2. 以您想要的频率运行它。例如:

        private Runnable mVolumeUpdateRunnable = new Runnable() {
        public void run() {
            if (shouldUpdate)
            {
                    updateCurrentVolume();
                    new Handler().postDelayed(mVolumeUpdateRunnable, VOLUME_SAMPLING_DELAY);
            }
        }
    };
    

这些调用并不昂贵,因此高频更新应该不是什么大问题。

于 2013-04-28T18:06:37.887 回答
0

高频轮询流卷增加 cpu 使用率,在我的情况下是 14%

于 2014-01-09T06:23:41.467 回答