Android - обнаружение изменения громкости потока

в моем приложении у меня есть 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 изменится.

Вопрос: есть ли более надежный способ прослушивания изменений громкости в конкретном потоке громкости? Пожалуйста, поделитесь своим решением, если у вас есть


person Droidman    schedule 23.04.2013    source источник


Ответы (2)


Я уже сделал решение, которое отслеживает уровень громкости во время телефонного звонка, так что это должно быть похоже.

Вы можете прослушивать нажатия клавиш в своей деятельности (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);
            }
        }
    };
    

Звонки не дорогие, поэтому обновление с высокой частотой не должно быть большой проблемой.

person SirKnigget    schedule 28.04.2013

опрос потока потока на высокой частоте увеличивает загрузку процессора, в моем случае это было 14%

person Ravikant Tiwari    schedule 09.01.2014