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

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

Обзор разработки

Для добавления поддержки Android Automotive OS требуется всего несколько шагов, как описано в следующих разделах:

  1. Включите автомобильные функции в Android Studio .
  2. Создайте автомобильный модуль .
  3. Обновите зависимости Gradle .
  4. При необходимости выполните настройки и действия по входу .
  5. При необходимости прочтите подсказки медиа-хоста .

Рекомендации по проектированию

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

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

Настройте свой проект

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

Включить автомобильные функции в Android Studio

Используйте Android Studio 4.0 или более поздней версии, чтобы убедиться, что все функции автомобильной ОС включены.

Создать автомобильный модуль

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

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

  1. В Android Studio нажмите «Файл» > «Создать» > «Новый модуль» .
  2. Выберите «Автомобильный модуль» , затем нажмите «Далее» .
  3. Введите имя приложения/библиотеки . Это имя, которое пользователи видят для вашего приложения в ОС Android Automotive.
  4. Введите имя модуля .
  5. Настройте имя пакета в соответствии с вашим приложением.
  6. Выберите API 28: Android 9.0 (Pie) для минимального SDK и нажмите «Далее» .

    Все автомобили, поддерживающие ОС Android Automotive, работают на Android 9 (уровень API 28) или выше, поэтому выбор этого значения предназначен для всех совместимых автомобилей.

  7. Выберите «Нет активности» , а затем нажмите « Готово» .

После создания модуля в Android Studio откройте AndroidManifest.xml в новом автомобильном модуле:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

</manifest>

Элемент application содержит некоторую стандартную информацию о приложении, а также элемент uses-feature , который заявляет о поддержке Android Automotive OS. Обратите внимание, что в манифесте не объявлено никаких действий.

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

После добавления каких-либо настроек или действий входа в систему заполните файл манифеста, установив атрибут android:appCategory="audio" в элементе application и добавив следующие элементы uses-feature :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:appCategory="audio"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

    <uses-feature
        android:name="android.hardware.wifi"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.portrait"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.landscape"
        android:required="false" />

</manifest>

Явная установка для этих функций значения required="false" гарантирует, что ваше приложение не будет конфликтовать с доступными аппаратными функциями на устройствах с автомобильной ОС.

Объявить поддержку мультимедиа для Android Automotive OS

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

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

Эта запись манифеста относится к XML-файлу, в котором объявляются автомобильные возможности, поддерживаемые вашим приложением.

Чтобы указать, что у вас есть мультимедийное приложение, добавьте XML-файл с именем automotive_app_desc.xml в каталог res/xml/ вашего проекта. Включите в этот файл следующее содержимое:

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

Фильтры намерений

Android Automotive OS использует явные намерения для запуска действий в вашем мультимедийном приложении. Не включайте в файл манифеста действия, имеющие фильтры намерений CATEGORY_LAUNCHER или ACTION_MAIN .

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

<activity android:name=".MyActivity">
    <intent-filter>
        <!-- You can't use either of these intents for Android Automotive OS -->
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <!--
        In their place, you can include other intent filters for any activities
        that your app needs for Android Automotive OS, such as settings or
        sign-in activities.
        -->
    </intent-filter>
</activity>

Обновите зависимости Gradle

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

my-auto-module /build.gradle

классный

buildscript {
    ...
    dependencies {
        ...
        implementation project(':shared_module_name')
    }
}

Котлин

buildscript {
    ...
    dependencies {
        ...
        implementation(project(":shared_module_name"))
    }
}

Реализация настроек и действий по входу в систему

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

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

Рабочие процессы действий

На следующей схеме показано, как пользователь взаимодействует с вашими настройками и действиями по входу в систему с помощью Android Automotive OS:

Рабочие процессы для настроек и действий входа в систему

Рисунок 1. Рабочие процессы настроек и действий при входе в систему.

Не допускайте отвлекающих факторов в настройках и действиях при входе в систему.

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

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

Добавить действие настройки

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

Объявить действие настройки

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

<application>
    ...
    <activity android:name=".AppSettingsActivity"
              android:exported="true"
              android:theme="@style/SettingsActivity"
              android:label="@string/app_settings_activity_title">
        <intent-filter>
            <action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
        </intent-filter>
    </activity>
    ...
</application>

Реализуйте свою деятельность по настройке

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

В оставшейся части этого раздела показано, как можно адаптировать код из примера приложения Universal Android Music Player (UAMP) для реализации действия настройки для вашего приложения.

Для начала загрузите пример кода:

# Clone the UAMP repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

Для реализации своей деятельности выполните следующие действия:

  1. Скопируйте папку automotive/automotive-lib в свой автомобильный модуль.
  2. Определите дерево предпочтений, как в automotive/src/main/res/xml/preferences.xml .
  3. Реализуйте PreferenceFragmentCompat , который будет отображаться в ваших настройках. Дополнительные сведения см. в файлах SettingsFragment.kt и SettingsActivity.kt в UAMP и в руководстве по настройкам Android .

