Системные компоненты и пользовательские потоки

На следующей диаграмме показаны компоненты, взаимодействующие с Media.

Системные компоненты

Рисунок 1. Компоненты системы

Элементы на этом рисунке описаны ниже:

Составная часть Описание
Домашний экран Представляет другие поверхности в пользовательском интерфейсе автомобиля, которые отображают и управляют воспроизводимым в данный момент мультимедиа. В AOSP это главный экран, отображаемый при запуске системы. На этом экране пользователи могут просматривать сведения о воспроизводимом мультимедийном элементе и выполнять ограниченный набор стандартных и настраиваемых действий (например, «Воспроизведение» и «Пауза»).
Системный интерфейс Предоставляет функциональные возможности, включающие глобальные параметры навигации пользовательского интерфейса, такие как переход к мультимедиа.
Ассистенты Android предоставляет механизмы для взаимодействия различных приложений голосового помощника с системой. Эти приложения могут взаимодействовать с источниками мультимедиа в фоновом режиме (например, воспроизводить песню в результате голосовой команды) или переходить к источникам мультимедиа на переднем плане (например, когда приложению голосового помощника предписывается отображать пользовательский интерфейс конкретный медиа-источник).
Средство запуска приложений Все приложения Android запускаются в панели запуска приложений, включая источники мультимедиа. Медиа может представить свой собственный селектор источника мультимедиа, дополняя или заменяя средство запуска приложений в качестве начального места для мультимедиа.
Google Play магазин Когда используется GAS, именно здесь пользователи находят и устанавливают новые приложения на устройстве Android. Что касается мультимедиа, то после установки приложений пользователи перенаправляются на мультимедиа, чтобы завершить процесс входа или начать взаимодействие с приложением.
Диспетчер медиасессий Системный сервис Android, который отслеживает и контролирует сеансы мультимедиа из всех источников мультимедиа. Он предоставляет механизмы для обнаружения того, когда источник мультимедиа становится источником мультимедиа переднего плана . Мультимедиа и все другие приложения, отображающие воспроизводимый в данный момент источник мультимедиа (например, главный экран), используют диспетчер сеансов мультимедиа для обнаружения этих событий и соответствующего обновления пользовательского интерфейса. Медиа-источники взаимодействуют с Media Session Manager посредством Media Session API .
Радио Специализированное приложение для взаимодействия с радиоаппаратурой. Радио ищет радиостанции, быстро выбирая недавно обнаруженные станции и переключаясь между радиодиапазонами. Компоненты пользовательского интерфейса, используемые как Radio, так и Media, позволяют пользователю переключаться между двумя функциями.
Двигатель отвлечения внимания водителя Системный сервис Android, используемый для наложения ограничений UX в зависимости от состояния вождения автомобиля. Для входа в медиа-источники и настройки UX (где экран управляется непосредственно медиа-источниками) эта служба гарантирует, что небезопасный контент не будет отображаться, когда автомобиль находится в состоянии вождения. OEM-производители могут настроить определение этих состояний и то, как система реагирует в этих ситуациях (например, отображая блокирующий экран).

Потоки пользователей

Запуск медиа-приложения

Ниже показан процесс запуска Media.

Запуск медиа-приложения

Рис. 2. Запуск медиа-приложения

Носитель должен быть запущен с использованием следующего неявного CAR_INTENT_ACTION_MEDIA_TEMPLATE . Это намерение может иметь следующую информацию в качестве дополнений :

  • android.car.intent.extra.MEDIA_COMPONENT ( необязательно ). Дополнительная строка, представляющая сведенное имя компонента MediaBrowserService в мультимедийном приложении, к которому должен подключаться мультимедиа. Если не указано, Media отображает текущее выбранное мультимедийное приложение. Это намерение используется из следующих точек входа:

    • Системный интерфейс. Используется для возврата к работе с мультимедиа или для начала его использования в первый раз. В этом случае вышеупомянутый Intent будет использоваться без каких-либо дополнений, чтобы заставить Media отображать текущее выбранное мультимедийное приложение.

    • Главный экран, помощники и центр уведомлений. Пользователи могут перейти к разделу «Медиа», чтобы отобразить выбранное в данный момент мультимедийное приложение. Во всех случаях срабатывает неявный Intent без дополнений.

    • Средство запуска приложений. Когда пользователи выбирают мультимедийное приложение из панели запуска приложений, указанное выше намерение включает дополнительный элемент CAR_EXTRA_MEDIA_COMPONENT , который содержит выбранное мультимедийное приложение. Media определяет это как новое выбранное приложение и подключается к нему. Дополнительные сведения см. в разделе ниже «Интеграция средства запуска приложений с мультимедиа».

