Внедрение радио

Реализация управления радио основана на MediaSession и MediaBrowse , которые позволяют приложениям Media и Voice Assistant управлять радио. Дополнительные сведения см. в разделе Создание мультимедийных приложений для автомобилей на сайте 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 . (Un)mute воспроизведение радио.
  • 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
Рисунок 1. Древовидная структура 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 .
    • частота ФМ. 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 . Это проверено ГТС.

    Чтобы подключиться к выбранному 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
    • SXM

    Если группы нет в этом списке, тег имени группы не следует устанавливать. Однако, если бэнд есть в списке, у него должен быть установлен тег. Для 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>
    

    В этом примере вторичная часть Identifiers (после вопросительного знака ( ? )) является необязательной и может быть удалена, чтобы предоставить стабильный идентификатор для использования в качестве 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.

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

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

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

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

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

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

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

    • EXTRA_CD_TRACK : для каждого MediaItem на Audio CD, номер дорожки на основе 1.
    • EXTRA_CD_DISK : номер диска на основе 1.

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

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

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

    Древовидная структура AUX
    Рисунок 3. Древовидная структура 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"

    Клиенту необходимо просмотреть элементы MediaItem верхнего уровня на наличие элементов, для которых установлено дополнительное поле 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 без RDS
        URI: broadcastradio://program/AMFM_FREQUENCY/90500
      • 6:20 (играбельно)
        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_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 5:30 (играбельно)
        URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 (играбельно)
        URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550:00 (играбельно)
        URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (доступный для просмотра, воспроизводимый)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_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
    • ДАБ (играбельно)
      EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BAND
      EXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Аудио 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"