При реализации настроек примите во внимание следующие рекомендации по использованию некоторых компонентов библиотеки предпочтений:

  • Имейте не более двух уровней глубины ниже основного представления в настройках.
  • Не используйте DropDownPreference . Вместо этого используйте ListPreference .
  • Организационные компоненты:
    • PreferenceScreen
      • Это должен быть верхний уровень вашего дерева предпочтений.
    • PreferenceCategory
      • Используется для группировки объектов Preference .
      • Включите title .
  • Включите key и title во все следующие компоненты. Вы также можете включить summary , icon или и то, и другое:
    • Preference
      • Настройте логику обратного вызова onPreferenceTreeClick() вашей реализации PreferenceFragmentCompat .
    • CheckBoxPreference
      • Может иметь summaryOn или summaryOff вместо summary для условного текста.
    • SwitchPreference
      • Может иметь summaryOn или summaryOff вместо summary для условного текста.
      • Может иметь switchTextOn или switchTextOff .
    • SeekBarPreference
      • Включите min , max и defaultValue .
    • EditTextPreference
      • Включите dialogTitle , positiveButtonText и negativeButtonText .
      • Может иметь dialogMessage и/или dialogLayoutResource .
    • com.example.android.uamp.automotive.lib.ListPreference
      • В основном происходит от ListPreference .
      • Используется для отображения списка объектов Preference с одним выбором.
      • Должен иметь массив entries и соответствующие им entryValues .
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • В основном происходит от MultiSelectListPreference
      • Используется для отображения списка объектов Preference с множественным выбором.
      • Должен иметь массив entries и соответствующие им entryValues .

Добавить действие входа

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

Требовать вход в систему при запуске приложения

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

  1. В методе onLoadChildren() вашего сервиса отправьте null результат с помощью метода sendResult() .
  2. Установите для PlaybackStateCompat медиа-сеанса значение STATE_ERROR с помощью метода setState() . Это сообщает Android Automotive OS, что никакие другие операции не могут быть выполнены, пока ошибка не будет устранена.
  3. Установите для кода ошибки PlaybackStateCompat сеанса мультимедиа значение ERROR_CODE_AUTHENTICATION_EXPIRED . Это сообщает Android Automotive OS, что пользователю необходимо пройти аутентификацию.
  4. Установите сообщение об ошибке PlaybackStateCompat сеанса мультимедиа, используя метод setErrorMessage() . Поскольку это сообщение об ошибке предназначено для пользователя, локализуйте его для текущего языкового стандарта пользователя.
  5. Установите дополнительные параметры PlaybackStateCompat медиа-сеанса с помощью метода setExtras() . Включите следующие два ключа:

    • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL : строка, отображаемая на кнопке, которая начинает рабочий процесс входа. Поскольку эта строка предназначена для пользователя, локализуйте ее для текущего языкового стандарта пользователя.
    • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT : PendingIntent , который направляет пользователя к вашему действию входа в систему, когда пользователь нажимает кнопку, на которую указывает PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL .

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

Котлин

import androidx.media.utils.MediaConstants

val signInIntent = Intent(this, SignInActivity::class.java)
val signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0)
val extras = Bundle().apply {
    putString(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
        "Sign in"
    )
    putParcelable(
        MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
        signInActivityPendingIntent
    )
}

val playbackState = PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
        .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
        )
        .setExtras(extras)
        .build()
mediaSession.setPlaybackState(playbackState)

Ява

import androidx.media.utils.MediaConstants;

Intent signInIntent = new Intent(this, SignInActivity.class);
PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
    signInIntent, 0);
Bundle extras = new Bundle();
extras.putString(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL,
    "Sign in");
extras.putParcelable(
    MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT,
    signInActivityPendingIntent);

PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder()
    .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f)
    .setErrorMessage(
            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED,
            "Authentication required"
    )
    .setExtras(extras)
    .build();
mediaSession.setPlaybackState(playbackState);

После успешной аутентификации пользователя установите PlaybackStateCompat обратно в состояние, отличное от STATE_ERROR , а затем верните пользователя в Android Automotive OS, вызвав метод finish() действия.

Реализуйте свою активность входа в систему

