Реализация радиоуправления

Реализация радиоуправления основана на MediaSession и MediaBrowse , которые позволяют приложениям мультимедиа и голосовому помощнику управлять радио. Дополнительную информацию см. в разделе «Создание мультимедийных приложений для автомобилей» на сайте Developer.android.com.

Реализация дерева просмотра мультимедиа предоставляется в библиотеке car-broadcastradio-support в packages/apps/Car/libs . Эта библиотека также содержит расширения ProgramSelector для преобразования в URI и обратно. Реализациям радио рекомендуется использовать эту библиотеку для построения соответствующего дерева просмотра.

Переключатель источника мультимедиа

Чтобы обеспечить плавный переход между радио и другими приложениями, отображаемыми на мультимедиа, библиотека car-media-common содержит классы, которые следует интегрировать в приложение радио. MediaAppSelectorWidget можно включить в XML для приложения радио (значок и раскрывающийся список, используемые в справочных приложениях мультимедиа и радио):

<com.android.car.media.common.MediaAppSelectorWidget
    android:id="@+id/app_switch_container"
    android:layout_width="@dimen/app_switch_widget_width"
    android:layout_height="wrap_content"
    android:background="@drawable/app_item_background"
    android:gravity="center" />

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

AppSelectionFragment newFragment = AppSelectionFragment.create(widget,
            packageName, fullScreen);
    newFragment.show(mActivity.getSupportFragmentManager(), null);

Пример реализации представлен в эталонной реализации радиоприложения, расположенной в packages/apps/Car/Radio .

Подробные характеристики управления

Интерфейс MediaSession (через MediaSession.Callback ) предоставляет механизмы управления воспроизводимой в данный момент радиопрограммой:

  • onPlay , onStop . (Включить)отключение звука радио.
  • onPause . Пауза со сдвигом по времени (если поддерживается).
  • onPlayFromMediaId . Воспроизводите любой контент из папки верхнего уровня. Например, «Включи FM» или «Включи радио».
  • onPlayFromUri . Играйте на определенной частоте. Например, «Включи 88,5 FM».
  • onSkipToNext , onSkipToPrevious . Настройтесь на следующую или предыдущую станцию.
  • onSetRating . Добавить или удалить из избранного.

MediaBrowser предоставляет настраиваемый MediaItem для трех типов каталогов верхнего уровня:

  • ( Дополнительно ) Программы (станции). Этот режим обычно используется радиостанциями с двойным тюнером для указания всех доступных настраиваемых радиостанций в местоположении пользователя.
  • Избранное. Радиопрограммы добавлены в список «Избранное», некоторые могут быть недоступны (вне зоны приема).
  • Бандовые каналы. Все физически возможные каналы в текущем регионе (87.9, 88.1, 88.3, ​​88.5, 88.7, 88.9, 89.1 и так далее). У каждой группы есть отдельный каталог верхнего уровня.
Древовидная структура MediaBrowserService
Рисунок 2. Древовидная структура MediaBrowserService

Каждый элемент в каждой из этих папок (AM/FM/Programs) представляет собой MediaItem с URI, который можно использовать с MediaSession для настройки. Каждая папка верхнего уровня (AM/FM/Programs) представляет собой MediaItem с идентификатором mediaId, который можно использовать с MediaSession для запуска воспроизведения и выбор которого осуществляется на усмотрение OEM-производителя. Например, «Воспроизвести FM», «Воспроизвести AM» и «Воспроизвести радио» — это неспецифические радиозапросы, которые используют mediaId для отправки в приложение OEM-радио. Приложение радио должно определить, что воспроизводить, на основе общего запроса и mediaId.

Медиасессия

Поскольку не существует концепции приостановки транслируемого потока, действия «Воспроизведение», «Пауза» и «Стоп» не всегда применимы к радио. В случае радио действие «Стоп» связано с отключением звука, а действие «Воспроизведение» связано с отключением звука.

Некоторые радиотюнеры (или приложения) предоставляют возможность имитировать паузу трансляции, кэшируя контент и затем воспроизводя его позже. В таких случаях используйте onPause .

Воспроизведение с помощью действий mediaId и URI предназначено для настройки на станцию, полученную из интерфейса MediaBrowser. MediaId — это произвольная строка, предоставляемая приложением радио, чтобы задать уникальное (поэтому заданный идентификатор указывает только на один элемент) и стабильное (поэтому данный элемент имеет один и тот же идентификатор на протяжении всего сеанса) значение, с помощью которого можно идентифицировать данную станцию. . URI будет иметь четко определенную схему. Короче говоря, URI-образная форма ProgramSelector. Хотя это сохраняет атрибут уникальности, он не обязательно должен быть стабильным, хотя он может меняться, когда станция переходит на другую частоту.

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

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

