Как добавить поддержку 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, Google Play проверит совместимые приложения, чтобы убедиться, что они безопасны для использования в автомобиле. Подробнее о распространении приложений для автомобилей…

Обязательные функции 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 в вашем приложении выполняется действие Resumed, оно будет скрыто действием, принадлежащим ОС.

Как минимум, действие приложения переходит в приостановленное состояние жизненного цикла. Это происходит в рамках обратного вызова жизненного цикла 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) ?: 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 позволяет OEM-производителям контролировать, могут ли приложения показывать или скрывать системные строки для входа в режим погружения и выхода из него. Например, запретив приложениям скрывать системные строки, OEM-производители могут обеспечить постоянный доступ к элементам управления автомобилем, таким как климат-контроль, на экране. Если OEM-производитель запретил приложениям управлять системными строками, то при вызове API WindowInsetsController (или WindowInsetsControllerCompat) для показа или скрытия системных строк ничего не произойдет. Чтобы узнать, как определить, удалось ли приложению изменить вставки, ознакомьтесь с документацией по show и 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 WindowInsets, чтобы разместить контент приложения относительно системных строк. Подробнее о том, как использовать эти API, рассказывается в статье Как показывать контент на весь экран. Заданные в коде значения полей не рекомендуются ни для каких устройств, но в автомобилях они, скорее всего, вообще не будут работать для удержания контента в безопасной зоне.

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

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

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

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

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

LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT и LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES оптимизированы для вырезов на экранах мобильных устройств, поэтому не используйте их для Android Automotive OS. Вместо него необходимо использовать 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 или оно вообще не подключено к автомобилю.

Чтобы использовать режим "Картинка в картинке", следуйте рекомендациям. Они помогут вам проверить, доступна ли эта функция, и правильно отреагировать на результат.

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

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

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

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

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

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