Google предлагает различные инструменты идентификации , которые вы можете использовать, чтобы помочь пользователям войти в ваше приложение в своих автомобилях. Некоторые инструменты, такие как Firebase Authentication, предоставляют полнофункциональные наборы инструментов, которые могут помочь вам создать индивидуальный процесс аутентификации. Другие инструменты используют существующие учетные данные пользователя или другие технологии, чтобы помочь вам обеспечить удобство входа в систему для пользователей.

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

  • Вход и регистрация в одно касание: если вы уже внедрили One Tap для других устройств, например для приложения для телефона, внедрите его в приложение Android Automotive OS для поддержки существующих пользователей One Tap.
  • Вход в Google: если вы уже внедрили вход в Google для других устройств, например в приложении для телефона, внедрите вход в Google для приложения Android Automotive OS, чтобы поддержать существующих пользователей, входящих в систему Google.
  • Автозаполнение с помощью Google: если пользователи выбрали автозаполнение с помощью Google на других своих устройствах Android, их учетные данные сохраняются в диспетчере паролей Google . Когда эти пользователи входят в ваше приложение Android Automotive OS, автозаполнение с помощью Google предлагает соответствующие сохраненные учетные данные. Использование автозаполнения с Google не требует усилий по разработке приложений. Однако разработчики приложений могут оптимизировать свои приложения для достижения более качественных результатов . Автозаполнение с помощью Google поддерживается всеми устройствами под управлением Android 8.0 (уровень API 26) или более поздних версий, включая ОС Android Automotive.

Используйте Менеджер учетных записей

Приложения Android Automotive OS, имеющие аутентификацию, должны использовать AccountManager по следующим причинам:

  • Улучшенный пользовательский интерфейс и простота управления учетными записями: пользователи могут легко управлять всеми своими учетными записями из меню учетных записей в настройках системы, включая вход и выход.
  • «Гостевой» опыт: автомобили являются общими устройствами, а это означает, что OEM-производители могут включить «гостевой» опыт в автомобиле, где учетные записи не могут быть добавлены. Это ограничение достигается с помощью DISALLOW_MODIFY_ACCOUNTS для AccountManager .

Разрешения

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

Прочтите подсказки медиа-ведущего

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

Обработка ошибок

Об ошибках в мультимедийных приложениях в ОС Android Automotive сообщается через PlaybackStateCompat сеанса мультимедиа. Для всех ошибок задайте соответствующий код ошибки и сообщение об ошибке в PlaybackStateCompat . Это приведет к появлению Toast в пользовательском интерфейсе.

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

При возникновении нефатальной ошибки сохраните остальную часть PlaybackStateCompat как есть, кроме кода ошибки и сообщения об ошибке. Использование этого подхода позволяет продолжить воспроизведение текущего элемента мультимедиа, пока пользователь решает, входить ли в систему.

Если воспроизведение невозможно, например, при отсутствии подключения к Интернету и автономном контенте, установите для состояния PlaybackStateCompat значение STATE_ERROR .

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

Если в какой-то момент вам не удается загрузить дерево просмотра (например, если вам требуется проверка подлинности, а пользователь не вошел в систему), отправьте пустое дерево просмотра. Чтобы обозначить это, верните нулевой результат из onLoadChildren() для корневого медиаузла. Когда это происходит, система отображает полноэкранную ошибку с сообщением об ошибке, установленным в PlaybackStateCompat .

Действенные ошибки

Если ошибка требует действий, дополнительно установите следующие две дополнительные функции в PlaybackStateCompat :

  • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL : метка для кнопки, которую нужно нажать, чтобы устранить ошибку. Поскольку эта строка предназначена для пользователя, локализуйте ее для текущего языкового стандарта пользователя.
  • PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT : PendingIntent , который кнопка запускает для устранения ошибки, например, путем запуска действия входа в систему.

Ошибки, требующие действий, отображаются в виде Dialog и могут быть устранены пользователями только после остановки автомобиля.

Тестирование случаев ошибок

Убедитесь, что ваше приложение корректно обрабатывает ошибки во всех сценариях, включая:

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

Другие соображения

При разработке приложения для Android Automotive OS учитывайте следующие соображения:

Офлайн-контент

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

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

  • Лучшее время для загрузки контента — во время использования вашего приложения.
  • Не предполагайте, что Wi-Fi доступен. Автомобиль может никогда не попасть в зону действия Wi-Fi, или OEM-производитель может отключить Wi-Fi в пользу сотовой сети.
  • Хотя разумное кэширование содержимого, которое ожидают использовать пользователи, вполне допустимо, мы рекомендуем вам разрешить пользователю изменять это поведение с помощью настроек.
  • Дисковое пространство в автомобилях различается, поэтому дайте пользователям возможность удалять офлайн-контент, например, с помощью опции в ваших настройках.

Поддержка веб-представления

WebViews поддерживаются в ОС Android Automotive, но разрешены только для ваших настроек и действий при входе в систему. Действия, использующие WebView, должны иметь возможность «закрыть» или «обратно» за пределами WebView.

Вот несколько примеров приемлемых вариантов использования WebViews:

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

При использовании WebView вы можете включить Javascript .

Защитите свой WebView

