Добавьте поддержку Android Automotive OS в ваше припаркованное приложение

При распространении вашего приложения на устройства Android Automotive OS есть некоторые соображения, уникальные для форм-фактора, о которых вам следует знать. В этом руководстве объясняются эти соображения.

Протестируйте свое существующее приложение на эмуляторе Android Automotive OS

Чтобы начать создавать приложение для Android Automotive OS, сначала протестируйте существующее приложение на эмуляторе Android Automotive OS. Чтобы настроить эмулятор, следуйте инструкциям в разделе Тестирование с использованием эмулятора Android Automotive OS . Затем вы можете запустить приложение, следуя инструкциям в разделе Запустите приложение на эмуляторе .

При запуске приложения следите за проблемами совместимости, такими как:

  • Информационно-развлекательные экраны имеют фиксированную ориентацию. Чтобы соответствовать рекомендациям по качеству автомобильных приложений , приложения должны поддерживать как портретную, так и альбомную ориентацию.
  • API, доступные на других устройствах, могут быть недоступны на Android Automotive OS. Например, некоторые API сервисов Google Play недоступны на Android Automotive OS. Подробнее о том, как решать эти проблемы, читайте в разделе Отключение функций .

Настройте файл манифеста вашего приложения

Чтобы нацелиться на устройства Android Automotive OS, ваше приложение должно иметь определенные записи манифеста. После того, как вы согласились на распространение на устройства Android Automotive OS, совместимые приложения проходят ручную проверку, чтобы убедиться, что они безопасны для использования в автомобиле. Подробнее см. в разделе Распространение на автомобили .

Необходимые функции Android Automotive OS

Все приложения, созданные для Android Automotive OS, должны соответствовать определенным требованиям для распространения с помощью Google Play. Для получения дополнительной информации см. раздел Соответствие требованиям Google Play .

Записи манифеста, специфичные для категории

Помимо предыдущих требований, которые применяются ко всем припаркованным приложениям, категории видео и игр имеют дополнительные требования:

Соблюдайте требования по отвлечению внимания водителя

При внедрении приложения в автомобили важно избегать отвлечения внимания водителя. Для припаркованных приложений это достигается в первую очередь путем предотвращения использования приложения или воспроизведения звука во время действия ограничений пользовательского опыта (UX) , как указано в рекомендациях по качеству DD-2 и DD-3 .

Запретить использование, пока действуют ограничения пользовательского опыта

По умолчанию действия не могут быть использованы или запущены, пока действуют ограничения UX. Чтобы гарантировать, что это поведение применяется к вашему приложению, оно не должно включать следующий элемент <meta-data> в любой элемент <activity> в вашем манифесте:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

Если действие в вашем приложении возобновляется при активации ограничений UX, оно перекрывается действием, принадлежащим ОС.

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

На устройствах, поддерживающих режим совместимости с Android Automotive OS , системная блокировка приводит к тому, что действия вашего приложения переходят из состояния «Приостановлено » в состояние «Остановлено » .

Остановить воспроизведение и предотвратить его возобновление

Для некоторых приложений приостановка воспроизведения во время onPause() и отслеживание состояния для предотвращения возобновления воспроизведения до onResume() достаточны для удовлетворения требований по отвлечению внимания водителя.

Если для вашего приложения недостаточно реагирования на обратные вызовы жизненного цикла, вы можете прослушивать состояние ограничений UX напрямую, как описано в следующем разделе. Например, приложения, поддерживающие «картинка в картинке», могут предпочесть прослушивание напрямую, а не условные проверки в обратных вызовах жизненного цикла.

Ознакомьтесь с ограничениями пользовательского опыта

Чтобы прослушать ограничения UX, сначала добавьте зависимость от библиотеки android.car в файл build.gradle вашего модуля приложения. Это расширение для Android SDK, которое предоставляет API, специфичные для Android Automotive OS.

android {
    ...
    useLibrary("android.car")
}

