Технические сведения

В этом разделе представлены технические подробности, относящиеся к справочному приложению «Центр управления».

Центр управления — это отдельное, привилегированное, системно подписанное приложение, для работы которого требуется минимальная версия SDK 35 (Android V (уровень API 35)). Приложение устанавливается в папку system/priv-app для использования System APIs . Для чтения информации о мультимедиа приложение должно быть подписано платформой. Вы можете обновить приложение по беспроводной сети (OTA).

Фоновая служба

Приложение «Центр управления» использует фоновую службу для своей работы. Control Center Service запускается user-post-unlocked в жизненном цикле пользователя с помощью Vendor ServiceController . Центр управления всегда должен быть активен и взаимодействовать в фоновом режиме — приложение не может полагаться на то, что оно будет открыто пользователем.

Control Center Service подключается и взаимодействует с другими экземплярами своей службы в других зонах пользователей, используя API связи . Ознакомление с руководством по интеграции необходимо для понимания того, как экземпляры Control Center на каждом пользователе устанавливают соединения, отправляют и получают данные.

Диаграмма, иллюстрирующая запуск службы Центра управления контроллером сервисов поставщика.
Рисунок 5. Служба центра управления, запущенная контроллером службы поставщика.

Коммуникация

После установления соединения Control Center Service взаимодействует с объектами protobuf , передающими информацию. Для передачи protobuf в другую зону пассажира с помощью Communication APIs protobuf преобразуется в byte array , создается payload object , и Payload отправляется через CarOccupantConnectionManager#sendPayload .

message ControlCenterPayload {
    required Type messageType = 1;
    // ...
    enum Type {
       MEDIA_STATUS = 0;
       MEDIA_COMMAND = 1;
       INPUT_LOCK_COMMAND = 2;
       INPUT_LOCK_SUCCESSFUL = 3;
       CANCEL_AUDIO_REQUEST = 4;
       MIRRORING_REQUEST_RECEIVER_DECISION = 5;
       MIRRORING_SESSION_ENDED = 6;
    }
}

private fun parsePayload(
    senderZone: OccupantZoneInfo,
    payload: Payload
) {
     val parsedPayload =
         ControlCenterPayload.parseFrom(payload.bytes)
             when (parsedPayload.messageType) {
                 ControlCenterPayload.Type.MEDIA_STATUS -> {
                     // logic here
                 }
             }
             //…
}

Данные

Информация о зонах нахождения людей в помещении хранится в Центре управления в виде объектов OccupantZoneData . Изменения в локальных объектах OccupantZoneData передаются другим экземплярам Центра управления через Comms API .

После обработки полученной Payload , проанализированные данные передаются в локальный OccupantZoneStateRepository , который, в свою очередь, уведомляет представления об изменении. Большая часть данных передается между классами с помощью Kotlin flows on Android .

Обработка запросов на звуковое сопровождение через бортовые динамики.

Чтобы водитель всегда мог получать запросы от пассажиров на воспроизведение аудио через салонные динамики , при создании запроса Control Center Service водителя регистрирует событие Primary ZoneMedia Audio RequestCallback .

Обратный вызов получает уведомление о вызовах CarAudioManager#requestMediaAudioOnPrimaryZone . Control Center Service водителя обрабатывает запросы, создавая предупреждающее уведомление (HUN), которое можно принять или отклонить с помощью CarAudioManager#allowMediaAudioOnPrimaryZone(boolean) .

Смотрите видео на других экранах одновременно.

Совместный просмотр работает благодаря Task Mirroring APIs в CarActivityManager . TaskMirroringManager сначала ищет пакет воспроизводимого приложения MediaSession в CarActivityManager#getVisibleTasks , затем создает VirtualDisplay и перемещает видимую задачу на этот дисплей с помощью CarActivityManager#moveRootTaskToDisplay .

Эта функция возвращает токен IBinder , который MirroredSurfaceView может использовать в макете для отображения задачи через MirroredSurfaceView#mirrorSurface . Объект Communication API Payload передает токен другим зонам пользователей.

Каждый экземпляр Центра управления в этих зонах пользователей запускает Mirroring activity и использует этот токен для заполнения MirroredSurfaceView .

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

API для зеркального отображения задач

Центр управления использует следующие API для зеркального отображения задач:

CarActivityManager#getVisibleTasks(int displayId)
Для отображения информации об отправителе был вызван метод <ActivityManager.RunningTaskInfo> .

CarActivityManager#moveRootTaskToDisplay(int virtualDisplayId)
Перемещает выбранную видимую задачу на созданный виртуальный экран.

CarActivityManager#createTaskMirroringToken(int taskId)
Создает задачу для зеркального отображения токена IBinder и должна вызываться после перемещения задачи на виртуальный экран.

MirroredSurfaceView#mirrorSurface(IBinder token)
Пользовательский объект представления, использующий токен для отображения содержимого виртуального дисплея.

Ограничения зеркального отображения задач в Центре управления

Центр управления поддерживает зеркальное отображение задач только для приложений MediaSession . Однако API может зеркально отображать любую задачу. Виртуальный экран создается с учетом размеров экрана отправителя. Если экран получателя использует другое разрешение и размеры, виртуальный экран отображается в центре экрана.

Поверхностно видимые задачи

Центр управления расширяет интерфейс Theme.CarUi.NoToolbar , превращая его в полупрозрачное окно. Это означает, что при открытии Центра управления поверх задачи, задача возвращается в CarActivityManager#getVisibleTasks , что позволяет зеркально отобразить задачу.

Получение информации о зеркалировании

Центр управления уведомляет другие приложения о сеансах зеркалирования. Для получения обновлений приложения должны подключиться к Control Center Service и отправить в качестве клиента класс Handler , который получает и обрабатывает Messages от Control Center Service .

Клиентские приложения могут получить имя пакета зеркального приложения и запустить intent URI для действия в Центре управления, где размещено зеркальное приложение, используя следующие ключи:

  • _config_msg_mirroring_pkg_name_key_
  • _config_msg_mirroring_redirect_uri_key_

Эти конфигурационные файлы должны присутствовать как в ресурсах клиентского приложения, так и в ресурсах Центра управления.

Клиентские приложения получают информацию о зеркальном отображении из Центра управления.
Рисунок 7. Получение информации о зеркалировании из Центра управления.

Центр управления отладкой

Класс Logger обрабатывает журналы Центра управления, и его можно настроить для принудительной записи в журналы.

class Logger(cls: Class<*>) {

   companion object {
       private const val FORCE_LOGS = false
   }

   private val tag: String

   init {
       tag = cls.simpleName
   }

   fun v(message: String) {
       if (Log.isLoggable(tag, Log.VERBOSE) || FORCE_LOGS) {
           Log.v(tag, message)
       }
   }
...

Системное приложение и возможность обновления

Поскольку Control Center — это системное приложение, и его работа подписывается только с помощью цифровой подписи, поэтому его необходимо предварительно установить на устройство, и обновить его можно только по воздуху (OTA), аналогично приложению Car Media .

Соберите Центр управления из исходного кода.

Чтобы получить исходный код Центра управления, см. раздел «Интеграция несвязанных приложений» .

Конфиденциальность пользователей при использовании нескольких дисплеев

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