Переключатель аудиовыхода в Android 13 может отображать Cast устройства

Переключатель аудиовыхода в Android 13 может отображать Cast устройства

На сегодняшний день переключатель устройств аудиовыхода Android предлагает только локальные устройства, такие как "Этот смартфон" и Bluetooth периферия, что в общем то не делает ее настолько полезной. Но, как обнаружил Мишаал Рахман на Esper.io, компания Google недавно обновила свой Google Cast SDK, благодаря чему стало известно, что в Android 13 появится новая функция 'Stream Expansion', которая позволит транслировать аудио на несколько устройств, работающих по протоколу Google Cast. 

В переключателе аудиовыходов в Android 13 заложена возможность показывать устройства Google Cast, если приложение плеера имеет таковую поддержку. Это позволит вам быстрее передавать сеансы мультимедиа между телефоном и любыми устройствами с функцией Cast в вашей сети. 

Формально это поможет переключать бесшовно переключатся между устройствами воспроизведения Cast (например умная колонка или Chromecast) и вашим смартфоном без необходимости разблокировать устройство или открывать приложение. Ниже приведена демонстрация от Мишаала Рахмана с Esper Blog

На самом деле, об этой функции люди мечтали еще с самого добавления переключателя аудиустройств в Android 11, и на самом деле, переключатель вывода уже поддерживает показ устройств Сast... если приложения используют последнюю версию библиотеки MediaRouter Jetpack. Определенно, в какой-то момент что-то пошло не так, но хорошая новость заключается в том, что эта долгожданная функция наконец-то появилась вновь, но только в приложениях, которые ее поддерживают.

Начало, положенное в Android 11.

В Android 11 Google внесла некоторые изменения в системное уведомление плеера. Тогда он стал частью панели быстрых настроек (шторки), и располагался в самом низу. Пространство, занимаемое плеером, называлось поверхностью "Media Controls". Данное нововведение группировало все сеансы из нескольких приложений в карусель, которую можно пролистывать. 

Чтобы приложения могли отображаться в пространстве Media Controls, им нужно было создать уведомление MediaStyle - стиль уведомления, который был введен в Android 5.0. Система принимает информацию, предоставленную уведомлением MediaStyle*, и отображает элементы управления воспроизведением и информацию об аудиовыходе

*В Android 13 вместо MediaStyle был введен новый PlaybackState.

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

По умолчанию в этом окне отображались только локальные устройства (ваш телефон или сопряженные Bluetooth устройства), однако вскоре после релиза Android 11 обнаружилось, что это меню также поддерживает отображение Cast устройств.

Скриншот из видеоролика “What’s new in Media”, в котором гуглер Дон Тернер демонстрирует бесшовную передачу медиафайлов между устройствами воспроизведения. Вот как эта функция должна была выглядеть в Android 11.

Но все не так просто. Для отображения в этом меню Cast-устройств предполагается поддержка со стороны приложения. Для этого разработчикам придется воспользоваться библиотекой MediaRouter Jetpack версии 1.2.0-alpha02 или новее. MediaRouter уже указан как одно из необходимых условий для разработки с использованием Cast Application Framework, поэтому на тот момент казалось, что прежде чем мы увидим Cast-устройства в переключателе вывода, нам придется подождать, пока разработчики обновят свои приложения.

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

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

Если есть инструменты, то в чем проблема? 

Проблема не в сторонних приложениях и не в недостаточной адаптации API, а в том, что похоже, что Google тогда тихо отключил возможность отображения Cast-устройств в переключателе вывода. Возможно, это было сделано переключателем в Сервисах Google Play, который отвечает за одну из функциональностей Google Cast SDK для Android. 

Каково состояние функции сейчас?

В ходе тестирования Мишаалу Рахману удалось на мгновение заставить появиться Cast-устройства в переключателе вывода на Pixel 3 XL с Android 12. Однако после выбора устройства системный интерфейс аварийно завершил работу, и переключатель выходов больше не показывал устройства Cast.

Все остальные устройства под управлением Android 11, Android 12 или Android 12L, которые протестировал Мишаал, ни разу не показали Cast-устройства в переключателе вывода. Однако, как оказалось, эта функция уже может работать на Android 13

Для тестов Мишаал использовал Universal Android Music Player (UAMP), проект с открытым исходным кодом, который демонстрирует, как реализовать аудио-медиа приложение. Бесшовная передача не поддерживается в основной ветке, но исправления доступны в этом pull-запросе

