Содержание
- Управление аудио-фокусом
- Запрос аудио-фокуса
- Обработка потери аудио-фокуса
- Полный список
- Аудиофокус — управление доступом к звуковой подсистеме
- Запрос аудиофокуса
- Обрабатываем изменения состояния аудиофокуса
Управление аудио-фокусом
Важно знать как должны взаимодействовать несколько приложений, который потенциально могут проигрывать звук. Android использует аудио-фокус, чтобы только одно приложений, захватившее фокус, могло воспроизводить звук в текущий момент времени.
Прежде чем начать воспроизведение, ваше приложение должно запросить и получить аудио-фокус. Кроме того, приложение должно следить за потерей фокуса и правильным образом обрабатывать такие ситуации.
Запрос аудио-фокуса
Итак, приложение должно захватить аудио-фокус нужного аудио-потока перед началом воспроизведения любых звуков. Это можно сделать с помощью метода requestAudioFocus(), который возвращает AUDIOFOCUS_REQUEST_GRANTED в случае успеха.
Вам нужно указать, какой поток вы используете и ожидаете временный или постоянный фокус. Запросите временный фокус, если собираетесь воспроизводить короткие звуки (например инструкции по навигации). Запросите постоянный фокус, если планируете без остановки воспроизводить звук в обозримом будущем (например, проигрывать музыку в плеере).
В следующем примере показано как запросить постоянный фокус для музыкального потока. Вы должны запросит фокус немедленно перед началом воспроизведения, например сразу после нажатия пользователем кнопки “воспроизвести” в плеере или при начале нового уровня в игре (для воспроизведения музыки на заднем фоне):
Сразу после окончания воспроизведения вызовите метод abandonAudioFocus() для отказа от фокуса. Это уведомит систему о том, что аудио-фокус вам больше не нужен и отменит регистрацию AudioManager.OnAudioFocusChangeListener. В случае отказа от временного фокуса, любое прерванное приложение может продолжить воспроизведение.
Для запроса временного фокуса есть дополнительный параметр: хотите ли вы использовать “ducking”. “Правильные” приложения обычно немедленно заглушают воспроизведение при потере фокуса. При запросе временного фокуса можно использовать ducking. Вы сообщаете приложению, что оно может продолжить воспроизведение немного убавив громкость, пока фокус находится у вас.
Ducking особенно подходит для приложений, которые прерывисто используют аудио-поток, например навигаторы, которые указывают направление движения.
Всякий раз, когда другое приложение запрашивает фокус как описано выше, оно выбирает между постоянным и временным (с поддержкой ducking или нет) фокусом, которые вы указали при регистрации.
Обработка потери аудио-фокуса
Если ваше приложение может запросить фокус, оно может его также потерять при запросе другого приложения. Как приложение будет обрабатывать потерю фокуса, зависит от того, как он был потерян.
Метод обратного вызова onAudioFocusChange() вызывается при изменении слушателя, которого вы зарегистрировали при запросе фокуса и принимает в качестве параметра тип события. Возможные события являются близнецами для типов фокуса, которые мы уже рассмотрели – постоянная потеря, временная потеря и временная потеря с разрешенным ducking.
Вообще говоря, временная потеря фокуса должна приглушить звук в вашем приложении, но оставить остальное состояние прежним. Вы должны продолжать отслеживать изменения фокуса и быть готовы возобновить воспроизведение, как только фокус вернулся.
Если потеря фокуса является постоянной, значит другое приложение сейчас используется для прослушивания аудио и ваше приложение должно эффективно себя завершить. Эффективно завершить, значит остановить воспроизведение, выключить обработчики нажатия на медиа-кнопки и отказаться от фокуса. Таким образом, чтобы возобновить воспроизведение в вашем приложении, пользователю будет необходимо явно указать вашему приложению это сделать.
В следующем примере показано, как приостановить воспроизведение при временной потере фокуса и заново его возобновить как только фокус вернулся. Если потеря является постоянной, отключить обработчики медиа-кнопок и остановить отслеживание фокуса:
Источник
Полный список
— используем Audio Focus
Наверняка вы замечали, что при прослушивании музыки, если срабатывает уведомление, то на время звучания уведомления звук музыки или прерывается или становится тише. Это можно реализовать с помощью аудио-фокуса.
Попробую сначала объяснить схему движения фокуса на словах. Если рассматривать пример музыки и уведомления, то пусть музыку играет некое приложение_1, а уведомления выдает некое приложение_2. Приложение_1, когда начинает воспроизведение, запрашивает аудио-фокус, получает его и играет музыку. Далее приходит смс или письмо, и приложение_2 хочет воспроизвести звук уведомления. Оно также запрашивает аудио-фокус и получает его. Но при этом система видит, что фокус сейчас у приложения_1. Система сообщает приложению_1, что фокус оно пока что потеряло. Звук уведомления воспроизводится, приложение_2 отдает фокус, а приложению_1 сообщают, что фокус снова его. Когда приложение_1 заканчивает играть музыку, оно отдает фокус. Т.е. приложение должно не только запрашивать фокус при необходимости, но и явно отдавать его, когда он более не нужен. Для этого есть специальные методы, мы их рассмотрим дальше.
Тут еще важно понимать, что эти сообщения от системы к приложениям о том, что фокус потерян/восстановлен являются просто уведомительными. И разработчик приложения сам решает, как он будет это обрабатывать: проигнорит, убавит звук или приостановит воспроизведение. Например, я протестировал два плеера на своем планшете. На одном включил музыку и свернул его, музыка продолжала играть в фоне. В другом плеере я запустил просмотр фильма. В результате я слышал и фильм и музыку. Аудио-фокус позволяет избежать этого.
Можно провести аналогию с человеком. Допустим, какой-то человек громко говорит. Его просят говорить потише, а еще лучше совсем заткнуться, т.к. он мешает остальным и вообще достал, и все хотят послушать другого человека. Вот это и есть потеря аудио-фокуса первым человеком. Но ведь это вовсе не означает, что этот человек тут же замолчит. Ему просто поступило уведомление, что другой человек хочет говорить. И первый человек поступает так, как считает нужным: либо продолжает громко говорить, либо будет говорить потише, либо замолчит. Это остается на его усмотрение, особенно если он наглый, сильный или быстро бегает )
Напишем приложение, в котором реализуем пример с музыкой и звуком. При нажатии на одну кнопку будем запускать проигрывание музыки, а при нажатии на другую – воспроизводить короткий звук. И привяжем к этой схеме аудио-фокус.
Project name: P1281_AudioFocus
Build Target: Android 2.3.3
Application name: AudioFocus
Package name: ru.startandroid.develop.p1281audiofocus
Create Activity: MainActivity
Добавим строки в strings.xml:
Кнопка Music будет запускать музыку, а три другие кнопки – звук. Их три, потому что есть три разных типа фокуса, которые может запросить приложение. Мы протестируем все три.
В папку mnt/sdcard/Music/ поместите какой-нить файл с именем music.mp3. Например, его можно взять здесь. В папку res/raw поместите файл explosion.mp3, например отсюда.
В onCreate мы просто получаем AudioManager. Именно через него мы будем запрашивать фокус.
onClickMusic срабатывает при нажатии кнопки Music. Здесь мы создаем MediaPlayer и даем ему путь к файлу с музыкой. Методом setOnCompletionListener устанавливаем Activity, как получателя уведомления о окончании воспроизведения. Далее идет работа с фокусом. afListenerMusic – это слушатель (реализующий интерфейс OnAudioFocusChangeListener), который будет получать сообщения о потере/восстановлении фокуса. Он является экземпляром класса AFListener, который мы рассмотрим чуть дальше.
Фокус запрашивается с помощью метода requestAudioFocus. На вход необходимо передать:
— слушателя, который будет получать сообщения о фокусе
— тип потока
— тип фокуса
Тип фокуса говорит о том, насколько долго приложение собирается воспроизводить свой звук и насколько важно, чтобы другое приложение при этом замолчало. Всего есть три типа фокуса:
AUDIOFOCUS_GAIN – приложение дает понять, что оно собирается долго воспроизводить свой звук, и текущее воспроизведение должно приостановиться на это время
AUDIOFOCUS_GAIN_TRANSIENT – воспроизведение будет коротким, и текущее воспроизведение должно приостановиться на это время
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK – воспроизведение будет коротким, но текущее воспроизведение может просто на это время убавить звук и продолжать играть
Итак, мы запрашиваем фокус и говорим, что это надолго — AUDIOFOCUS_GAIN. Метод requestAudioFocus возвращает статус:
AUDIOFOCUS_REQUEST_FAILED = 0 – фокус не получен
AUDIOFOCUS_REQUEST_GRANTED = 1 – фокус получен
После того, как получили фокус, стартуем воспроизведение.
Метод onClickSound срабатывает при нажатии на любую из трех кнопок Sound. Здесь мы определяем, какая из трех кнопок была нажата. Тем самым мы в переменную durationHint пишем тип аудио-фокуса, который будем запрашивать. Далее создаем MediaPlayer, который будет воспроизводить наш звук взрыва из папки raw. Присваиваем ему слушателя окончания воспроизведения. Запрашиваем фокус с типом, который определили выше. Стартуем воспроизведение.
Метод onCompletion, срабатывает по окончании воспроизведения. Мы определяем, какой именно MediaPlayer закончил играть и методом abandonAudioFocus сообщаем системе, что больше не претендуем на аудио-фокус. На вход методу передаем того же слушателя, который давали при запросе фокуса.
В onDestroy освобождаем ресурсы и отпускаем фокус.
Класс AFListener реализует интерфейс OnAudioFocusChangeListener и является получателем сообщений о потере/восстановлении фокуса. При создании мы даем ему соответствующий MediaPlayer (позже станет понятно зачем) и текст, который нам понадобится для логов.
Метод onAudioFocusChange получает на вход статус фокуса этого приложения. Тут 4 варианта:
AUDIOFOCUS_LOSS – фокус потерян в результате того, что другое приложение запросило фокус AUDIOFOCUS_GAIN. Т.е. нам дают понять, что другое приложение собирается воспроизводить что-то долгое и просит нас пока приостановить наше воспроизведение.
AUDIOFOCUS_LOSS_TRANSIENT — фокус потерян в результате того, что другое приложение запросило фокус AUDIOFOCUS_GAIN_TRANSIENT. Нам дают понять, что другое приложение собирается воспроизводить что-то небольшое и просит нас пока приостановить наше воспроизведение
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — фокус потерян в результате того, что другое приложение запросило фокус AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK. Нам дают понять, что другое приложение собирается воспроизводить что-то небольшое, и мы можем просто убавить звук, не приостанавливая воспроизведение
AUDIOFOCUS_GAIN – другое приложение закончило воспроизведение, звук снова наш
Пока что мы просто будем выводить в лог всю эту информацию, чтобы увидеть схему взаимодействия двух приложений с аудио-фокусом.
Все сохраним и запустим приложение. Жмем Music, воспроизведение музыки началось. В логах видим.
Т.е. музыка запросила фокус и получила его (статус = 1).
Жмем Sound G, чтобы воспроизвести звук взрыва и запросить фокус AUDIOFOCUS_GAIN.
Sound request focus, result: 1
Music onAudioFocusChange: AUDIOFOCUS_LOSS
Фокус запрошен и получен взрывом. А музыка получила уведомление о том, что фокус она потеряла (AUDIOFOCUS_LOSS).
Слышим звук взрыва. После того как звук взрыва закончился:
Sound: abandon focus
Music onAudioFocusChange: AUDIOFOCUS_GAIN
Срабатывает метод onCompletion, в котором взрыв отдает фокус (abandon focus). И, следовательно, музыка получает сообщение о том, что фокус снова ее (AUDIOFOCUS_GAIN).
Если дождаться, когда закончится музыка увидим такое сообщение.
Music: abandon focus
Музыка отдала фокус.
Как вы заметили, музыка все это время играла и никуда не делась. То, что она теряла фокус – не означает автоматически, что она остановится. Повторюсь, фокус – это только уведомление. А как приложение отреагирует на это уведомление – решать вам, как разработчику.
Кнопки Sound GT и Sound GTD срабатывают аналогично, я уже не буду их нажимать. Отличие будет в том, что взрыв будет запрашивать фокусы соответственно AUDIOFOCUS_GAIN_TRANSIENT и AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK. А музыка будет получать статусы AUDIOFOCUS_LOSS_TRANSIENT и AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK.
Т.е. мы увидели как одно приложение запрашивает определенный тип фокуса, а другое приложение видит этот тип и должно принимать соответствующие меры. Кстати о мерах. Давайте кроме логов реализуем и эти меры.
Перепишем метод onAudioFocusChange класса AFListener:
При потерях фокуса AUDIOFOCUS_LOSS и AUDIOFOCUS_LOSS_TRANSIENT ставим паузу. А при AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK – просто уменьшаем громкость. При получении же фокуса (AUDIOFOCUS_GAIN) возобновляем воспроизведение, если оно было приостановлено, и ставим громкость на максимум.
Я выбрал самые простые меры, чтобы не усложнять урок. Но их можно улучшить. Например, при потере фокуса надолго (AUDIOFOCUS_LOSS) можно освобождать ресурсы, и снова создавать MediaPlayer при получении фокуса. Либо можно вообще полностью отдать фокус (abandon), и тогда пользователю надо будет явно вернуться в ваше приложение, чтобы возобновить воспроизведение.
Когда вы запрашиваете фокус, метод requestFocus возвращает вам ответ, получилось захватить фокус или нет. Хелп рекомендует учитывать этот параметр и стартовать воспроизведение только при положительном результате (AUDIOFOCUS_REQUEST_GRANTED). Я, правда, не знаю как тут можно получить отрицательный результат. Если у кого есть соображения на этот счет – пишите на форуме.
На следующем уроке:
— пишем звук с помощью MediaRecorder
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Аудиофокус — управление доступом к звуковой подсистеме
Это перевод статьи Respecting Audio Focus Kristan Uccello, Google Developer Relations
Считается грубым перебивать во время доклада, это показывает неуважение к докладчику и раздражает аудиторию. Если ваше приложение не учитывает правила работы с аудиофокусом, значит, оно не уважает остальные приложения и раздражает пользователя. Если Вы никогда не слышали об аудиофокусе, стоит обратить внимание на документацию Android developer training material.
Когда несколько приложений могут воспроизводить аудио важно думать о том, как они будут взаимодействовать. Чтобы избежать ситуации когда все плееры играют одновременно Андроид использует понятие аудиофокуса для контроля воспроизведения звуков: ваше приложение должно воспроизводить аудио только тогда, когда оно получило аудиофокус. В этой статье описаны несколько советов о том, как правильно и наилучшим для пользователя образом обрабатывать изменения состояния аудиофокуса.
Запрос аудиофокуса
Не надо быть жадным и запрашивать аудиофокус прямо в момент старта приложения; лучше подождать, пока приложение не начнет что-то делать с аудиопотоком. При получении аудиофокуса через сервис AudioManager, можно воспользоваться константами AUDIOFOCUS_GAIN* для обозначения необходимого режима фокуса.
В примере мы запрашиваем постоянный аудиофокус. Вместо этого, мы могли бы запросить временный (AUDIOFOCUS_GAIN_TRANSIENT) фокус, который подходит для воспроизведения звуков длительностью до 45 секунд.
Еще приложение может использовать режим “крякания” (AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) для ситуаций, когда допустимо совместное использование аудиоподсистемы вместе с другими приложениями (например, для фразы “жги еще” в фитнес-приложении, ожидая, что фоновая музыка не будет прерываться). Приложение, запрашивающее фокус в режиме “крякания”, не должно использовать аудиоподсистему дольше 15 секунд подряд.
Обрабатываем изменения состояния аудиофокуса
Для обработки событий изменения состояния аудиофокуса приложение должно создать экземпляр OnAudioFocusChangeListener. В этом обработчике необходимо обработать события AUDIOFOCUS_GAIN* и AUDIOFOCUS_LOSS*. Стоит заметить, что событие AUDIOFOCUS_GAIN имеет несколько особенностей, описанных во втором примере.
Константа AUDIOFOCUS_GAIN используется в коде в двух различных ролях. Во-первых, для получения аудиофокуса как в примере 1. При этом не происходит событие обработчика OnAudioFocusChangeListener, то есть при успешном запросе (и получении) аудиофокуса обработчик НЕ получит соответствующее событие AUDIOFOCUS_GAIN.
AUDIOFOCUS_GAIN также используется в реализации OnAudioFocusChangeListener как вариант события. Как указано ранее, событие AUDIOFOCUS_GAIN не возбуждается при запросе аудиофокуса. Напротив, оно может произойти только после возникновения соответствующего события AUDIOFOCUS_LOSS*. AUDIOFOCUS_GAIN — единственная константа, которая используется в обеих ситуациях.
Существуют четыре ситуации, которые необходимо учитывать в обработчике события изменения состояния аудиофокуса. Когда приложение получает событие AUDIOFOCUS_LOSS, это обычно означает, что обратно аудиофокус оно не получит. В этом случае приложение должно освободить ресурсы, связанные с аудиоподсистемой, и остановить воспроизведение. В качестве примера, представьте, что пользователь слушает музыку через ваше приложение, а затем запускает игру, которая забирает аудиофокус у аудиоплеера. Невозможно предсказать, через сколько времени пользователь закроет игру. Скорее всего, он перейдет на главный экран (оставив игру в фоне) и запустит еще одно приложение. Или он вернется в аудиоплеер, возобновив его работу, что потребует нового запроса аудиофокуса в onResume.
Однако есть другой случай, достойный обсуждения. Существует разница между потерей аудиофокуса навсегда (как в примере выше) или временно. Когда приложение получает событие AUDIOFOCUS_LOSS_TRANSIENT, ожидается, что приложение приостановит использование аудио до тех пор, пока оно не получит событие AUDIOFOCUS_GAIN. Когда возникает событие AUDIOFOCUS_LOSS_TRANSIENT приложение должно запомнить, что потеря фокуса временная, для того, чтобы при возврате фокуса разобраться, какое поведение корректно. (см. пример 2).
Иногда приложение теряет аудиофокус (т.е. получает AUDIOFOCUS_LOSS), а прервавшее приложение завершается, или каким-то другим образом теряет аудиофокус. В этой ситуации последнее приложение, которое имело аудиофокус, может получить событие AUDIOFOCUS_GAIN.
В последующем событии AUDIOFOCUS_GAIN приложение должно понять, получило ли оно аудиофокус после временной потери и должно просто возобновить проигрывание, либо восстановиться и настроить воспроизведение после полной потери фокуса.
Если приложение использует аудио только на короткое время (не более 45 секунд), оно должно запрашивать аудиофокус в режиме AUDIOFOCUS_GAIN_TRANSIENT и отпускать его сразу после завершения воспроизведения или записи звука. Аудиофокус в системе обрабатывается как стек: фокус получает то приложение, которое владело им последним.
Когда аудиофокус получен, самое время создать MediaPlayer или MediaRecorder и зарезервировать ресурсы. Также когда приложение получает AUDIOFOCUS_LOSS, хорошей практикой является освобождение всех зарезервированных ресурсов. Существует три варианта получения аудиофокуса, соответствующие разным вариантам потери фокуса. Неплохо бы явно обрабатывать все варианты потери фокуса в обработчике OnAudioFocusChangeListener.
Источник
- Печать
Страницы: [1] Вниз
Тема: Не срабатывает аудиофокус (Прочитано 4532 раз)
0 Пользователей и 1 Гость просматривают эту тему.
Раньше вроде все было нормально, теперь Android 11, последняя версия Aimp? мобила Xiaomi redmi note 9 pro
Ставлю галочки в параметрах: Звук – аудиофокус – Требовать аудиофокус для проигрывания и понижать громкость. При звуках Вацапа, либо иной другой аппаратной мелодии, звук аимпа не понижается. Может что то еще упустил??
« Последнее редактирование: Апреля 11, 2022, 10:21:56 от Artem »
Записан
Раньше вроде все было нормально, теперь Android 11, последняя версия Aimp? мобила Xiaomi redmi note 9 pro
Ставлю галочки в параметрах: Звук – аудиофокус – Требовать аудиофокус для проигрывания и понижать громкость. При звуках Вацапа, либо иной другой аппаратной мелодии, звук аимпа не понижается. Может что то еще упустил??
Какие именно галочки вы поставили? Помимо плеера, аудиофокус должен поддерживаться и в Вотсапе.
Записан
Записан
Частично разобрался. Оказывается в системных настройках стояла галка “Несколько источников звука” ( настройки-звук и вибрация – звуковой помошник..)Убрал эту галку. Теперь звук плейера полностью останавливается ( а не приглушается), при звуках сторонних программ. И то, хоть так.
Записан
Частично разобрался. Оказывается в системных настройках стояла галка “Несколько источников звука” ( настройки-звук и вибрация – звуковой помошник..)Убрал эту галку. Теперь звук плейера полностью останавливается ( а не приглушается), при звуках сторонних программ. И то, хоть так.
А в аимп при этом как настройки стоят?
Записан
А в аимп при этом как настройки стоят?
Звук – аудиофокус – галки стоят на “Требовать аудиофокус для проигрывания” “Понижать громкость” и “Останавливать воспроизведение” при длительнойсмене аудиофокуса.
Записан
Звук – аудиофокус – галки стоят на “Требовать аудиофокус для проигрывания” “Понижать громкость” и “Останавливать воспроизведение” при длительнойсмене аудиофокуса.
а при коротком?
Записан
При коротком поставил только “понижать громкость”. Все нормально стало, вопрос закрыт.
« Последнее редактирование: Апреля 11, 2022, 08:36:24 от lukas70 »
Записан
- Печать
Страницы: [1] Вверх
Аудио фокус – когда отмечено, приложение просит Андроид приглушить громкость остальных звуков, воспроизводимых телефоном (музыка, подкасты), на время озвучивания голосового предупреждения. Тревожные звуки и бипер аудио фокус не запрашивают и микшируются с остальными звуками.
Усиление слышимости – имеет три значения: выключить, включить, авто.
Когда установлено выключить, вывод звука по выбранному Аудио канал по умолчанию полностью контролируется Андроид. Например, аудио канал мультимедиа (выбран по умолчанию), телефон подключен к магнитоле по Bluetooth с поддержкой A2DP – весь звук от приложения идет по A2DP. Если подключения нет, звук идет на динамик телефона. Громкость регулируется кнопками телефона.
Когда установлено включить, приложение всегда дублирует звук на динамик телефона. Громкость звуков приложения в динамике телефона регулируется в настройках Громкость, устанавливается относительно максимально возможной громкости.
Если установлено Авто, поведение приложения определяется тем, есть ли Bluetooth соединение и играет ли телефон музыку. Если соединения нет или телефон играет музыку, приложение ведет себя как если установлено значение Выключить, т.е. полностью управляется Андроидом. Если соединение есть и телефон не играет музыку, приложение ведет себя как если установлено значение Включить, т.е. звук дублируется на динамик. Обычно это соответствует случаю, когда магнитола играет FM/CD/MP3. В этом случае посылать звук по A2DP нельзя, т.к. он будет потерян и его необходимо дублировать на динамик. Отстлеживание соединения и факта проигрывания музыки – автоматическое и не требует участия пользователя.
Аудио канал по умолчанию – выбор аудиоканала: будильник, уведомление и рингтон, мультимедиа, голосовая связь. Усиление слышимости в режиме Авто делает эту опцию ненужной, она присутствует только для полноты настроек.
Громкость – эта настройка позволяет настроить относительную громкость индивидуально для каждого типа аудио: голос, тревожный звук, бипер.
Синтез речи – настройка параметров голоса: женский или мужской, тембр, темп, задержка в мс для Bluetooth.
Бипер – настройка параметров бипера: частота бипов в Гц, интервал в сек.
Чтобы все музыкальные приложения не воспроизводились одновременно, в Android реализована идея фокусировки на звуке. Только одно приложение может одновременно удерживать звуковой фокус. Когда вашему приложению требуется вывод звука, оно должно запрашивать фокусировку звука. Когда он находится в фокусе, он может воспроизводить звук.
Что означает аудио фокус отклонен?
Когда ваше приложение запрашивает постоянный звуковой фокус, ему будет отказано в предоставлении фокуса, поскольку оно заблокировано.. Приложение для телефона уже приобрело временный фокус со звуком. … Однако, если ваше приложение является игрой, оно может продолжать работать без звука. Когда телефонный звонок завершится, вашему приложению будет предоставлено усиление фокуса звука.
Что такое прослушиватель приложения focus?
CarAppFocusManager позволяет приложения для установки и прослушивания текущего фокус приложения, такой как активная навигация или активная голосовая команда. Обычно в системе должен работать только один экземпляр такого приложения, а другое приложение, устанавливающее флаг для соответствующего приложения, должно приводить к остановке другого приложения.
Как использовать AudioManager на Android?
AudioManager в Android с примером
- AudioManager — это класс, предоставляемый Android, который можно использовать для управления громкостью звонка на вашем устройстве Android. …
- Шаг 1. Создайте новый проект. …
- Шаг 2. Добавьте разрешения в файл AndroidManifest.xml. …
- Шаг 3. Измените файл strings.xml. …
- Шаг 4: Работа с файлом activity_main.xml.
Как мне выпустить AudioManager на Android?
Ниже приведен синтаксис использования класса AudioManager для настройки громкости или режимов звонка (беззвучный, звонок, вибрация и т. Д.) Нашего устройства в приложениях для Android. AudioManager aManager = (AudioManager) getSystemService (Context. АУДИО_СЕРВИС); менеджер.
Как вы используете аудиофокус?
Чтобы освободить аудиофокус, вызвать метод AbandonAudioFocusRequest () который также принимает в качестве аргумента AudioFocusRequest. Один и тот же экземпляр AudioFocusRequest следует использовать при запросе и отказе от фокуса. Чтобы создать AudioFocusRequest, используйте AudioFocusRequest.
Как включить фокусировку звука?
Chrome: новая функция фокусировки звука
- Он гласит: «Управляйте фокусом звука на вкладках, чтобы улучшить микширование звука».
- Щелкните меню под ним и выберите «Включить» или «Включить (Flash снижает громкость, когда его прерывает другой звук, экспериментально».
- Перезапустите браузер.
Как работает фокусирующий слушатель?
Слушатель фокуса, зарегистрированный на каждый компонент, сообщает о каждом событии, связанном с получением и потерей фокуса. Для каждого события сообщается другой компонент, участвующий в изменении фокуса, противоположный компонент. … Например, событие временной потери фокуса происходит, когда окно теряет фокус.
Что такое Audio Manager в Android?
Аудио менеджер в android есть класс, обеспечивающий доступ к громкости и режимам устройства. Менеджер звука Android помогает нам регулировать громкость и режимы звонка устройств в соответствии с нашими требованиями. Хорошо известные нам режимы: Звонок, Вибрация, Громко, Без звука и т. Д.
Шаги по воспроизведению звука в двух приложениях одновременно
- Загрузите и установите приложение SoundAssistant и откройте его. …
- Теперь внутри приложения прокрутите немного вниз в главном меню, чтобы найти «MultiSound», и коснитесь текста вместо переключателя рядом с ним.
- Здесь вы увидите несколько вариантов:…
- Выберите свои приложения, и все готово.
Как управлять громкостью на Android?
Как настроить звук на вашем Android-устройстве
- Откройте приложение «Настройки».
- Выберите «Звук» или «Звук и уведомление». …
- С помощью ползунков установите громкость для различных источников шума. …
- Сдвиньте штуковину влево, чтобы звук стал тише; сдвиньте вправо, чтобы звук стал громче.
В какой стране создано приложение Audio Manager?
Audio Manager разработан В Индии технологическая компания MizzOraninly, разработчик Android из Гуджарата. Audio Manager очень популярен среди мобильных пользователей, поскольку это безопасное и надежное приложение-хранилище, доступное на мобильном телефоне, чтобы пользователь мог скрывать и отображать свои аудио- и видеофайлы, доступные в галерее.
Аудио фокус — когда отмечено, приложение просит Андроид приглушить громкость остальных звуков, воспроизводимых телефоном (музыка, подкасты), на время озвучивания голосового предупреждения. Тревожные звуки и бипер аудио фокус не запрашивают и микшируются с остальными звуками.
Усиление слышимости — имеет три значения: выключить, включить, авто.
Когда установлено выключить, вывод звука по выбранному Аудио канал по умолчанию полностью контролируется Андроид. Например, аудио канал мультимедиа (выбран по умолчанию), телефон подключен к магнитоле по Bluetooth с поддержкой A2DP — весь звук от приложения идет по A2DP. Если подключения нет, звук идет на динамик телефона. Громкость регулируется кнопками телефона.
Когда установлено включить, приложение всегда дублирует звук на динамик телефона. Громкость звуков приложения в динамике телефона регулируется в настройках Громкость, устанавливается относительно максимально возможной громкости.
Если установлено Авто, поведение приложения определяется тем, есть ли Bluetooth соединение и играет ли телефон музыку. Если соединения нет или телефон играет музыку, приложение ведет себя как если установлено значение Выключить, т.е. полностью управляется Андроидом. Если соединение есть и телефон не играет музыку, приложение ведет себя как если установлено значение Включить, т.е. звук дублируется на динамик. Обычно это соответствует случаю, когда магнитола играет FM/CD/MP3. В этом случае посылать звук по A2DP нельзя, т.к. он будет потерян и его необходимо дублировать на динамик. Отстлеживание соединения и факта проигрывания музыки — автоматическое и не требует участия пользователя.
Аудио канал по умолчанию — выбор аудиоканала: будильник, уведомление и рингтон, мультимедиа, голосовая связь. Усиление слышимости в режиме Авто делает эту опцию ненужной, она присутствует только для полноты настроек.
Громкость — эта настройка позволяет настроить относительную громкость индивидуально для каждого типа аудио: голос, тревожный звук, бипер.
Синтез речи — настройка параметров голоса: женский или мужской, тембр, темп, задержка в мс для Bluetooth.
Бипер — настройка параметров бипера: частота бипов в Гц, интервал в сек.
- Печать
Страницы: [1] Вниз
Тема: Не срабатывает аудиофокус (Прочитано 4255 раз)
0 Пользователей и 1 Гость просматривают эту тему.
Раньше вроде все было нормально, теперь Android 11, последняя версия Aimp? мобила Xiaomi redmi note 9 pro
Ставлю галочки в параметрах: Звук — аудиофокус — Требовать аудиофокус для проигрывания и понижать громкость. При звуках Вацапа, либо иной другой аппаратной мелодии, звук аимпа не понижается. Может что то еще упустил??
« Последнее редактирование: Апреля 11, 2022, 10:21:56 от Artem »
Записан
Раньше вроде все было нормально, теперь Android 11, последняя версия Aimp? мобила Xiaomi redmi note 9 pro
Ставлю галочки в параметрах: Звук — аудиофокус — Требовать аудиофокус для проигрывания и понижать громкость. При звуках Вацапа, либо иной другой аппаратной мелодии, звук аимпа не понижается. Может что то еще упустил??
Какие именно галочки вы поставили? Помимо плеера, аудиофокус должен поддерживаться и в Вотсапе.
Записан
Записан
Частично разобрался. Оказывается в системных настройках стояла галка «Несколько источников звука» ( настройки-звук и вибрация — звуковой помошник..)Убрал эту галку. Теперь звук плейера полностью останавливается ( а не приглушается), при звуках сторонних программ. И то, хоть так.
Записан
Частично разобрался. Оказывается в системных настройках стояла галка «Несколько источников звука» ( настройки-звук и вибрация — звуковой помошник..)Убрал эту галку. Теперь звук плейера полностью останавливается ( а не приглушается), при звуках сторонних программ. И то, хоть так.
А в аимп при этом как настройки стоят?
Записан
А в аимп при этом как настройки стоят?
Звук — аудиофокус — галки стоят на «Требовать аудиофокус для проигрывания» «Понижать громкость» и «Останавливать воспроизведение» при длительнойсмене аудиофокуса.
Записан
Звук — аудиофокус — галки стоят на «Требовать аудиофокус для проигрывания» «Понижать громкость» и «Останавливать воспроизведение» при длительнойсмене аудиофокуса.
а при коротком?
Записан
При коротком поставил только «понижать громкость». Все нормально стало, вопрос закрыт.
« Последнее редактирование: Апреля 11, 2022, 08:36:24 от lukas70 »
Записан
- Печать
Страницы: [1] Вверх
import
androidx.annotation.RequiresApi;
import
androidx.appcompat.app.AppCompatActivity;
import
android.content.Context;
import
android.media.AudioAttributes;
import
android.media.AudioFocusRequest;
import
android.media.AudioManager;
import
android.media.MediaPlayer;
import
android.os.Build;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.Button;
import
java.io.IOException;
@RequiresApi
(api = Build.VERSION_CODES.O)
public
class
MainActivity
extends
AppCompatActivity {
MediaPlayer mediaPlayer;
AudioManager audioManager;
AudioAttributes playbackAttributes;
AudioManager.OnAudioFocusChangeListener audioFocusChangeListener =
new
AudioManager.OnAudioFocusChangeListener() {
@Override
public
void
onAudioFocusChange(
int
focusChange) {
if
(focusChange == AudioManager.AUDIOFOCUS_GAIN) {
mediaPlayer.start();
}
else
if
(focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
mediaPlayer.pause();
mediaPlayer.seekTo(
0
);
}
else
if
(focusChange == AudioManager.AUDIOFOCUS_LOSS) {
mediaPlayer.release();
}
}
};
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
playbackAttributes =
new
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
AudioFocusRequest focusRequest =
new
AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(playbackAttributes)
.setAcceptsDelayedFocusGain(
true
)
.setOnAudioFocusChangeListener(audioFocusChangeListener)
.build();
final
int
audioFocusRequest = audioManager.requestAudioFocus(focusRequest);
Button bPlay = findViewById(R.id.playButton);
Button bPause = findViewById(R.id.pasueButton);
Button bStop = findViewById(R.id.stopButton);
mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music);
bPlay.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
if
(audioFocusRequest == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
mediaPlayer.start();
}
}
});
bPause.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
mediaPlayer.pause();
}
});
bStop.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
mediaPlayer.stop();
try
{
mediaPlayer.prepare();
}
catch
(IOException e) {
e.printStackTrace();
}
}
});
}
}
import
androidx.annotation.RequiresApi;
import
androidx.appcompat.app.AppCompatActivity;
import
android.content.Context;
import
android.media.AudioAttributes;
import
android.media.AudioFocusRequest;
import
android.media.AudioManager;
import
android.media.MediaPlayer;
import
android.os.Build;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.Button;
import
java.io.IOException;
@RequiresApi
(api = Build.VERSION_CODES.O)
public
class
MainActivity
extends
AppCompatActivity {
MediaPlayer mediaPlayer;
AudioManager audioManager;
AudioAttributes playbackAttributes;
AudioManager.OnAudioFocusChangeListener audioFocusChangeListener =
new
AudioManager.OnAudioFocusChangeListener() {
@Override
public
void
onAudioFocusChange(
int
focusChange) {
if
(focusChange == AudioManager.AUDIOFOCUS_GAIN) {
mediaPlayer.start();
}
else
if
(focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
mediaPlayer.pause();
mediaPlayer.seekTo(
0
);
}
else
if
(focusChange == AudioManager.AUDIOFOCUS_LOSS) {
mediaPlayer.release();
}
}
};
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
playbackAttributes =
new
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
AudioFocusRequest focusRequest =
new
AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(playbackAttributes)
.setAcceptsDelayedFocusGain(
true
)
.setOnAudioFocusChangeListener(audioFocusChangeListener)
.build();
final
int
audioFocusRequest = audioManager.requestAudioFocus(focusRequest);
Button bPlay = findViewById(R.id.playButton);
Button bPause = findViewById(R.id.pasueButton);
Button bStop = findViewById(R.id.stopButton);
mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music);
bPlay.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
if
(audioFocusRequest == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
mediaPlayer.start();
}
}
});
bPause.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
mediaPlayer.pause();
}
});
bStop.setOnClickListener(
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
mediaPlayer.stop();
try
{
mediaPlayer.prepare();
}
catch
(IOException e) {
e.printStackTrace();
}
}
});
}
}
Аудиофокус — управление доступом к звуковой подсистеме
Время на прочтение
7 мин
Количество просмотров 18K
Это перевод статьи Respecting Audio Focus Kristan Uccello, Google Developer Relations
Считается грубым перебивать во время доклада, это показывает неуважение к докладчику и раздражает аудиторию. Если ваше приложение не учитывает правила работы с аудиофокусом, значит, оно не уважает остальные приложения и раздражает пользователя. Если Вы никогда не слышали об аудиофокусе, стоит обратить внимание на документацию Android developer training material.
Когда несколько приложений могут воспроизводить аудио важно думать о том, как они будут взаимодействовать. Чтобы избежать ситуации когда все плееры играют одновременно Андроид использует понятие аудиофокуса для контроля воспроизведения звуков: ваше приложение должно воспроизводить аудио только тогда, когда оно получило аудиофокус. В этой статье описаны несколько советов о том, как правильно и наилучшим для пользователя образом обрабатывать изменения состояния аудиофокуса.
Запрос аудиофокуса
Не надо быть жадным и запрашивать аудиофокус прямо в момент старта приложения; лучше подождать, пока приложение не начнет что-то делать с аудиопотоком. При получении аудиофокуса через сервис AudioManager, можно воспользоваться константами AUDIOFOCUS_GAIN* для обозначения необходимого режима фокуса.
Пример запроса фокуса
AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
int result = am.requestAudioFocus(mOnAudioFocusChangeListener,
// Hint: the music stream.
AudioManager.STREAM_MUSIC,
// Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
mState.audioFocusGranted = true;
} else if (result == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
mState.audioFocusGranted = false;
}
В примере мы запрашиваем постоянный аудиофокус. Вместо этого, мы могли бы запросить временный (AUDIOFOCUS_GAIN_TRANSIENT) фокус, который подходит для воспроизведения звуков длительностью до 45 секунд.
Еще приложение может использовать режим “крякания” (AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) для ситуаций, когда допустимо совместное использование аудиоподсистемы вместе с другими приложениями (например, для фразы “жги еще” в фитнес-приложении, ожидая, что фоновая музыка не будет прерываться). Приложение, запрашивающее фокус в режиме “крякания”, не должно использовать аудиоподсистему дольше 15 секунд подряд.
Обрабатываем изменения состояния аудиофокуса
Для обработки событий изменения состояния аудиофокуса приложение должно создать экземпляр OnAudioFocusChangeListener. В этом обработчике необходимо обработать события
AUDIOFOCUS_GAIN*
и AUDIOFOCUS_LOSS*. Стоит заметить, что событие AUDIOFOCUS_GAIN имеет несколько особенностей, описанных во втором примере.
Пример обработки событий
mOnAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
mState.audioFocusGranted = true;
if(mState.released) {
initializeMediaPlayer();
}
switch(mState.lastKnownAudioFocusState) {
case UNKNOWN:
if(mState.state == PlayState.PLAY && !mPlayer.isPlaying()) {
mPlayer.start();
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
if(mState.wasPlayingWhenTransientLoss) {
mPlayer.start();
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
restoreVolume();
break;
}
break;
case AudioManager.AUDIOFOCUS_LOSS:
mState.userInitiatedState = false;
mState.audioFocusGranted = false;
teardown();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
mState.userInitiatedState = false;
mState.audioFocusGranted = false;
mState.wasPlayingWhenTransientLoss = mPlayer.isPlaying();
mPlayer.pause();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
mState.userInitiatedState = false;
mState.audioFocusGranted = false;
lowerVolume();
break;
}
mState.lastKnownAudioFocusState = focusChange;
}
};
Константа AUDIOFOCUS_GAIN используется в коде в двух различных ролях. Во-первых, для получения аудиофокуса как в примере 1. При этом не происходит событие обработчика OnAudioFocusChangeListener, то есть при успешном запросе (и получении) аудиофокуса обработчик НЕ получит соответствующее событие AUDIOFOCUS_GAIN.
AUDIOFOCUS_GAIN также используется в реализации OnAudioFocusChangeListener как вариант события. Как указано ранее, событие AUDIOFOCUS_GAIN не возбуждается при запросе аудиофокуса. Напротив, оно может произойти только после возникновения соответствующего события AUDIOFOCUS_LOSS*. AUDIOFOCUS_GAIN — единственная константа, которая используется в обеих ситуациях.
Существуют четыре ситуации, которые необходимо учитывать в обработчике события изменения состояния аудиофокуса. Когда приложение получает событие AUDIOFOCUS_LOSS, это обычно означает, что обратно аудиофокус оно не получит. В этом случае приложение должно освободить ресурсы, связанные с аудиоподсистемой, и остановить воспроизведение. В качестве примера, представьте, что пользователь слушает музыку через ваше приложение, а затем запускает игру, которая забирает аудиофокус у аудиоплеера. Невозможно предсказать, через сколько времени пользователь закроет игру. Скорее всего, он перейдет на главный экран (оставив игру в фоне) и запустит еще одно приложение. Или он вернется в аудиоплеер, возобновив его работу, что потребует нового запроса аудиофокуса в onResume.
Однако есть другой случай, достойный обсуждения. Существует разница между потерей аудиофокуса навсегда (как в примере выше) или временно. Когда приложение получает событие AUDIOFOCUS_LOSS_TRANSIENT, ожидается, что приложение приостановит использование аудио до тех пор, пока оно не получит событие AUDIOFOCUS_GAIN. Когда возникает событие AUDIOFOCUS_LOSS_TRANSIENT приложение должно запомнить, что потеря фокуса временная, для того, чтобы при возврате фокуса разобраться, какое поведение корректно. (см. пример 2).
Иногда приложение теряет аудиофокус (т.е. получает AUDIOFOCUS_LOSS), а прервавшее приложение завершается, или каким-то другим образом теряет аудиофокус. В этой ситуации последнее приложение, которое имело аудиофокус, может получить событие AUDIOFOCUS_GAIN.
В последующем событии AUDIOFOCUS_GAIN приложение должно понять, получило ли оно аудиофокус после временной потери и должно просто возобновить проигрывание, либо восстановиться и настроить воспроизведение после полной потери фокуса.
Если приложение использует аудио только на короткое время (не более 45 секунд), оно должно запрашивать аудиофокус в режиме AUDIOFOCUS_GAIN_TRANSIENT и отпускать его сразу после завершения воспроизведения или записи звука. Аудиофокус в системе обрабатывается как стек: фокус получает то приложение, которое владело им последним.
Когда аудиофокус получен, самое время создать MediaPlayer или MediaRecorder и зарезервировать ресурсы. Также когда приложение получает AUDIOFOCUS_LOSS, хорошей практикой является освобождение всех зарезервированных ресурсов. Существует три варианта получения аудиофокуса, соответствующие разным вариантам потери фокуса. Неплохо бы явно обрабатывать все варианты потери фокуса в обработчике OnAudioFocusChangeListener.
Таблица 1. Смысл констант получения и потери аудиофокуса
GAIN | LOSS |
AUDIOFOCUS_GAIN | AUDIOFOCUS_LOSS |
AUDIOFOCUS_GAIN_TRANSIENT (*) | AUDIOFOCUS_LOSS_TRANSIENT |
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (*) | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK |
Замечание: константа используется в двух местах. Когда запрашивается аудиофокус, она передается как подсказка AudioManager; она же используется как вариант события в OnAudioFocusChangeListener. Константы получения фокуса, обозначенные (*), используются только при запросе аудиофокуса. Константы потери фокуса используются только в обработчике OnAudioFocusChangeListener.
Таблица 2. Типы аудиопотоков.
Тип | Описание |
STREAM_ALARM | Будильник |
STREAM_DTMF | Тоновый набор |
STREAM_MUSIC | Воспроизведение мультимедиа (музыка, подкасты, видео) |
STREAM_NOTIFICATION | Уведомления |
STREAM_RING | Телефонный звонок |
STREAM_SYSTEM | Системные звуки |
Приложение запрашивает аудиофокус у AudioManager (как в примере по ссылке в конце статьи). Параметрами являются необязательный обработчик, подсказка с типом аудиоканала (таблица 2) и тип аудиофокуса из таблицы 1. Любая инициализация аудио должна производиться, только если система разрешила получение аудиофокуса (AudioManager.AUDIOFOCUS_REQUEST_GRANTED).
Замечание: Если происходит телефонный разговор, система не разрешит получение аудиофокуса (AUDIOFOCUS_REQUEST_FAILED) и не отправит приложению событие AUDIOFOCUS_GAIN после завершения звонка.
Краткое описание реакции приложения на события OnAudioFocusChange() описано в таблице 3.
В случае потери аудиофокуса необходимо быть уверенным, что фокус потерян окончательно. Если приложение получает событие AUDIOFOCUS_LOSS_TRANSIENT или AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, оно может придержать зарезервированные ресурсы (не вызывать release()), т.к. скорее всего скоро произойдет новое событие изменения аудиофокуса. Стоит сохранять информацию о временной потере фокуса в каком-нибудь флаге или путем перехода в отдельную вершину графа состояний.
Если приложение запрашивало постоянный аудиофокус в режиме AUDIOFOCUS_GAIN и получило событие AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK, подходящей реакцией будет сделать громкость потише (не забыв сохранить старое значение громкости) и затем вернуть громкость при получении события AUDIOFOCUS_GAIN (см. картинку).
Таблица 3. Реакция приложения при изменении состояния аудиофокуса.
Тип смены фокуса | Реакция |
AUDIOFOCUS_GAIN | Событие получения после события потери фокуса: Возобновить воспроизведение медиа, если состояние приложения не противоречат этому. Например, пользователь нажал паузу до события потери фокуса. |
AUDIOFOCUS_LOSS | Остановить воспроизведение, освободить ресурсы |
AUDIOFOCUS_LOSS_TRANSIENT | Приостановить воспроизведение и сохранить флажок о том, что потеря фокуса временная, для того, чтобы при обработке AUDIOFOCUS_GAIN можно было при необходимости возобновить воспроизведение. Не освобождать ресурсы. |
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK | Сделать громкость тише или приостановить воспроизведение, не забывая отслеживать состояние как в случае с AUDIOFOCUS_LOSS_TRANSIENT. Не освобождать ресурсы. |
Заключение и что почитать
Быть “примерным гражданином” в стане аудиоприложений на андроид-устройствах означает уважать правила работы с аудиофокусом и корректно обрабатывать все ситуации. Постарайтесь заставить ваше приложение действовать разумным образом и не преподносить пользователю неприятных сюрпризов. Об аудиоподсистеме андройд можно рассказать еще много интересного, по ссылкам ниже можно прочитать о ней подробнее.
- Managing Audio Focus, урок на ресурсе Android developers.
- Allowing applications to play nice with each other: Handling remote control buttons, пост в блоге Android Developers Blog.
Исходные коды из статьи доступны по ссылке:
https://android.googlesource.com/platform/development/+/master/samples/RandomMusicPlayer