Средство запуска приложений для интеграции с медиа

Медиа-приложениям не разрешается предоставлять какие-либо действия, аннотированные категорией android.intent.category.LAUNCHER . В результате средство запуска приложений (или его эквивалент) должно реализовывать специальную логику для интеграции источников мультимедиа:

  • Средство запуска приложений должно сканировать систему на наличие пакетов, реализующих MediaBrowserService.SERVICE_INTERFACE . Для этих пакетов Средство запуска приложений получает значок службы, аналогичный тому, который используется для получения других действий.

  • Затем средство запуска приложений объединяет эти пакеты с теми, которые реализуют действия android.intent.category.LAUNCHER . Если приложение предоставляет реализацию MediaBrowserService и действие средства запуска, служба имеет приоритет.

    На момент написания этой статьи ни одно приложение-источник мультимедиа не может обеспечить активность запуска.

  • Пример этой логики можно найти в коде AOSP в AppLauncherUtils#getAllLauncherApps() .

Процедура входа в систему и параметры конфигурации

Мультимедийные приложения могут включать в себя действие настроек, оптимизированное для автомобиля. Такое действие можно использовать для реализации пользовательских потоков, не рассматриваемых API-интерфейсами Android Media, например:

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

Входной поток

Рисунок 3. Процесс входа в систему

Это действие настроек объявляется мультимедийным приложением со следующим фильтром намерений.

<activity android:name=".AppSettingsActivity"
          android:exported="true
          android:theme="@style/SettingsActivity"
           android:label="@string/app_settings_activity_title">
   <intent-filter>
       <action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
   </intent-filter>
</activity>

СМИ должны реализовать следующую логику:

  • Убедитесь, что текущее выбранное мультимедийное приложение включает действие с заданным фильтром намерений.

  • Если это так, разрешите пользователю перейти к действию.

  • Если действуют ограничения Car UX (например, автомобиль движется), эту возможность следует отключить, поскольку действие настроек не является пользовательским интерфейсом, оптимизированным для драйверов.

Обработка ошибок и обязательный вход

Мультимедиа взаимодействует с мультимедийными приложениями через Android Media Session API. В рамках этого API Media получает объект PlaybackState , который сообщает о текущем состоянии мультимедийного приложения.

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

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

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

Рисунок 4. Обработка ошибок

В рамках обычной обработки ошибок PlaybackState Media должен проверить следующие входные данные.

  • Код ошибки PlaybackState равен PlaybackStateCompat#ERROR_CODE_AUTHENTICATION_EXPIRED . Это будет означать, что мультимедийному приложению требуется вход для продолжения работы. Могут быть получены другие коды ошибок, которые будут указывать на другие типы ошибочных ситуаций.

  • Сообщение об ошибке PlaybackState (установленное мультимедийными приложениями с помощью метода PlaybackStateCompat.Builder#setErrorMessage ) будет содержать удобочитаемое объяснение (например, «Вы не вошли в систему»). Это сообщение должно отображаться для пользователя, и оно должно быть оптимизировано для отвлечения внимания (DO). Подробнее см. в разделе Ограничения на вождение UX.

  • Дополнительно PlaybackState может включать следующие дополнительные функции (установленные мультимедийными приложениями с помощью метода PlaybackStateCompat.Builder#setExtras ) со следующими ключами.

    • android.media.extras.ERROR_RESOLUTION_ACTION_LABEL . Задайте строку, содержащую удобочитаемое сообщение, которое будет отображаться на кнопке, которую коснулся пользователь, чтобы запустить процесс входа.

    • android.media.extras.ERROR_RESOLUTION_ACTION_INTENT . Установите PendingIntent , который будет запускаться, когда пользователь нажимает на вышеупомянутую кнопку. Этот PendingIntent указывает на пользовательское действие входа, реализованное тем же медиа-приложением.

  • Состояние PlaybackState равно STATE_ERROR . Это означает, что никакие другие операции невозможны, пока вход не будет завершен.