Управление аудио-фокусом

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

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

Запрос аудио-фокуса

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

Вам нужно указать, какой поток вы используете и ожидаете временный или постоянный фокус. Запросите временный фокус, если собираетесь воспроизводить короткие звуки (например инструкции по навигации). Запросите постоянный фокус, если планируете без остановки воспроизводить звук в обозримом будущем (например, проигрывать музыку в плеере).

В следующем примере показано как запросить постоянный фокус для музыкального потока. Вы должны запросит фокус немедленно перед началом воспроизведения, например сразу после нажатия пользователем кнопки “воспроизвести” в плеере или при начале нового уровня в игре (для воспроизведения музыки на заднем фоне):

Сразу после окончания воспроизведения вызовите метод abandonAudioFocus() для отказа от фокуса. Это уведомит систему о том, что аудио-фокус вам больше не нужен и отменит регистрацию AudioManager.OnAudioFocusChangeListener. В случае отказа от временного фокуса, любое прерванное приложение может продолжить воспроизведение.

Для запроса временного фокуса есть дополнительный параметр: хотите ли вы использовать “ducking”. “Правильные” приложения обычно немедленно заглушают воспроизведение при потере фокуса. При запросе временного фокуса можно использовать ducking. Вы сообщаете приложению, что оно может продолжить воспроизведение немного убавив громкость, пока фокус находится у вас.

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

Всякий раз, когда другое приложение запрашивает фокус как описано выше, оно выбирает между постоянным и временным (с поддержкой ducking или нет) фокусом, которые вы указали при регистрации.

Обработка потери аудио-фокуса

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

Метод обратного вызова onAudioFocusChange() вызывается при изменении слушателя, которого вы зарегистрировали при запросе фокуса и принимает в качестве параметра тип события. Возможные события являются близнецами для типов фокуса, которые мы уже рассмотрели – постоянная потеря, временная потеря и временная потеря с разрешенным ducking.

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

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

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

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

Использование Duck.

Ducking это процесс уменьшения громкости постоянного аудио-потока (вместо полной остановки воспроизведения), чтобы сделать временный звук лучше слышимым для пользователя.

Следующий код уменьшает громкость нашего плеер при временной потере фокуса и возвращает нормальную громкость, как только фокус вернулся:

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

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