Добавьте поддержку 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 ваше приложение должно содержать определенные записи в манифесте. После того, как вы дадите согласие на распространение на устройства с ОС Android Automotive, Google Play проверит совместимые приложения, чтобы убедиться в их безопасности для использования в автомобиле. Подробнее см. раздел «Распространение на автомобили» .

Необходимые функции операционной системы Android Automotive.

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

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

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

Соответствует требованиям по снижению отвлечения внимания водителя.

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

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

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

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

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

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

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

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

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

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

Прислушивайтесь к ограничениям, влияющим на пользовательский опыт.

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

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

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

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

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

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

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

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

Протестируйте свою реализацию.

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

  1. Установите приложение на образ системы без магазина Google Play или режима совместимости.
  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 позволяет производителям автомобилей контролировать, могут ли приложения отображать или скрывать системные панели для входа и выхода из иммерсивного режима . Например, запрещая приложениям скрывать системные панели, производители могут гарантировать, что элементы управления автомобилем, такие как климат-контроль, всегда будут доступны на экране. Если производитель запретил приложениям управлять системными панелями, ничего не произойдет, когда приложение вызовет API WindowInsetsController (или WindowInsetsControllerCompat ) для отображения или скрытия системных панелей. Обратитесь к документации по show и hide , чтобы узнать больше о том, как определить, может ли ваше приложение изменять отступы.

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

<!-- 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 для автомобилей» .

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

val 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 OS. Например, если вы используете ресурсы Dimension для хранения значений отступов, вы можете использовать большее значение для набора ресурсов car , чтобы увеличить размеры сенсорных областей.