Управление громкостью и воспроизведением

Хорошим можно считать пользовательский интерфейс, когда он предсказуем для пользователя. Если ваше приложение воспроизводит звук, важно дать пользователю возможность управлять его громкостью с помощью аппаратных или программных клавиш на их смартфоне, гарнитуре или наушниках.

То же самое относится к кнопках остановки, паузы, перемотки и старта воспроизведения. Их важно использовать там, где это уместно.

Выбираем тип аудио-потока.

Первым делом необходимо определиться с тем, какой тип аудио-потока будет использовать ваше приложение.

Android поддерживает разные типы аудио-потоков для проигрывания музыки, сигнализации, уведомлений, мелодии входящих звонков, системных звуков, звука при разговоре и DTMF сигналов. Это сделано для того, чтобы обеспечить пользователю возможность независимо контролировать громкость для каждого потока.

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

Использование аппаратных клавиш для управления громкостью

По умолчанию, клавиши управления громкостью влияют на громкость активного звукового потока. Если приложение в текущий момент не воспроизводит звук, эти клавиши будут управлять громкостью мелодии звонка.

Если это игра или аудиоплеер, пользователи ждут, что клавиши управляют громкостью музыки или звуков в игре.

Сейчас вы, возможно, подумали о том, чтобы отлавливать число нажатий на клавиши громкости и таким образом вычислять нужную громкость. Забудьте об этом! Android предоставляет метод setVolumeControlStream(), который напрямую управляет аудио-потоком при нажатии клавиш.

Решив, какой тип потока будет использовать ваше приложение, необходимо установить его в качестве подчиненного контролю громкости. Это нужно сделать однократно и как можно раньше в рамках жизненного цикла приложения. Обычно это делается в методе onCreate() явления или фрагмента, который управляет воспроизведением. Это гарантирует, что когда приложение станет видимо на экране, кнопки громкости будут обрабатывать его события.

После этого, нажатие кнопок громкости будет влиять на поток, который вы указали в качестве аргумента (в данном примере на поток STREAM_MUSIC), в те моменты, когда явление или фрагмент будут активными.

Использование аппаратных кнопок управления воспроизведением

Такие кнопки, как воспроизведение, стоп, перемотка и пауза доступны на некоторых смартфонах и на большинстве гарнитур. При нажатии таких кнопок, система рассылает широковещательное намерение с действием ACTION_MEDIA_BUTTON.

Для обработки нажатия таких кнопок, необходимо зарегистрировать широковещательный приемник – объект типа BroadcastReceiver в файле манифеста, как показано ниже:

Зарегистрированный приемник должен сам извлечь нажатую клавишу. Намерение включает ее в дополнительные данные EXTRA_KEY_EVENT. Класс KeyEvent содержит коды клавиш в виде статических констант KEYCODE_MEDIA_*, например KEYCODE_MEDIA_PLAY_PAUSE или KEYCODE_MEDIA_NEXT.

Следующий код показывает как получить нажатую клавишу и соответствующим образом повлиять на аудио-поток:

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

Следующий пример показывает как используя класс AudioManager включать и отключать обработку нажатия медиа-кнопок в вашем приложении. При включении, ваш широковещательный приемник является эксклюзивным получателем всех событий медиа-кнопок:

Обычно, приложения должны отключать обработку кнопок, если они становятся неактивными или невидимыми (например в методе onStop()). Однако, это не подходит для приложений-плееров, поскольку воспроизведение не может контролироваться с помощью экранных элементов, когда приложение скрыто.

Самым лучшим сигналом для включения и отключения обработки медиа-кнопок может служить получение и потеря аудио-фокуса. О нем мы поговорим в следующем уроке.

Добавить комментарий