Используйте CarUxRestrictionsManager для чтения состояния ограничения UX. Не пытайтесь определить состояние ограничения UX из другого состояния оборудования, такого как передача или скорость, поскольку ограничения UX могут различаться от дисплея к дисплею в пределах транспортного средства.

val car = Car.createCar(context)
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as CarUxRestrictionsManager

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions -> ...}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

Единственное значение, предоставляемое CarUxRestrictions , на которое должно ссылаться ваше приложение, — это возвращаемое значение isRequiresDistractionOptimization() . Другие значения актуальны только для действий, которые отмечены как оптимизированные для отвлечения внимания.

Проверьте свою реализацию

Проверьте, соответствует ли ваше приложение требованиям по отвлечению внимания водителя, выполнив следующую процедуру:

  1. Установите приложение на образ системы без Google Play Store или режима совместимости.
  2. Открыв сетку приложений запуска, смоделируйте вождение и убедитесь, что ваше приложение не открывается.
  3. Прекратите имитировать вождение, откройте приложение на экране воспроизведения и начните воспроизведение.
  4. Снова смоделируйте вождение и убедитесь, что воспроизведение приостанавливается.
    1. Если ваше приложение поддерживает интеграцию с MediaSession , используйте adb shell cmd media_session dispatch play и убедитесь, что воспроизведение не возобновляется.

Оптимизируйте свое приложение для Android Automotive OS

Чтобы обеспечить пользователям наилучшие впечатления от вождения автомобиля, при создании приложения для Android Automotive OS учитывайте следующее:

Работа с оконными вставками и вырезами в витринах

Как и в случае с другими форм-факторами, Android Automotive OS включает в себя элементы пользовательского интерфейса системы, такие как строки состояния и навигации, а также поддержку непрямоугольных дисплеев.

По умолчанию приложения рисуют в области, которая не перекрывается системными панелями или вырезами дисплея. Однако вы можете захотеть, чтобы ваше приложение скрывало системные панели, рисовало содержимое за ними или отображало содержимое в вырезе дисплея, как описано в разделе Размещение вашего приложения в оконных вставках . Если ваше приложение делает что-либо из этого, обратитесь к следующим подразделам для получения подробной информации о том, как обеспечить хорошую работу вашего приложения в экосистеме устройств Android Automotive OS.

Системные панели, режим погружения и рендеринг от края до края

Системные панели в автомобилях могут иметь другой размер и расположение, чем в других форм-факторах. Например, панели навигации могут располагаться слева, справа или внизу экрана. Даже в случае, если строка состояния находится сверху, а панель навигации — снизу (как в большинстве телефонов и планшетов), размер этих элементов в автомобилях, скорее всего, будет намного больше.

Кроме того, Android Automotive OS позволяет OEM-производителям контролировать, могут ли приложения показывать или скрывать системные панели для входа и выхода из режима погружения . Например, запрещая приложениям скрывать системные панели, OEM-производители могут гарантировать, что элементы управления транспортным средством, такие как климат-контроль, всегда будут доступны на экране. Если OEM-производитель запретил приложениям управлять системными панелями, ничего не произойдет, когда приложение вызовет API WindowInsetsController (или WindowInsetsControllerCompat ) для отображения или скрытия системных панелей. Подробнее о том, как определить, смогло ли ваше приложение изменить вставки, см. в документации по show and hide

Аналогично, OEM-производители также могут контролировать, могут ли приложения устанавливать цвет и прозрачность системных панелей, чтобы гарантировать, что панели и содержащиеся в них элементы всегда будут четко видны. Если ваше приложение рисует от края до края, проверьте, что только некритический контент рисуется за системными панелями. Этот контент может быть не виден, если OEM-производитель устройства запрещает устанавливать цвет или прозрачность панелей.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

Если ваше приложение занимает всю площадь экрана, не делайте предположений о размере, количестве, типе или расположении системных панелей. Вместо этого используйте API вставок окон, чтобы расположить содержимое вашего приложения относительно системных панелей. Подробнее об использовании этих API см. в разделе Отображение содержимого в приложении от края до края . Жестко закодированные значения отступов никогда не рекомендуются для любого форм-фактора, но в автомобилях они, скорее всего, не будут работать для удержания содержимого в безопасной области.

