В этом разделе представлены технические подробности, относящиеся к справочному приложению «Центр управления».
Центр управления — это отдельное, привилегированное, системно подписанное приложение, для работы которого требуется минимальная версия 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 на каждом пользователе устанавливают соединения, отправляют и получают данные.

Коммуникация
После установления соединения 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 .

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_
Эти конфигурационные файлы должны присутствовать как в ресурсах клиентского приложения, так и в ресурсах Центра управления.

Центр управления отладкой
Класс 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 рекомендует делать это на системном уровне, при входе в систему на дисплее.