Переход к следующей или предыдущей станции зависит от текущего контекста:

  • Когда приложение настроено на станцию ​​из списка «Избранное», оно может перейти к следующей станции из списка «Избранное».
  • Прослушивание станции из списка программ может привести к настройке на следующую доступную станцию, отсортированную по номеру канала.
  • Прослушивание произвольного канала может привести к настройке на следующий физический канал, даже при отсутствии широковещательного сигнала.

Приложение радио обрабатывает эти действия.

Обработка ошибок

Действия TransportControls (Воспроизвести, Остановить и Далее) не предоставляют информацию о том, удалось ли действие или нет. Единственный способ указать на ошибку — установить для состояния MediaSession значение STATE_ERROR с сообщением об ошибке.

Радиоприложение должно обрабатывать эти действия и либо выполнять их, либо устанавливать состояние ошибки. Если выполнение команды Play не является немедленным, состояние воспроизведения должно быть изменено на STATE_CONNECTING (в случае прямой настройки) или STATE_SKIPPING_TO_PREVIOUS или NEXT во время выполнения команды.

Клиент должен наблюдать за PlaybackState и проверять, изменила ли сессия текущую программу на ту, что была запрошена, или ввела в состояние ошибки. STATE_CONNECTING не должно превышать 30 с. Однако прямая настройка на заданную частоту AM/FM должна работать намного быстрее.

Добавляйте и удаляйте избранное

MediaSession имеет поддержку рейтингов, которую можно использовать для управления избранным. onSetRating вызываемый с рейтингом типа RATING_HEART добавляет или удаляет настроенную в данный момент станцию ​​в список избранного или из него.

В отличие от устаревших предустановок, эта модель предполагает неупорядоченный и неограниченный список избранного, когда каждому сохраненному избранному соответствует числовой слот (обычно от 1 до 6). В результате системы на основе предустановок будут несовместимы с операцией onSetRating .

Ограничением API MediaSession является то, что можно добавить или удалить только станцию, на которую настроена в данный момент. Например, элементы необходимо сначала выбрать, прежде чем их можно будет удалить. Это всего лишь ограничение клиента MediaBrowser, например сопутствующего приложения. Приложение «Радио» аналогичным образом не ограничено. Эта часть является необязательной, если приложение не поддерживает Избранное.

Медиабраузер

Чтобы указать, какие частоты или названия физических каналов (когда настройка на произвольный канал подходит для данной радиотехнологии) действительны для данного региона, все допустимые каналы (частоты) перечислены для каждого диапазона. В регионе США это составляет 101 канал FM в диапазоне от 87,8 до 108,0 МГц (с интервалом 0,2 МГц) и 117 каналов AM в диапазоне от 530 до 1700 кГц (с интервалом 10 кГц). Поскольку HD-радио использует одно и то же пространство каналов, оно не представлено отдельно.

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

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