Адаптация к дисплеям неправильной формы

Помимо прямоугольных дисплеев, некоторые транспортные средства могут иметь экраны неправильной формы, например, показанные на рисунке 1 :

Схема устройства Android Automotive OS с дисплеем, изогнутым с правой стороны.
Рисунок 1 : Устройство Android Automotive OS с дисплеем, изогнутым с правой стороны. Зеленая область — это безопасный прямоугольник, который не перекрывается ограничивающей рамкой выреза дисплея кривой.

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

Если ваше приложение отображает от края до края, вы можете выбрать, как оно должно себя вести относительно вырезов дисплея. Вы можете сделать это с помощью ресурсов, установив атрибут android:windowLayoutInDisplayCutoutMode для темы вашего приложения или во время выполнения, изменив атрибут layoutInDisplayCutoutMode окна.

Поскольку типы вырезов дисплея, присутствующие на устройствах Android Automotive OS, отличаются от типов вырезов на мобильных устройствах, не используйте LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT или LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES , поведение которых оптимизировано для вырезов, имеющихся на мобильных устройствах. Вместо этого используйте LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER или LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS , чтобы всегда избегать или всегда вводить вырез. При выборе последнего см. Поддержка вырезов дисплея для получения более подробной информации об API, связанных с вырезами дисплея.

Если ваше приложение отображается в области выреза на дисплее и вы хотите, чтобы поведение Android Automotive OS и мобильных устройств отличалось, см. раздел Отключение функций для получения инструкций, если ваше приложение устанавливает такое поведение во время выполнения, и раздел Использование альтернативных ресурсов, если ваше приложение устанавливает такое поведение с помощью файлов ресурсов.

Отключить функции

Если вы делаете существующее мобильное приложение доступным на Android Automotive OS, некоторые функции и возможности могут быть неактуальны или недоступны. Например, автомобили, как правило, не предоставляют доступ к камерам. Кроме того, на Android Automotive OS доступны только некоторые службы Google Play; см. Службы Google Play для автомобилей для получения более подробной информации.

Вы можете использовать API PackageManager.hasSystemFeature , чтобы определить, работает ли приложение на Android Automotive OS, проверив наличие функции FEATURE_AUTOMOTIVE , как показано в следующем примере:

Котлин

val packageManager: PackageManager = ... // Get a PackageManager from a Context
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Ява

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

В качестве альтернативы, если в вашем приложении также есть компонент Android Auto, вы можете использовать API CarConnection из библиотеки приложений Android for Cars, чтобы определить, работает ли приложение на Android Automotive OS или Android Auto, или оно вообще не подключено к автомобилю.

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

Обработка офлайн-сценариев

В то время как автомобили все чаще подключаются к Интернету, рекомендуется использовать приложения, обеспечивающие работу без подключения к Интернету, например, в следующих случаях:

  • Пользователи могут отказаться от мобильных данных, предлагаемых в рамках пакета подписки от автопроизводителя.
  • В некоторых регионах доступ к мобильным данным может быть ограничен.
  • Автомобили с радиоприемниками Wi-Fi могут находиться вне зоны действия Wi-Fi, или производитель оборудования может отключить Wi-Fi в пользу мобильной сети.

Будьте готовы справиться с этими сценариями в вашем приложении, изящно снижая функциональность, зависящую от доступа в Интернет, например, предлагая офлайн-контент. Для получения дополнительной информации см. лучшие практики по оптимизации работы в сети .

Используйте альтернативные ресурсы

Чтобы адаптировать приложение для автомобилей, вы можете использовать квалификатор ресурса car для предоставления альтернативных ресурсов при работе на автомобиле с ОС Android Automotive. Например, если вы используете ресурсы Dimension для хранения значений отступов, вы можете использовать большее значение для набора ресурсов car , чтобы сделать цели касания больше.