Примите все возможные меры предосторожности, чтобы гарантировать, что ваш WebView не станет точкой входа в Интернет. В следующем фрагменте кода приведен пример того, как привязать WebView к URL-адресу, используемому в вызове loadUrl() и предотвратить перенаправления. Мы настоятельно рекомендуем вам применять подобные меры безопасности, когда это возможно, например, при отображении ссылок юридического характера.

Котлин

override fun shouldOverrideUrlLoading(webView: WebView,
                             webResourceRequest: WebResourceRequest): Boolean {
  val originalUri: Uri = Uri.parse(webView.originalUrl)
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.url)) {
    return false
  }
  if (webResourceRequest.isRedirect) {
    logger.w("Redirect detected, not following")
    return true
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url)
  logger.w(
    String.format(
      "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri))
  return true
}

Ява

@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) {
  Uri originalUri = Uri.parse(webView.getOriginalUrl());
  // Check for allowed URLs
  if (originalUri.equals(Uri.parse(BLANK_URL))
      || originalUri.equals(webResourceRequest.getUrl())) {
    return false;
  }
  if (webResourceRequest.isRedirect()) {
    logger.w("Redirect detected, not following");
    return true;
  }
  setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl());
  logger.w(
      String.format(
          "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri));
  return true;
}

Имена пакетов

Поскольку вы распространяете отдельный пакет Android Package Kit (APK) для Android Automotive OS, вы можете повторно использовать имя пакета из своего мобильного приложения или создать новое имя пакета. Если вы используете другое имя пакета, ваше приложение будет иметь два отдельных списка в Play Store. Если вы повторно используете текущее имя пакета, ваше приложение будет иметь один список на обеих платформах.

Это преимущественно деловое решение. Например, если у вас есть одна команда, работающая над мобильным приложением, и другая команда, работающая над вашим приложением для Android Automotive OS, то, возможно, имеет смысл иметь отдельные имена пакетов и позволить каждой команде управлять своим собственным списком в Play Store. Нет большой разницы в технических усилиях, необходимых для использования любого подхода.

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

Особенность То же имя пакета Новое имя пакета
Список магазинов Одинокий Несколько
Зеркальная установка Да: «быстрая переустановка приложения» во время мастера установки. Нет
Процесс проверки Play Store Блокировка отзывов: если проверка одного APK не пройдена, другие APK, представленные в той же версии, блокируются. Индивидуальные отзывы
Статистика, показатели и важные показатели Комбинированный: вы можете фильтровать данные, специфичные для автомобилей. Отдельный
Индексирование и рейтинг в поиске Развивайте текущее положение Нет переноса
Интеграция с другими приложениями Скорее всего, никаких изменений не потребуется, если предположить, что медиакод используется обоими APK. Возможно, придется обновить соответствующее приложение, например, для воспроизведения URI с помощью Google Assistant.

Часто задаваемые вопросы

В следующих разделах приведены ответы на некоторые часто задаваемые вопросы об ОС Android Automotive.

Аппаратное обеспечение

Может ли мое приложение получить доступ к микрофону?

Информацию о приложениях, предназначенных для Android 10 (уровень API 29) или выше, см. в документации по совместному использованию аудиовхода . Это невозможно до уровня API 29.

К каким автомобильным API мы можем получить доступ и как?

Вы ограничены API-интерфейсами, предоставляемыми OEM-производителем. Разрабатываются процессы для стандартизации доступа к этим API.

Приложения могут получать доступ к автомобильным API с помощью SetProperty() и GetProperty() в CarPropertyManager . Обратитесь к исходному коду или справочной документации, чтобы просмотреть список всех доступных свойств. Если свойство помечено @SystemApi , оно ограничено предварительно загруженными системными приложениями.

Какие типы аудиокодеков поддерживаются?

Подробную информацию об аудиокодеке см. на компакт-диске Android.

Поддерживается ли Widevine DRM?

Да. Поддерживается Widevine DRM .

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

Существуют ли какие-либо ограничения или рекомендации по использованию сторонних SDK и библиотек?

У нас нет каких-либо конкретных рекомендаций по использованию сторонних SDK и библиотек. Если вы решите использовать сторонние SDK и библиотеки, вы по-прежнему несете ответственность за соблюдение всех требований к качеству автомобильных приложений.

Могу ли я использовать службу переднего плана?

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

Публикация приложений Android Automotive OS

Как опубликовать приложение Android Automotive OS с помощью консоли Google Play?

Подробную информацию о том, как опубликовать приложение Android Automotive OS с помощью консоли Google Play, см. в разделе Распространение на автомобили .

Дополнительные ресурсы

Дополнительные сведения об ОС Android Automotive см. в следующих дополнительных ресурсах.

Образцы

Путеводители

Блоги

Видео

Сообщить о проблеме с носителем Android Automotive OS

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

Создать новую задачу

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