Для идентификации папок верхнего уровня применяется тот же механизм, что и в Bluetooth. То есть пакет Extras объекта MediaDescription содержит поле, специфичное для тюнера, так же, как Bluetooth с EXTRA_BT_FOLDER_TYPE . В случае радиовещания это приводит к определению следующих новых полей в общедоступном API:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE" . Одно из следующих значений:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1 . Доступные на данный момент программы.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 . Избранное.
    • BCRADIO_FOLDER_TYPE_BAND = 3 . Все физические каналы для данного диапазона.

    Нет необходимости определять какие-либо пользовательские поля метаданных, специфичные для радио, поскольку все соответствующие данные вписываются в существующую схему MediaBrowser.MediaItem :

    • Название программы (RDS PS, имя службы DAB). MediaDescription.getTitle .
    • FM-частота. URI (см. ProgramSelector ) или MediaDescription.getTitle (если запись находится в папке BROADCASTRADIO_FOLDER_TYPE_BAND ).
    • Радиоспецифичные идентификаторы (RDS PI, DAB SId). MediaDescription.getMediaUri анализируется в ProgramSelector.

    Как правило, нет необходимости выбирать частоту FM для записи в текущей программе или списке избранного (поскольку клиент должен работать с идентификаторами мультимедиа). Однако, если такая необходимость возникнет (например, для целей отображения), она присутствует в URI и может быть проанализирована с помощью ProgramSelector . Тем не менее, не рекомендуется использовать URI для выбора элементов в текущем сеансе. Подробности см. в разделе ProgramSelector .

    Чтобы избежать проблем с производительностью или связующими, служба MediaBrowser должна поддерживать нумерацию страниц:

    Примечание. По умолчанию нумерация страниц реализована в варианте onLoadChildren() без обработки параметров.

    Связанные записи из всех типов списков (необработанные каналы, найденные программы и избранное) могут иметь разные идентификаторы mediaId (это зависит от приложения радио; в библиотеке поддержки они будут разными). URI (в форме ProgramSelector) различаются между необработанными каналами и найденными программами в большинстве случаев (за исключением FM без RDS), но в основном одинаковы между найденными и избранными программами (за исключением, например, случаев обновления AF).

    Наличие разных mediaId для записей из разных типов списков позволяет выполнять над ними разные действия. Вы можете просмотреть либо список «Избранное», либо список «Все программы» в onSkipToNext , в зависимости от папки недавно выбранного MediaItem (см. MediaSession ).

    Специальные действия по настройке

    Список программ позволяет пользователям настраиваться на определенную станцию, но не позволяет пользователям делать общие запросы, такие как «Настроиться на FM», что может привести к настройке на недавно прослушанную станцию ​​в диапазоне FM.

    Для поддержки таких действий в некоторых каталогах верхнего уровня установлен флаг FLAG_PLAYABLE (наряду с FLAG_BROWSABLE для папок).

    Действие Настраивается на Как выдать
    Включить радио Любой радиоканал startService(ACTION_PLAY_BROADCASTRADIO)

    ИЛИ,

    playFromMediaId(MediaBrowser. getRoot() )
    Воспроизвести FM Любой FM-канал Воспроизведение с mediaId FM-диапазона.

    Выбор программы для настройки зависит от приложения. Обычно это последний настроенный канал из данного списка. Подробную информацию о ACTION_PLAY_BROADCASTRADIO см. в разделе «Общие игровые намерения» .

    Обнаружение и подключение услуги

    PackageManager может напрямую найти MediaBrowserService, обслуживающий дерево радиовещания. Для этого resolveService с намерением ACTION_PLAY_BROADCASTRADIO (см. Общие намерения воспроизведения ) и флагом MATCH_SYSTEM_ONLY . Чтобы найти все службы, обслуживающие радио (их может быть несколько; например, отдельные AM/FM и спутниковые), используйте queryIntentServices .

    Разрешенная служба также обрабатывает намерение привязки android.media.browse.MediaBrowserService . Это подтверждено GTS.

    Чтобы подключиться к выбранному MediaBrowserService, создайте экземпляр MediaBrowser для данного компонента службы и connect . После установления соединения дескриптор MediaSession можно получить с помощью getSessionToken .

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

    Если приложение для конкретного источника (например, приложение радио) установлено на устройстве без такой поддержки источника, оно все равно будет рекламировать себя как обрабатывающее намерение ACTION_PLAY_BROADCASTRADIO , но его дерево MediaBrowser не будет содержать теги, специфичные для радио. Таким образом, клиент, желающий проверить, доступен ли данный источник на устройстве, должен:

    1. Откройте для себя службу радио ( resolveService для ACTION_PLAY_BROADCASTRADIO ).
    2. Создайте MediaBrowser и затем подключитесь к нему.
    3. Определите наличие MediaItem с доп. EXTRA_BCRADIO_FOLDER_TYPE .

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

    Названия групп

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

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

    • AM
    • FM
    • DAB

    Если группы нет в этом списке, тег имени группы устанавливать не следует. Однако если группа есть в списке, для нее должен быть установлен тег. Радио HD не выделяет отдельные диапазоны, поскольку использует ту же среду, что и AM/FM.

    Общие цели игры

    Каждое приложение, предназначенное для воспроизведения определенного источника (например, радио или компакт-диска), должно обрабатывать общее намерение воспроизведения , чтобы начать воспроизведение некоторого контента, возможно, из неактивного состояния (например, после загрузки). Выбор контента для воспроизведения зависит от приложения, но обычно это недавно воспроизведенная радиопрограмма или дорожка компакт-диска. Для каждого источника звука определяется отдельное намерение:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD : CD-DA или CD-текст
    • android.car.intent.action.PLAY_DATADISC : оптический диск с данными, такой как CD/DVD, но не CD-DA (может быть компакт-диск смешанного режима)
    • android.car.intent.action.PLAY_AUX : без указания порта AUX.
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB : без указания какого USB-устройства
    • android.car.intent.action.PLAY_LOCAL : локальное хранилище мультимедиа (встроенная флэш-память)

    Интенты были выбраны для использования в качестве команды общего воспроизведения, поскольку они решают сразу две задачи: саму команду общего воспроизведения и обнаружение сервиса. Дополнительным преимуществом такого намерения будет возможность выполнить такое простое действие без открытия сеанса MediaBrowser.

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

    Чтобы упростить реализацию некоторых клиентов, существует альтернативный способ выдачи такой команды Play (которая также должна быть реализована радиоприложением): выдача playFromMediaId с rootId корневого узла (используется как mediaId). Хотя корневой узел не предназначен для воспроизведения, его rootId представляет собой произвольную строку, которую можно использовать как mediaId. Однако клиенты не обязаны понимать этот нюанс.

    Селектор программ

    Хотя mediaId достаточно для выбора канала из MediaBrowserService , он становится привязанным к сеансу и не согласован между поставщиками. В некоторых случаях клиенту может потребоваться абсолютный указатель (например, абсолютная частота), чтобы поддерживать его между сеансами и устройствами.

    В эпоху цифрового радиовещания одной частоты недостаточно для настройки на конкретную станцию. Поэтому используйте ProgramSelector для настройки на аналоговый или цифровой канал. ProgramSelector состоит из двух частей:

    • Первичный идентификатор. Уникальный и стабильный идентификатор данной радиостанции, который не меняется, но может оказаться недостаточным для настройки на эту станцию. Например, код RDS PI, который можно преобразовать в позывной в США.
    • Вторичные идентификаторы. Дополнительные идентификаторы, полезные для настройки на эту станцию ​​(например, частота), возможно, включая идентификаторы других радиотехнологий. Например, станция DAB может иметь резервный вариант аналогового вещания.

    Чтобы включить ProgramSelector в решение на основе MediaBrowser или MediaSession , определите схему URI для ее сериализации. Схема определяется следующим образом:

    broadcastradio://program/<primary ID type>/<primary ID>?
    <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>

    В этом примере часть вторичных идентификаторов (после вопросительного знака ( ? )) является необязательной и может быть удалена, чтобы предоставить стабильный идентификатор для использования в качестве mediaId . Например:

    • broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=88500&AMFM_FREQUENCY=103300
    • broadcastradio://program/AMFM_FREQUENCY/102100
    • broadcastradio://program/DAB_SID_EXT/14895264?RDS_PI=1234

    Авторитетная часть (также известная как хост) program предоставляет некоторые возможности для расширения схемы в будущем. Строки типа идентификатора точно указаны как их имена в определении IdentifierType HAL 2.x, а формат значения представляет собой десятичное или шестнадцатеричное (с префиксом 0x ) число.

    Все идентификаторы, специфичные для поставщика, представлены префиксом VENDOR_ . Например, VENDOR_0 для VENDOR_START и VENDOR_1 для VENDOR_START плюс 1. Такие URI относятся к радиооборудованию, на котором они были созданы, и не могут передаваться между устройствами, изготовленными разными OEM-производителями.

    Эти URI должны быть назначены каждому MediaItem в радио-папках верхнего уровня. Кроме того, MediaSession должен поддерживать как playFromMediaId , так и playFromUri . Однако URI в первую очередь предназначен для извлечения радиометаданных (например, частоты FM) и постоянного хранения. Нет никакой гарантии, что URI будет доступен для всех элементов мультимедиа (например, если основной тип идентификатора еще не поддерживается платформой). С другой стороны, Media ID работает всегда. Клиентам не рекомендуется использовать URI для выбора элементов из текущего сеанса MediaBrowser. Вместо этого используйте playFromMediaId . Тем не менее, это не является обязательным для обслуживающего приложения, и отсутствующие URI зарезервированы для вполне обоснованных случаев.

    В первоначальном проекте вместо последовательности :// после части схемы использовалось одно двоеточие. Однако первый вариант не поддерживается android.net.Uri для абсолютных иерархических ссылок URI.

    Другие типы источников

    С другими источниками звука можно обращаться аналогичным образом. Например, дополнительный вход и проигрыватель Audio CD.

    Одно приложение может обслуживать несколько типов источников. В таких случаях рекомендуется создать отдельный MediaBrowserService для каждого типа источника. Даже в конфигурации с несколькими обслуживаемыми источниками/MediaBrowserServices настоятельно рекомендуется иметь один MediaSession в одном приложении.

    Аудио компакт-диск

    Аналогично Audio CD в том, что приложение, обслуживающее такие диски, предоставляет MediaBrowser одну доступную для просмотра запись (или несколько, если в системе есть CD-чейнджер), которая, в свою очередь, будет содержать все треки данного компакт-диска. Если у системы нет знаний о треках на каждом компакт-диске (например, когда все диски вставлены в картридж сразу и она не читает их все), то MediaItem для всего диска будет просто PLAYABLE , а не BROWSABLE плюс PLAYABLE . Если в данном слоте нет диска, элемент не будет ни PLAYABLE , ни BROWSABLE (но каждый слот всегда должен присутствовать в дереве).

    Древовидная структура аудио компакт-диска
    Рисунок 3. Древовидная структура аудио компакт-диска.

    Эти записи будут помечены так же, как и папки радиовещания; они будут содержать дополнительные поля, определенные в API MediaDescription:

    • EXTRA_CD_TRACK : для каждого MediaItem на аудио компакт-диске номер дорожки начинается с 1.
    • EXTRA_CD_DISK : номер диска, отсчитываемый от 1.

    Для системы с поддержкой CD-Text и совместимого диска MediaItem верхнего уровня будет иметь название диска. Аналогично, MediaItems для треков будет иметь название трека.

    Дополнительный вход

    Приложение, которое обслуживает вспомогательный ввод, предоставляет дерево MediaBrowser с одной записью (или несколькими, если существует несколько портов), представляющей входной порт AUX. Соответствующий MediaSession принимает свой mediaId и переключается на этот источник после получения запроса playFromMediaId .

    Древовидная структура AUX
    Рисунок 4. Древовидная структура AUX.

    Каждая запись AUX MediaItem будет иметь дополнительное поле EXTRA_AUX_PORT_NAME в котором будет указано нелокализованное имя порта без фразы «AUX». Например, для «AUX 1» должно быть установлено значение «1», для «AUX front» — «front», а для «AUX» — пустая строка. В неанглийских локалях тег имени останется той же английской строкой. Вряд ли, как и для EXTRA_BCRADIO_BAND_NAME_EN , значения определяются OEM-производителем и не ограничены заранее определенным списком.

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

    Дополнительные поля

    Определите следующие поля:

    • EXTRA_CD_TRACK = "android.media.extra.CD_TRACK"
    • EXTRA_CD_DISK = "android.media.extra.CD_DISK"
    • EXTRA_AUX_PORT_NAME = "android.media.extra.AUX_PORT_NAME"

    Клиенту необходимо просмотреть MediaItems верхнего уровня на наличие элементов, имеющих набор дополнительных полей EXTRA_CD_DISK или EXTRA_AUX_PORT_NAME .

    Подробные примеры

    Следующие примеры относятся к древовидной структуре MediaBrowser для типов источников, которые являются частью этого проекта.

    Радиовещание MediaBrowserService (обрабатывает ACTION_PLAY_BROADCASTRADIO ):

    • Станции (доступны для просмотра) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • BBC One (воспроизводимый) URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (воспроизводимый) URI: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (воспроизводимый) URI: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (воспроизводимый) URI: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90,5 FM (воспроизводимо) - FM без RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 AM (воспроизводимый) URI: broadcastradio://program/AMFM_FREQUENCY/620
      • BBC One (воспроизводимый) URI: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Избранное (просматриваемое, воспроизводимое) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • BBC One (воспроизводимый) URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (не воспроизводится) URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (доступно для просмотра, воспроизведения): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (воспроизводимый) URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (воспроизводимый) URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 AM (воспроизводимый) URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (доступно для просмотра, воспроизведения): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 FM (воспроизводимый) URI: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 FM (воспроизводимый) URI: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 FM (воспроизводимый) URI: broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (воспроизводимый): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Audio CD MediaBrowserService (обрабатывает ACTION_PLAY_AUDIOCD ):

    • Диск 1 (воспроизводимый) EXTRA_CD_DISK=1
    • Диск 2 (доступен для просмотра, воспроизведения) EXTRA_CD_DISK=2
      • Трек 1 (воспроизводимый) EXTRA_CD_TRACK=1
      • Трек 2 (воспроизводимый) EXTRA_CD_TRACK=2
    • Мой музыкальный компакт-диск (доступен для просмотра и воспроизведения) EXTRA_CD_DISK=3
      • Все сам (воспроизводимо) EXTRA_CD_TRACK=1
      • Рейзе, Рейзе (играбельно) EXTRA_CD_TRACK=2
    • Пустой слот 4 (не воспроизводится) EXTRA_CD_DISK=4

    AUX MediaBrowserService (обрабатывает ACTION_PLAY_AUX ):

    • Передний AUX (воспроизводимый) EXTRA_AUX_PORT_NAME="front"
    • Задний AUX (воспроизводимый) EXTRA_AUX_PORT_NAME="rear"