Программа для маршрутизации звука андроид
Вчера вечером я смотрел фильм на ноутбуке, и мои беспроводные наушники решили умереть. Я не хотел никого разбудить, пропустив звук через динамики, а потом он ударил меня. Должен быть способ потоковой передачи звука с ПК на смартфон Android. Оказывается, есть. Работает аналогично Частное прослушивание Року но для вашего ПК все, что вам нужно, это хорошее соединение Wi-Fi. Я нашел 3 приложения, которые позволяют это делать. Посмотрим, как это работает.
Читайте: 5 приложений для синхронизации музыки для потоковой передачи музыки на несколько устройств
Потоковое аудио с ПК на Android
1. Транслируйте то, что слышите
Первым в списке «Stream What You Hear» является потоковый сервер на основе DLNA и UPnP. Вы можете использовать его для потоковой передачи мультимедийного контента с вашего компьютера на любое устройство, поддерживающее DLNA и UPnP. Я могу использовать это приложение для потоковой передачи звука на игровые консоли, телевизоры, динамики SONOS и т. Д.
Установить и использовать приложение очень просто, просто скачайте приложение с официального сайта. интернет сайт. Он работает в двух частях: сначала вам нужно установить серверное приложение на компьютер с Windows, а затем соответствующее приложение Android на свой телефон для потоковой передачи. Это приложение будет работать без сбоев, если все устройства находятся в одной сети.
Теперь скопируйте URL-адрес в браузере смартфона и нажмите «Перейти», чтобы начать прямую трансляцию звука. Он буферизуется на некоторое время, а затем начинает воспроизведение содержимого.
Я пробовал это приложение, оно хорошо работает для потоковой передачи, но имеет значительное отставание. Если вы собираетесь смотреть фильмы с такой настройкой, это, вероятно, не лучшая идея. Однако вы можете использовать эту настройку для потоковой передачи звука с ПК на Android.
- Нет приложения для установки любого приложения на смартфон
- Поддерживает любое устройство с веб-браузером
- Бесперебойная потоковая передача на устройствах UPnP, таких как телевизоры, динамики SONOS и т. Д.
- Высокая задержка при передаче звука
- Не работает с Bubble UPnP
2. Беспроводная колонка для Android (WiFi Audio)
Следующее приложение на удивление работает очень хорошо с небольшой задержкой. Беспроводной динамик для Android позволяет передавать звук с компьютера Windows на смартфон Android.
Установите приложение для Android из Магазин игр и приложение-компаньон для Windows из их Форум. Вам потребуется зарегистрироваться на их форуме, прежде чем давать вам ссылку для загрузки.
После настройки приложения на вашем смартфоне и сервере в Windows введите IP-адрес смартфона в серверном приложении на компьютере и нажмите «Пуск».
После подключения устройств вы получите звук со смартфона Android. Я обнаружил небольшую хитрость при использовании приложения. Если вы используете медиаплеер VLC, вы можете настроить задержку звука в соответствии с задержкой при передаче. После настройки задержки звука звук, полученный на смартфоне, был идеально синхронизирован.
- Низкая задержка
- Легко настроить
- Работает без интернета
- Для скачивания сервера необходима регистрация на форуме
- Нет возможности настроить задержку или битрейт
3. SoundWire
Затем у нас есть SoundWire, приложение для Android для воспроизведения звука с вашего компьютера на Android. Это приложение работает аналогично предыдущему приложению Wifi Audio и имеет несколько дополнительных функций. Вы можете настроить размер аудиобуфера, чтобы снизить задержку при уменьшении и более плавное воспроизведение при увеличении. Это приложение выполняет все флажки, его легко установить, оно работает по Wi-Fi, имеет низкую задержку и бесплатное.
Чтобы настроить SoundWire, установите Приложение для Android на вашем телефоне и сопутствующий сервер приложение на вашем компьютере. Сопутствующее приложение работает в Windows, Linux и Raspberry Pi, убедитесь, что вы установили правильную версию.
После установки откройте серверное приложение и приложение SoundWire, убедитесь, что устройства находятся в одной сети. Введите адрес сервера в приложении для Android. Коснитесь значка Soundwire, чтобы подключиться.
После подключения вы можете выбрать аудиовход и частоту звука в настройках. Сервер работает в системном трее и транслирует все, что играет на вашем компьютере, пока вы не отключитесь.
- Несколько вариантов аудиовхода
- Вариант записи
- Вы можете настроить частоту, битрейт и задержку.
- Приложение периодически прерывает передачу, что немного раздражает.
Установить SoundWire на Android
Потоковое аудио с ПК на Android
Это были три способа потоковой передачи звука с ПК на Android. Первое приложение SWYH лучше всего подходит для обычной передачи звука, например для потоковой передачи и воспроизведения музыки. У него значительное отставание, поэтому я бы не рекомендовал его для просмотра фильмов. WifiAudio приличный и совершенно бесплатный, и вы не получаете никаких прерываний, как SoundWire, но SoundWire имеет больше функций. SoundWire позволяет регулировать битрейт и частоту в зависимости от просматриваемого контента, что делает его подходящим для просмотра фильмов. Какой метод вы используете для потоковой передачи звука с ПК на Android? Расскажите нам в комментариях ниже.
Читайте: Приложения для удаленного управления телефоном Android с ПК (USB и WiFi)
Наверняка на ваших устройствах хоть иногда, но возникают проблемы, которые бы вам хотелось устранить, не прибегая к различным сложным методам. К сожалению, это далеко не всегда возможно, но вот, к примеру, некоторые трудности с воспроизведением звука на Android-девайсах вполне решаемы простой установкой приложения, хотя не все пользователи знают об этом. Однажды я нашёл такое приложение, в тот момент, когда искал в поисковике способы решения своих проблем.
В этом отзыве речь пойдёт о софтинке SoundAbout, которую кто-то, возможно, помнит ещё под старым названием - AudioRoutingSettings, которое даже лучше отражало суть приложения (уже более-менее понятно, что это некий звуковой маршрутизатор, а не просто софт, отображающий информацию о звуковых возможностях Android-устройства). Пускай название изменилось, но приложение от этого хуже не стало - даже наоборот, появился дополнительный функционал.
В каких же именно случаях может пригодиться приложение? Не думаю, что смогу перечислить все варианты использования, расскажу лишь о самых распространённых и известных мне.
Подобные неприятности вас могут поджидать, к примеру, при установке кастомной прошивки - иногда гарнитуры перестают работать или звук идёт как с динамиков, так и с наушников одновременно. Поэтому сейчас существуют прошивки, в которых уже заранее установлен SoundAbout, - оно и понятно, ведь так проще для пользователя, тем более, если иначе проблему не решить.
Или другой случай: с разъёмом 3,5 происходит что-то неприятное, что ведёт его к поломке (хотя не исключено, что тут всё дело в прошивке, а не в железе), в результате чего устройство думает, что в него вставлены наушники. Естественно, звук при этом не воспроизводится через динамики, что может даже заставить пользователя отдать девайс в ремонт. Это, конечно, иногда желательно сделать, но вовсе не обязательно при наличии возможности установить SoundAbout.
Ещё одна возможность приложения - включение звука через гарнитуру, но при одновременном использовании микрофона Android-девайса (в меню Wired Headset setting/Wired Headset microphone). Такой вариант тоже кому-нибудь пригодится, ведь порой микрофоны в гарнитурах не самого лучшего качества, а на современных смартфонах может быть установлено сразу несколько микрофонов с отличной системой шумоподавления.
Как видите, софтинка всегда может пригодиться, тем более, что иногда, после необходимых настроек её можно вообще удалить. Но лично я держу её в системе на всякий случай.
Что бы ещё такого сделать? Допустим, что у меня не работает разговорный динамик, - в итоге я воспользуюсь опцией, которая позволяет автоматически переключаться на громкую связь сразу после начала разговора (Phone call audio/Speaker).
Говорят, что на некоторых устройствах можно вывести все звуковые сигналы (в том числе музыку в плеере) через разговорный динамик, но этого мне сделать не удалось. Софтинка любезно предупредила, что данная функция не всегда работает.
Или если вы хотите выключить проводную гарнитуру, при этом не вынимая её из разъёма, то это сделать тоже проще некуда. В настройках "Media audio" выбираем пункт "Speaker", и можете даже не волноваться по тому поводу, что значок гарнитуры не исчезает из верхней панели, - звук на наушники уже не будет поступать.
Существует и удобный виджет, который выносится на рабочий стол, тем самым упрощая процесс переключения между динамиками и наушниками - это его единственное предназначение.
Пожалуй, самым главным недостатком SoundAbout является то, что срок действия бесплатной версии может подойти к концу и тогда придётся либо приобретать полную версию за 225 рублей, либо воспользоваться специализированными форумами, где, обычно, всё бесплатно.
Выделю и дополнительные моменты, которые мне понравились. В настройках проводной гарнитуры получается выставить автоматическое воспроизведение даже после того, как гарнитура была извлечена из устройства (обычно после этого следует пауза). Работает всё и в стандартном Android-плеере. Помимо всего прочего, в настройках есть полоска, с помощью которой задаётся громкость при подключении наушников. Делается это в обход стандартных настроек уровня громкости, используемых в операционной системе.
Настройки преобразования текста в речь также не лишены интересностей. Так, вы без проблем запретите или разрешите воспроизведение фоновых звуков и, тем самым, перестанете отвлекаться на то, что вам не нужно, или же наоборот, будете в курсе всех событий.
Настройте только один пункт для имитации гарнитуры. |
До применения настроек. |
После. |
Даже не знаю, есть ли прямые конкуренты у приложения. Никогда не видел ничего подобного, да и каких-либо рекомендаций по поводу установки аналогов, от других пользователей читать не приходилось. Да, есть множество приложений, которые, так или иначе, взаимодействуют с гарнитурами и звуком, но это всё немного не то, поэтому не вижу смысла их перечислять. SoundAbout выделяется своими возможностями и в некоторых случаях она просто незаменима, поэтому заслуживает самой высокой оценки.
Вес приложения после установки составляет менее 1 МБ, а в оперативной памяти оно занимает обычно не более 10 МБ, что весьма экономно. Работает софт даже на старенькой Android 2.1, но с некоторыми устройствами возможны проблемы, если верить информации на официальном форуме приложения.
SoundAbout Pro - как пользоваться и настроить. Наверняка на ваших устройствах хоть иногда, но возникают проблемы, которые бы вам хотелось устранить, не прибегая к различным сложным методам. К сожалению, это далеко не всегда возможно, но вот, к примеру, некоторые трудности с воспроизведением звука на Android-девайсах вполне решаемы простой установкой приложения, хотя не все пользователи знают об этом. Однажды я нашёл такое приложение, в тот момент, когда искал в поисковике способы решения своих проблем.
В этом отзыве речь пойдёт о софтинке SoundAbout, которую кто-то, возможно, помнит ещё под старым названием - AudioRoutingSettings, которое даже лучше отражало суть приложения (уже более-менее понятно, что это некий звуковой маршрутизатор, а не просто софт, отображающий информацию о звуковых возможностях Android-устройства). Пускай название изменилось, но приложение от этого хуже не стало - даже наоборот, появился дополнительный функционал.
В каких же именно случаях может пригодиться приложение? Не думаю, что смогу перечислить все варианты использования, расскажу лишь о самых распространённых и известных мне.
Подобные неприятности вас могут поджидать, к примеру, при установке кастомной прошивки - иногда гарнитуры перестают работать или звук идёт как с динамиков, так и с наушников одновременно. Поэтому сейчас существуют прошивки, в которых уже заранее установлен SoundAbout, - оно и понятно, ведь так проще для пользователя, тем более, если иначе проблему не решить.
Или другой случай: с разъёмом 3,5 происходит что-то неприятное, что ведёт его к поломке (хотя не исключено, что тут всё дело в прошивке, а не в железе), в результате чего устройство думает, что в него вставлены наушники. Естественно, звук при этом не воспроизводится через динамики, что может даже заставить пользователя отдать девайс в ремонт. Это, конечно, иногда желательно сделать, но вовсе не обязательно при наличии возможности установить SoundAbout.
Ещё одна возможность приложения - включение звука через гарнитуру, но при одновременном использовании микрофона Android-девайса (в меню Wired Headset setting/Wired Headset microphone). Такой вариант тоже кому-нибудь пригодится, ведь порой микрофоны в гарнитурах не самого лучшего качества, а на современных смартфонах может быть установлено сразу несколько микрофонов с отличной системой шумоподавления.
Как видите, софтинка всегда может пригодиться, тем более, что иногда, после необходимых настроек её можно вообще удалить. Но лично я держу её в системе на всякий случай.
Что бы ещё такого сделать? Допустим, что у меня не работает разговорный динамик, - в итоге я воспользуюсь опцией, которая позволяет автоматически переключаться на громкую связь сразу после начала разговора (Phone call audio/Speaker).
Говорят, что на некоторых устройствах можно вывести все звуковые сигналы (в том числе музыку в плеере) через разговорный динамик, но этого мне сделать не удалось. Софтинка любезно предупредила, что данная функция не всегда работает.
Или если вы хотите выключить проводную гарнитуру, при этом не вынимая её из разъёма, то это сделать тоже проще некуда. В настройках "Media audio" выбираем пункт "Speaker", и можете даже не волноваться по тому поводу, что значок гарнитуры не исчезает из верхней панели, - звук на наушники уже не будет поступать.
Настройки программы достаточно просты (но их много) - если не все, то большинство пунктов точно должны быть понятны, несмотря на тот факт, что официальным языком приложения является английский. Сначала обдумайте то, что хотите сделать, а затем найдите соответствующий пункт в меню.
Существует и удобный виджет, который выносится на рабочий стол, тем самым упрощая процесс переключения между динамиками и наушниками - это его единственное предназначение.
Выделю и дополнительные моменты, которые мне понравились. В настройках проводной гарнитуры получается выставить автоматическое воспроизведение даже после того, как гарнитура была извлечена из устройства (обычно после этого следует пауза). Работает всё и в стандартном Android-плеере. Помимо всего прочего, в настройках есть полоска, с помощью которой задаётся громкость при подключении наушников. Делается это в обход стандартных настроек уровня громкости, используемых в операционной системе.
Настройки преобразования текста в речь также не лишены интересностей. Так, вы без проблем запретите или разрешите воспроизведение фоновых звуков и, тем самым, перестанете отвлекаться на то, что вам не нужно, или же наоборот, будете в курсе всех событий.
Немного поэкспериментировав, решил добавить, хоть и уже известный способ применения SoundAbout. Наверняка вы знаете о том, что не во всех смартфонах и планшетах можно слушать FM-радио без подключенных наушников. Так вот, софтинка решает эту проблему, имитируя подключенную гарнитуру. Остаётся только зайти в приложение "Радио" и в настройках выбрать "динамик" в качестве источника звука. Далеко не всегда без антенны удаётся получить приемлемое качество сигнала - тут всё зависит от устройства и от того, где вы слушаете радио. Это может произойти на улице, возле окна или где-то глубоко внутри помещения. Для того чтобы усилить сигнал, обычно используются металлические предметы: без каких-либо усилий (чтобы ничего не повредить) до упора вставляете предмет в разъём 3,5 мм, и вот заменитель антенны готов. Я использовал иглу для насоса, после чего сигнал улучшился в разы, хотя иногда иглу приходится всячески крутить, тем самым как бы настраивая сигнал ☺. Но некоторые устройства (например, смартфон Мегафон Логин 2) на удивление неплохо ловят сигнал даже без антенны.
Даже не знаю, есть ли прямые конкуренты у приложения. Никогда не видел ничего подобного, да и каких-либо рекомендаций по поводу установки аналогов, от других пользователей читать не приходилось. Да, есть множество приложений, которые, так или иначе, взаимодействуют с гарнитурами и звуком, но это всё немного не то, поэтому не вижу смысла их перечислять. SoundAbout выделяется своими возможностями и в некоторых случаях она просто незаменима, поэтому заслуживает самой высокой оценки.
Полный список функций.
1) SoundAbout Service - Turn service "On-With Status", "On-No Status", "OFF".
Can be used to remove constant notification required by Android 4.3+.
2) Media Audio - Route the media audio to (Built-In speaker, Wired Headphones, Wired Headset (with mic), Earpiece, Aux Digital(HDMI), Bluetooth(A2DP), Bluetooth(mono), Bluetooth(mono)(dynamic), Dock (Analog), Dock (Digital), USB Client (to read music files from another device), USB Host (to share files from phone to another device)
(Some outputs are enabled for the PRO VERSION only)
3) Phone call audio - Route the phone call audio to (Built in Earpiece, External speaker, Bluetooth (mono), Wired Headphones, Wired Headset (with mic), Dock (Analog), Dock (Digital)
(Phone call audio to Bluetoth A2DP(media) NOT ed in Android)
4) Alert behavior - Settings announce Caller ID and to also (route/block) notification or ringtone audio based on what audio output is currently being used:
CallerID Alert (Pro version) - Settings for announcing a contact's name or the caller's number when the phone is ringing.
- Speak Caller ID - Check this to make SoundAbout announce the caller (using contacts list) when the phone is ringing.
- Introduction - What do say, during the Caller ID announcement before the caller's name.
- Repeat Caller ID - How many times to repeat the caller's name.
- Alert Type - Treat the announcement like a (Ring, Alarm, Media, DTMF).
Wired Headset behavior - Settings to override the audio mode for notifications/ringtones when a wired headset is in use.
- Notifications To - Where to allow Notification audio.
- Ringtones To - Where to allow Ringtone audio.
Bluetooth (A2DP) behavior (Pro version) - Settings to override the audio mode for notifications/ringtones when a Bluetooth A2DP device is in use.
- Notifications To - Where to allow Notification audio.
- Ringtones To - Where to allow Ringtone audio.
Bluetooth (mono) behavior (Pro version) - Settings to override the audio mode for notifications/ringtones when a Bluetooth mono device is in use.
Notifications and Ringtones CANNOT be sent to Bluetooth mono.
- Notifications To - Where to allow Notification audio.
- Ringtones To - Where to allow Ringtone audio.
Aux Digital (HDMI) behavior (Pro version) - Settings to override the audio mode for notifications/ringtones when a Aux Digital (HDMI) device is in use.
- Notifications To - Where to allow Notification audio.
- Ringtones To - Where to allow Ringtone audio.
Dock behavior (Pro version) - Settings to override the audio mode for notifications/ringtones when a Dock is in use.
- Notifications To - Where to allow Notification audio.
- Ringtones To - Where to allow Ringtone audio.
5) Connectable devices - (Wired headset, Bluetooth, Docks, USB. etc)
Wired Headset settings - Settings for routing wired headset audio.
- Wired Headset detection - Check this to allow SoundAbout to detect or ignore when a headset is plugged into the device. (un-check if device thinks a headset is plugged in when it is not)
- Wired Headset Microphone - Check this to allow SoundAbout to detect a wired headset microphone when a headset is plugged in.
- Un-plug pauses music player - Setting to pause music player when headset is unplugged. (Music apps may do this automatically)
- Plug-in continues music player - Setting to continue music player when headset is plugged in. (Music apps may do this automatically)
- Plug-in Volume ON/Off (Pro Version) - Turn ON and set default volume when headset is plugged in.
- Plug-in Volume (Pro Version) - Set default volume when headset is plugged in.
Bluetooth settings - Settings for routing Bluetooth audio.
- Bluetooth Auto Enable - Automatically enable Bluetooth when Bluetooth output is selected.
- Media Audio behavior - Settings for automatically routing Bluetooth audio when Media Audio is set to (Let App Decide).
- - Bluetooth (A2DP) auto usage - Allow/Deny the connected Bluetooth media device to be the default output for media.
- - Bluetooth (mono) auto usage - Allow/Deny the connected Bluetooth (mono) media device to be the default output for media.
- - Bluetooth (dynamic) auto usage - Allow/Deny the connected Bluetooth (mono) media device to detect and play media by default.
- Phone call behavior - Settings for automatically routing Bluetooth audio when Phone call Audio is set to (Let App Decide).
- - Bluetooth (mono) auto usage - Allow/Deny the connected Bluetooth (mono) device to be the default output for phone calls.
- - Disconnect PBAP client - Setting to disconnect car from retreiving the address book during a phone call. (Some cars usage of PBAP interrupts Bluetooth phone call signal)
- - Disable Wired audio - Allow/Deny Wired Headset when using Bluetooth device for a Phone call. (Some phones try to force the wired headset to be used for phone call if the headset is plugged in)
- (Mono) microphone override - Use the Bluetooth (mono) device microphone for voice input while using audio output set in the Media audio setting.
- Bluetooth disconnect audio - When a Bluetooth device is disconnected when playing media, either switch to "Media audio" setting (checked) or go silent (un-checked).
Dock settings - Settings for routing Dock audio.
- Analog Dock audio usage - Allow/Deny the connected Analog dock to be the default output for media.
- Digital Dock audio usage - Allow/Deny the connected Digital dock to be the default output for media.
USB settings - Settings for toggling USB Host/Client.
- USB Host usage - Allow/Deny using the device as a USB host by default.
- USB Client usage - Allow/Deny using the device as a USB client by default.
6) Text-To-Speech behavior (Android 4.0+)(Pro version) - Settings to send Text-To-Speech audio to various outputs with/without delays:
Android TTS Settings - Opens the Android TTS settings screen so that you can choose SoundAbout TTS as your Text-To-Speech engine.
SoundAbout TTS Engine - Lets you choose the REAL TTS engine that SoundAbout TTS will use to convert text to audio, after switching the audio output to the desired "Audio Output" setting.
Audio Output - When a Text to Speech request occurs, this setting will switch the audio audio to (External speaker, Wired Headphones, Wired Headset (with mic), Earpiece, Aux Digital(HDMI), Bluetooth(A2DP), Bluetooth(mono), Dock(Analog), Dock(Digital))
Max Utterance per request - How many TTS items to process per request. Handy if the client app (Navigation app) tries to process ALL the TTS items at one time. This lets you do 1,2,3.etc at a time.
Delay utterance (secs) - Lets you delay before sending the audio to output. Handy to allow Bluetooth mono to connect.
Allow during phone call - Allows TTS audio to play in background while you are on a phone call.
Allow background audio - Allows existing audio to continue at a lower volume while TTS audio is playing.
7) Voice Search behavior (Pro version) - Settings for selecting a Voice Search application and routing Voice Search audio to Bluetooth (mono), if connected. Helpful for voice searches in the car.
Choose Voice Search - Choose what application to run when the "SoundAbout Voice Search" icon is pressed on the home screen.
Media Audio - Lets you choose what audio output to use when doing the voice search.
Max wait to speak - The number of seconds to wait for the voice search app to prompt for input before quitting.
Wait to process search - How many seconds to wait while the voice search app looks up the results before quitting.
Wait after results - Lets you specify the number of seconds to wait after the search results for returned so that you can do another search.
Activity Icons:
1) SoundAbout main app - to configure all the settings for SoundAbout.
2) SoundAbout Voice Search - to switch audio output and THEN open the configured Voice Search app.
(configuration settings in SoundAbout main app)
Widgets:
1) Headset Toggle - to toggle a Wired Headset on or off.
В статье рассматривается архитектура и API для создания приложений, воспроизводящих музыку. Мы напишем простое приложение, которое будет проигрывать небольшой заранее заданный плейлист, но «по-взрослому» — с использованием официально рекомендуемых практик. Мы применим MediaSession и MediaController для организации единой точки доступа к медиаплееру, и MediaBrowserService для поддержки Android Auto. А также оговорим ряд шагов, которые обязательны, если мы не хотим вызвать ненависти пользователя.
В первом приближении задача выглядит просто: в activity создаем MediaPlayer, при нажатии кнопки Play начинаем воспроизведение, а Stop — останавливаем. Все прекрасно работает ровно до тех пор, пока пользователь не выйдет из activity. Очевидным решением будет перенос MediaPlayer в сервис. Однако теперь у нас встают вопросы организации доступа к плееру из UI. Нам придется реализовать binded-сервис, придумать для него API, который позволил бы управлять плеером и получать от него события. Но это только половина дела: никто, кроме нас, не знает API сервиса, соответственно, наша activity будет единственным средством управления. Пользователю придется зайти в приложение и нажать Pause, если он хочет позвонить. В идеале нам нужен унифицированный способ сообщить Android, что наше приложение является плеером, им можно управлять и что в настоящий момент мы играем такой-то трек из такого-то альбома. Чтобы система со своей стороны подсобила нам с UI. В Lollipop (API 21) был представлен такой механизм в виде классов MediaSession и MediaController. Немногим позже в support library появились их близнецы MediaSessionCompat и MediaControllerCompat.
Следует сразу отметить, что MediaSession не имеет отношения к воспроизведению звука, он только об управлении плеером и его метаданными.
MediaSession
Итак, мы создаем экземпляр MediaSession в сервисе, заполняем его сведениями о нашем плеере, его состоянии и отдаем MediaSession.Callback, в котором определены методы onPlay, onPause, onStop, onSkipToNext и прочие. В эти методы мы помещаем код управления MediaPlayer (в примере воспользуемся ExoPlayer). Наша цель, чтобы события и от аппаратных кнопок, и из окна блокировки, и с часов под Android Wear вызывали эти методы.
Полностью рабочий код доступен на GitHub (ветка master). В статьи приводятся только переработанные выдержки из него.
Для доступа извне к MediaSession требуется токен. Для этого научим сервис его отдавать
и пропишем в манифест
MediaController
Теперь реализуем activity с кнопками управления. Создаем экземпляр MediaController и передаем в конструктор полученный из сервиса токен.
MediaController предоставляет как методы управления плеером play, pause, stop, так и коллбэки onPlaybackStateChanged(PlaybackState state) и onMetadataChanged(MediaMetadata metadata). К одному MediaSession могут подключиться несколько MediaController, таким образом можно легко обеспечить консистентность состояний кнопок во всех окнах.
Наша activity работает, но ведь идея исходно была, чтобы из окна блокировки тоже можно было управлять. И тут мы приходим к важному моменту: в API 21 полностью переделали окно блокировки, теперь там отображаются уведомления и кнопки управления плеером надо делать через уведомления. К этому мы вернемся позже, давайте пока рассмотрим старое окно блокировки.
Как только мы вызываем mediaSession.setActive(true), система магическим образом присоединяется без всяких токенов к MediaSession и показывает кнопки управления на фоне картинки из метаданных.
Однако в силу исторических причин события о нажатии кнопок приходят не напрямую в MediaSession, а в виде бродкастов. Соответственно, нам надо еще подписаться на эти бродкасты и перебросить их в MediaSession.
MediaButtonReceiver
Для этого разработчики Android любезно предлагают нам воспользоваться готовым ресивером MediaButtonReceiver.
Добавим его в манифест
MediaButtonReceiver при получении события ищет в приложении сервис, который также принимает "android.intent.action.MEDIA_BUTTON" и перенаправляет его туда. Поэтому добавим аналогичный интент-фильтр в сервис
Если подходящий сервис не найден или их несколько, будет выброшен IllegalStateException.
Теперь в сервис добавим
Метод handleIntent анализирует коды кнопок из intent и вызывает соответствующие коллбэки в mediaSession. Получилось немного плясок с бубном, но зато почти без написания кода.
На системах с API >= 21 система не использует бродкасты для отправки событий нажатия на кнопки и вместо этого напрямую обращается в MediaSession. Однако, если наш MediaSession неактивен (setActive(false)), его пробудят бродкастом. И для того, чтобы этот механизм работал, надо сообщить MediaSession, в какой ресивер отправлять бродкасты.
Добавим в onCreate сервиса
На системах с API < 21 метод setMediaButtonReceiver ничего не делает.
Ок, хорошо. Запускаем, переходим в окно блокировки и… ничего нет. Потому что мы забыли важный момент, без которого ничего не работает, — получение аудиофокуса.
Аудиофокус
Всегда существует вероятность, что несколько приложений захотят одновременно воспроизвести звук. Или поступил входящий звонок и надо срочно остановить музыку. Для решения этих проблем в системный сервис AudioManager включили возможность запроса аудиофокуса. Аудиофокус является правом воспроизводить звук и выдается только одному приложению в каждый момент времени. Если приложению отказали в предоставлении аудиофокуса или забрали его позже, воспроизведение звука необходимо остановить. Как правило фокус всегда предоставляется, то есть когда у приложения нажимают play, все остальные приложения замолкают. Исключение бывает только при активном телефонном разговоре. Технически нас никто не заставляет получать фокус, но мы же не хотим раздражать пользователя? Ну и плюс окно блокировки игнорирует приложения без аудиофокуса.
Фокус необходимо запрашивать в onPlay() и освобождать в onStop().
Получаем AudioManager в onCreate
Запрашиваем фокус в onPlay
И освобождаем в onStop
При запросе фокуса мы отдали коллбэк
Все, теперь окно блокировки на системах с API < 21 работает.
Android 4.4
MIUI 8 (базируется на Android 6, то есть теоретически окно блокировки не должно отображать наш трек, но здесь уже сказывается кастомизация MIUI).
Уведомления
Однако, как ранее упоминалось, начиная с API 21 окно блокировки научилось отображать уведомления. И по этому радостному поводу, вышеописанный механизм был выпилен. Так что теперь давайте еще формировать уведомления. Это не только требование современных систем, но и просто удобно, поскольку пользователю не придется выключать и включать экран, чтобы просто нажать паузу. Заодно применим это уведомление для перевода сервиса в foreground-режим.
Нам не придется рисовать кастомное уведомление, поскольку Android предоставляет специальный стиль для плееров — Notification.MediaStyle.
Добавим в сервис два метода
И добавим вызов refreshNotificationAndForegroundStatus(int playbackState) во все коллбэки MediaSession.
Android 4.4
Android 7.1.1
Android Wear
Started service
В принципе у нас уже все работает, но есть засада: наша activity запускает сервис через binding. Соответственно, после того, как activity отцепится от сервиса, он будет уничтожен и музыка остановится. Поэтому нам надо в onPlay добавить
Никакой обработки в onStartCommand не надо, наша цель не дать системе убить сервис после onUnbind.
А в onStop добавить
В случае, если к сервису привязаны клиенты, stopSelf ничего не делает, только взводит флаг, что после onUnbind сервис можно уничтожить. Так что это вполне безопасно.
ACTION_AUDIO_BECOMING_NOISY
Продолжаем полировать сервис. Допустим пользователь слушает музыку в наушниках и выдергивает их. Если эту ситуацию специально не обработать, звук переключится на динамик телефона и его услышат все окружающие. Было бы хорошо в этом случае встать на паузу.
Для этого в Android есть специальный бродкаст AudioManager.ACTION_AUDIO_BECOMING_NOISY.
Добавим в onPlay
В onPause и onStop
И по факту события встаем на паузу
Android Auto
Если у вас под рукой нет совместимого автомобиля, что, согласитесь, иногда бывает, можно просто запустить приложение и экран самого телефона будет работать в качестве автомобильного.
Исходный код выложен на GitHub (ветка MediaBrowserService).
Прежде всего надо указать в манифесте, что наше приложение совместимо с Android Auto.
Добавим в манифест
Здесь automotive_app_desc — это ссылка на файл automotive_app_desc.xml, который надо создать в папке xml
Преобразуем наш сервис в MediaBrowserService. Его задача, помимо всего ранее сделанного, отдавать токен в Android Auto и предоставлять плейлисты.
Поправим декларацию сервиса в манифесте
Во-первых, теперь наш сервис экспортируется, поскольку к нему будут подсоединяться снаружи.
И, во-вторых, добавлен интент-фильтр android.media.browse.MediaBrowserService.
Меняем родительский класс на MediaBrowserServiceCompat.
Поскольку теперь сервис должен отдавать разные IBinder в зависимости от интента, поправим onBind
Имплементируем два абстрактных метода, возвращающие плейлисты
И, наконец, имплементируем новый коллбэк MediaSession
Здесь mediaId — это тот, который мы отдали в setMediaId в onLoadChildren.
Плейлист
Трек
UPDATE от 27.10.2017: Пример на GitHub переведен на targetSdkVersion=26. Из релевантных теме статьи изменений необходимо отметить следующее:
- android.support.v7.app.NotificationCompat.MediaStyle теперь deprecated. Вместо него следует использовать android.support.v4.media.app.NotificationCompat.MediaStyle. Соответственно, больше нет необходимости использовать android.support.v7.app.NotificationCompat, теперь можно использовать android.support.v4.app.NotificationCompat
- Метод AudioManager.requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint) теперь тоже deprecated. Вместо него надо использовать AudioManager.requestAudioFocus(AudioFocusRequest focusRequest). AudioFocusRequest — новый класс, добавленный с API 26, поэтому не забывайте проверять на API level.
Создание AudioFocusRequest выглядит следующим образом
Теперь запрашиваем фокус
Разумеется, все вышеописанные изменения вносить необязательно, старые методы работать не перестали.
Еще очень рекомендую к просмотру доклад Ian Lake. Доклад от 2015 года, но вполне актуален.
Читайте также: