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

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

Компоненты системы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Затем App Launcher объединяет эти пакеты с пакетами, реализующими действия 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>

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

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

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

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

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

Медиа взаимодействует с мультимедийными приложениями через 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).

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

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

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

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