Как добавить поддержку Android Automotive OS в приложение, которое можно использовать, когда автомобиль припаркован

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

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

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

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

Как настроить файл манифеста приложения

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

Обязательные функции Android Automotive OS

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

Записи в манифесте для определенных категорий

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

Как соблюдать требования в отношении отвлекающих факторов

При разработке приложений для автомобилей очень важно, чтобы они не отвлекали водителя. Для приложений, которые используются в припаркованном автомобиле, это достигается в основном за счет запрета на использование приложения или воспроизведение аудио, когда действуют ограничения на удобство использования, как указано в рекомендациях по обеспечению качества 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) ?: 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 для автомобилей…

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

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

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

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

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

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

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

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

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

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