Android 13: Stream Expansion

В ходе всех этих тестов Мишаал смог активировать на своем Pixel 6 Pro функцию Stream Expansion, недоступную на других тестовых устройствах Android 13. Эта функция позволяет воспроизводить аудио на нескольких устройствах. Когда она включена, в переключателе вывода появляется круглую кнопка рядом с каждым устройством. При выборе кнопки устройство будет добавлено к существующей медиасессии.

Android 13: Stream Expansion

Скриншот переключателя вывода со включенным Stream Expansion в Android 13.

Однако на текущий момент эта функция довольно глючная. Переключатель вывода закрывался, а затем открывался заново после выбора второго Cast устройства, после чего воспроизведение медиа на телефоне перезапускалось. Тем не менее, это сработало, поскольку воспроизведение шло с обоих устройств.

Почему работает только на Android 13?

Очевидно, что функция изначально предназначалась для работы на Android 11 и выше, иначе Google не анонсировал бы ее в 2020 году. Возможно, Google обнаружила, что в ней слишком много багов и лагов, и отключила ее до тех пор, пока не устранит все недочеты в более позднем релизе. Или, возможно, были необходимы некоторые изменения в Media Controls в Android 13, например, новый API системы удаленного воспроизведения Remote playback API (коммит AOSP). Как бы то ни было, Google намерен вернуть эту функцию в Android 13, и разработчики должны быть к этому готовы.

В последнем релизе Google Cast SDK компания Google опубликовала документацию по новой функции Cast SDK под названием Output Switcher (такое же название, как и в Android). В ней описано, как разработчики могут включить передачу медиафайлов с локального на удаленный, с удаленного на локальный и с удаленного на удаленный. Под "локальными" в данном случае подразумеваются устройства, сопряженные через Bluetooth, а под "удаленными" - устройства с поддержкой Cast. Другими словами, передача данных с локального на удаленный и с удаленного на локальный подразумевает передачу медиа между телефоном/планшетом и устройством с поддержкой Cast, а передача данных с удаленного на удаленный подразумевает передачу медиа между устройствами с поддержкой Cast.

Под капотом Output Switcher использует библиотеку MediaRouter для переключения воспроизведения между телефоном/планшетом и удаленными устройствами с поддержкой Cast. Необходимые условия для поддержки передачи мультимедиа с локального на удаленный и с удаленного на локальный включают использование SDK Android Sender версии 21.2.0 и новее, переход на AndroidX из-за зависимости от MediaRouter, настройку уведомлений о мультимедиа и использование устройства под управлением Android 13. Затем разработчикам необходимо добавить широковещательный приемник (broadcast receiver) MediaTransferReceiver в манифест приложения и добавить код для обработки переключения с локального на удаленный и наоборот. Это, в частности, то, что добавляет в Universal Android Music Player (UAMP) нереализованный pull-запрос, на который давалась ссылка выше, и именно так Мишаал тестировал передачу медиафайлов с локального на удаленный и с удаленного на локальный.

С другой стороны, поддержка передачи мультимедиа с удаленного на удаленный, как утверждается, "будет автоматически распространяться на телефоны Android без необходимости обновлять ваше приложение через обновление сервисов Google Play, которое произойдет в ближайшее время". Возможно, именно поэтому попытка использовать Stream Expansion оказалась настолько глючной; возможно, для ее работы нужна более новая версия Сервисов Google Play. Говоря о Stream Expansion, Google утверждает, что эта функциональность "поддерживается платформой Cast и не требует никаких дополнительных изменений, если приложение использует стандартный пользовательский интерфейс", что хорошо. Однако Stream Expansion подходит только для аудиоприложений, использующих Output Switcher. Видеоприложения используют Stream Transfer, который не поддерживает расширение воспроизведения на несколько устройств. 

Разработчикам, которые заинтересованы в добавлении поддержки передачи медиафайлов с локального на удаленное, с удаленного на локальное и/или с удаленного на удаленное устройство, следует ознакомиться с документацией Google. Стоит отметить, что для тестирования передачи мультимедиа с удаленного на удаленное устройство вам необходимо получить доступ к этой тестовой группе, доступной только по приглашению. OEM-производители могут проверить работу remote playback API с помощью новых CTS тестов, хотя в CDD даже нет требований, чтобы сборки поддерживали переключатель вывода в первую очередь.

На основе статьи Мишаала Рахмана 'Android 13’s audio output switcher will soon show cast devices' на Esper Blog