Únete a ⁠ #Android11: The Beta Launch Show el 3 de junio.

Agrega compatibilidad con el SO Android Automotive a tu proyecto de Android Auto

Si ya tienes una app multimedia que funciona con Android Auto, puedes agregar compatibilidad con el SO Android Automotive en unos pocos pasos. El SO Android Automotive permite a los usuarios instalar apps independientes en el sistema de infoentretenimiento del vehículo. Para abarcar los usuarios que tienen un automóvil con SO Android Automotive, debes crear una app independiente optimizada para conductores independiente de la app para teléfonos.

El SO Android Automotive conecta tu app con el mismo servicio de exploración multimedia que usa la app del teléfono para conectarse a Android Auto.

Descripción general del desarrollo

Agregar compatibilidad con el SO Android Automotive es simple y solo requiere unos pocos pasos:

  1. Crea un módulo automotriz.
  2. Examina tu archivo de manifiesto.
  3. Actualiza tus dependencias de Gradle.
  4. (Opcional) Agrega actividades de configuración o acceso.

Consideraciones del diseño

El SO Android Automotive se encarga de diseñar el contenido multimedia que recibes del servicio de exploración multimedia de tu app. Al igual que con Android Auto, esto significa que tu app no diseña la IU y no inicia ninguna de las actividades cuando un usuario activa la reproducción de contenido multimedia.

Sin embargo, si estás implementando actividades de configuración o acceso, estas actividades deben estar optimizadas para vehículos. Cuando diseñes esas áreas de la app, consulta los lineamientos de diseño para el SO Android Automotive.

Configura tu proyecto

Debes configurar varias partes diferentes del proyecto de tu app para habilitar la compatibilidad con el SO Android Automotive.

Habilita las funciones automotrices en Android Studio

Para acceder a las funciones de compilación y prueba del SO Android Automotive, debes usar Android Studio 3.5 Canary 11 o versiones posteriores.

Luego, sigue estos pasos para habilitar las funciones automotrices:

  1. Si el archivo aún no existe, crea un archivo studioFlags.xml en una de las siguientes ubicaciones, según tu sistema operativo:

    • Windows: %USERPROFILE%\.AndroidStudioPreview3.5\config\options
    • macOS: ~/Library/Preferences/AndroidStudioPreview3.5/options
    • Linux: ~/.AndroidStudioPreview3.5/config/options
  2. Agrega la siguiente entrada al archivo studioFlags.xml:

    <application>
        <component name="StudioFlags">
          <option name="data">
            <map>
              <entry key="npw.templates.automotive" value="true" />
            </map>
          </option>
        </component>
        </application>
        

Crea un módulo automotriz

Algunos componentes del SO Android Automotive, como el manifiesto, tienen requisitos específicos de la plataforma, por lo que debes crear un módulo que pueda mantener el código de estos componentes separado de otro código del proyecto, como el código utilizado para la app de teléfono. Sigue estos pasos para agregar un módulo automotriz a tu proyecto:

  1. En Android Studio, selecciona File > New > New Module.
  2. Selecciona Automotive Module y, luego, haz clic en Next.
  3. Proporciona la información de Application/Library name. Se trata del nombre que los usuarios ven para tu app en el SO Android Automotive.
  4. Proporciona un nombre de módulo en Module name.
  5. Ajusta el valor de Package name para que coincida con tu app.
  6. Selecciona API 28:Android 9.0 (Pie) para Minimum SDK y, luego, haz clic en Next.

    Todos los vehículos compatibles con el SO Android Automotive se ejecutan en Android 9 (API nivel 28) o una versión posterior. Por lo tanto, si seleccionas este valor, se apunta al 100% de los vehículos que usan el SO Android Automotive.

  7. Ya tienes un servicio de exploración multimedia para Android Auto; por lo tanto, selecciona Add No Activity y haz clic en Finish.

Examina tu archivo de manifiesto

Después de crear tu módulo en Android Studio, abre AndroidManifest.xml en tu nuevo módulo automotriz:

<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>
    

Verás información estándar de la app en el elemento <application>, pero también un elemento <uses-feature> que declara compatibilidad con el SO Android Automotive. Además, ten en cuenta que no hay actividades declaradas en el manifiesto. Si la app las necesita, puedes agregar una actividad de configuración o acceso, aunque el sistema activa esas actividades con intents explícitos, y esas son las únicas actividades que debes declarar dentro del manifiesto para tu app con SO Android Automotive.

Actualiza tus dependencias de Gradle

Te recomendamos mantener el servicio de exploración multimedia en un módulo separado compartido entre la app del teléfono y el módulo automotriz. Si usas este enfoque, debes actualizar el nuevo módulo automotriz para incluir el módulo compartido con el servicio de exploración multimedia, como se muestra en el siguiente fragmento:

my-auto-module/build.gradle

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

Implementa actividades de configuración y acceso para el SO Android Automotive

Además del servicio de exploración multimedia, también puedes proporcionar actividades de configuración y acceso optimizados para vehículos en tu app con el SO Android Automotive. Estas actividades te permiten proporcionar una funcionalidad de la app que no está incluida en las API de Android Media.

Agrega una actividad de configuración

Puedes agregar una actividad de configuración optimizada para vehículos, de modo que los usuarios puedan configurar los ajustes de la app en su vehículo. La actividad de configuración también puede proporcionar otros flujos de trabajo, como acceso o salida de la cuenta de un usuario o cambio de una cuenta de usuario a otra.

Flujos de trabajo de la actividad de configuración

Tu actividad de configuración puede proporcionar al usuario diferentes flujos de trabajo. En la siguiente imagen, se muestra cómo un usuario interactúa con la actividad de configuración en el SO Android Automotive.

Flujos de trabajo para una actividad de configuración

Figura 1: Diagrama de flujos de trabajo de una actividad de configuración

Declara una actividad de configuración

Debes declarar la actividad de configuración en el archivo de manifiesto de la app, como se muestra en el siguiente fragmento de código:

<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>
    

Implementa tu actividad de configuración

Cuando un usuario inicia tu app, el SO Android Automotive detecta la actividad de configuración que declaraste y muestra una prestación. El usuario puede presionar o seleccionar esta prestación usando la pantalla de su vehículo para navegar por la actividad. El SO Android Automotive envía el intent ACTION_APPLICATION_PREFERENCES, que le indica a la app que inicie la actividad de configuración.

Agrega una actividad de acceso

Si tu app requiere que los usuarios accedan antes de usarla, puedes agregar una actividad de acceso optimizada para vehículos que controle el acceso y la salida de tu app. También puedes agregar flujos de trabajo de acceso y salida a una actividad de configuración, pero debes usar una actividad de acceso dedicada si la app no se puede usar hasta que el usuario accede.

Flujo de trabajo de la actividad de acceso

En la siguiente imagen, se muestra cómo un usuario interactúa con la actividad de acceso usando el SO Android Automotive:

Flujos de trabajo para una actividad de acceso

Figura 2: Diagrama de flujos de trabajo para una actividad de acceso

Solicita acceso cuando se inicie la app

Para requerir que un usuario acceda mediante la actividad correspondiente antes de usar la app, debes hacer lo siguiente en tu servicio de exploración multimedia:

  1. Establece el PlaybackState de la sesión multimedia en STATE_ERROR usando el método setState(). De este modo, se indica al SO Android Automotive que no se pueden llevar a cabo otras operaciones hasta que se resuelve el error.
  2. Establece el código de error PlaybackState de la sesión multimedia en ERROR_CODE_AUTHENTICATION_EXPIRED. De este modo, se indica al SO Android Automotive que el usuario debe autenticarse.
  3. Establece el mensaje de error PlaybackState de la sesión multimedia usando el método setErrorMessage(). Como este mensaje de error se muestra al usuario, el mensaje se debe localizar según la configuración regional actual del usuario.
  4. Establece los extras de PlaybackState de la sesión multimedia con el método setExtras(). Incluye las siguientes dos claves:

    • android.media.extras.ERROR_RESOLUTION_ACTION_LABEL: Se trata de una string que se muestra en el botón que inicia el flujo de trabajo de acceso. Como esta string se muestra al usuario, se debe localizar según la configuración regional actual del usuario.
    • android.media.extras.ERROR_RESOLUTION_ACTION_INTENT: Se trata de una instancia de PendingIntent que dirige al usuario a la actividad de acceso cuando presiona el botón al que hace referencia android.media.extras.ERROR_RESOLUTION_ACTION_LABEL.

En el siguiente fragmento de código, se muestra cómo la app puede requerir el acceso del usuario antes de que pueda usarla:

Kotlin

    val signInIntent = Intent(this, SignInActivity::class.java)
    val signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
        signInIntent, 0)
    val extras = Bundle().apply {
        putString(
            "android.media.extras.ERROR_RESOLUTION_ACTION_LABEL",
            "Sign in"
        )
        putParcelable(
            "android.media.extras.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)
    

Java

    Intent signInIntent = new Intent(this, SignInActivity.class);
    PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0,
        signInIntent, 0);
    Bundle extras = new Bundle();
    extras.putString(
        "android.media.extras.ERROR_RESOLUTION_ACTION_LABEL",
        "Sign in");
    extras.putParcelable(
        "android.media.extras.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);
    

Una vez que el usuario se haya autenticado correctamente, la app deberá establecer PlaybackState de nuevo en un estado diferente de STATE_ERROR y, luego, llevar al usuario de nuevo al SO Android Automotive llamando al método finish() de la actividad.

Implementa tu actividad de acceso

Google ofrece una variedad de herramientas de identidad que puedes usar para ayudar a los usuarios a acceder a tu app en sus vehículos. Algunas herramientas, como Firebase Authentication, proporcionan herramientas de pila completa que pueden ayudar a crear experiencias de autenticación personalizadas. Otras herramientas aprovechan las credenciales existentes de los usuarios o de otras tecnologías para ayudarlo a crear experiencias de acceso sin problemas para los usuarios.

Te recomendamos las siguientes herramientas, que te ayudarán a crear una experiencia de acceso más simple para los usuarios que hayan accedido anteriormente desde otro dispositivo:

  • Acceso con Google: Si ya implementaste el acceso con Google para otros dispositivos (como la app de tu teléfono), también debes implementar el acceso con Google para tu app con SO Android Automotive con el fin de admitir los usuarios existentes de acceso con Google.
  • Autocompletar con Google: Si los usuarios optaron por Autocompletar con Google en sus otros dispositivos Android, sus credenciales se guardan en el administrador de contraseñas de Google. Luego, cuando el usuario accede a tu app con SO Android Automotive, la función Autocompletar con Google sugiere las credenciales guardadas relevantes. El uso de Autocompletar con Google no requiere ningún esfuerzo de desarrollo de aplicación; sin embargo, los desarrolladores de aplicaciones deben optimizar sus apps para obtener resultados de mejor calidad. La función Autocompletar con Google es compatible con todos los dispositivos que ejecutan Android Oreo 8.0 (API nivel 26) o posterior (incluido el SO Android Automotive).

Controla las acciones con acceso protegido

Algunas apps permiten que los usuarios realicen determinadas acciones de forma anónima, pero requieren que accedan para otras. Por ejemplo, un usuario puede reproducir música en una app sin necesidad de acceder, pero debe hacerlo para poder omitir una canción.

En este caso, cuando el usuario intenta realizar la acción restringida (omitir una canción), la app puede sugerirle que se autentique mediante la ejecución de un error no grave. Cuando se usa un error no grave, el sistema muestra el mensaje al usuario sin interrumpir la reproducción del elemento multimedia actual. Para implementar el control de errores no graves, completa los siguientes pasos:

  1. Establece el errorCode para el PlaybackState de la sesión multimedia en ERROR_CODE_AUTHENTICATION_EXPIRED. De este modo, se indica al SO Android Automotive que el usuario debe autenticarse.
  2. Mantén el state del PlaybackState de la sesión multimedia tal como está; no lo establezcas en STATE_ERROR. De este modo, se indica al sistema que el error no es grave.
  3. Establece los extras de PlaybackState de la sesión multimedia con el método setExtras(). Incluye las siguientes dos claves:

    • android.media.extras.ERROR_RESOLUTION_ACTION_LABEL: Se trata de una string que se muestra en el botón que inicia el flujo de trabajo de acceso. Como esta string se muestra al usuario, se debe localizar según la configuración regional actual del usuario.
    • android.media.extras.ERROR_RESOLUTION_ACTION_INTENT: Se trata de una instancia de PendingIntent que dirige al usuario a la actividad de acceso cuando presiona el botón al que hace referencia android.media.extras.ERROR_RESOLUTION_ACTION_LABEL.
  4. Conserva el resto del estado PlaybackState de la sesión multimedia tal como está. De este modo, se permite que la reproducción del elemento multimedia actual continúe mientras el usuario decide si accederá.

Cómo probar tu app para el SO Android Automotive

Con Android Emulator, puedes probar cómo se ejecuta la app optimizada para conductores en la pantalla de un vehículo con SO Android Automotive. En esta sección, se describe cómo configurar un dispositivo virtual de Android (AVD) para probar tu app.

Edita las configuraciones de ejecución

Las apps para SO Automotive son diferentes de otras apps para Android. El SO Android Automotive interactúa con tu app utilizando intents explícitos y tu servicio de exploración multimedia.

Para probar tu app, verifica que hayas configurado el módulo automotriz para que no inicie ninguna actividad mediante los siguientes pasos.

  1. En Android Studio, selecciona Run > Edit Configurations.

    Cuadro de diálogo Ejecutar/depurar configuraciones

  2. Selecciona el módulo automotriz desde la lista de módulos de tu app.

  3. En Launch Options > Launch, selecciona Nothing.

  4. Haz clic en Apply y, luego, haz clic en OK.

Agrega imágenes del sistema

Antes de crear AVD que coincidan con el hardware de fabricantes específicos, debes agregar imágenes del sistema para estos dispositivos mediante el SDK Manager de Android Studio. Luego, cuando crees un AVD, podrás descargar estas imágenes del sistema para usarlas con el AVD.

Sigue estos pasos si quieres agregar una imagen del sistema para Polestar 2:

  1. En Android Studio, selecciona Tools > SDK Manager.
  2. Haz clic en la pestaña SDK Update Sites.
  3. Haz clic en Add Ícono para agregar elementos.
  4. Ingresa los siguientes valores para Name y URL, y luego haz clic en OK:

    Name: Imagen del sistema Polestar 2

    URL: https://developer.polestar.com/sdk/polestar2-sys-img.xml

  5. Haz clic en Apply y, luego, en OK.

Crea un AVD de vehículo y ejecuta el emulador

Sigue estos pasos para crear un Android Virtual Device (AVD) que representa un vehículo con SO Android Automotive y luego usa ese AVD para ejecutar el emulador:

  1. En Android Studio, selecciona Tools > AVD Manager.
  2. Haz clic en Create Virtual Device.
  3. En el cuadro de diálogo Select Hardware, selecciona Automotive y, luego, selecciona un dispositivo y haz clic en Next.
  4. Selecciona una imagen del sistema destinada a Automotive, como Android 9.0 (Automotive) y, luego, haz clic en Next.
  5. Asigna el AVD y selecciona otras opciones que quieras personalizar y, luego, haz clic en Finish.
  6. En la barra de la ventana de herramientas, selecciona tu ADV de SO Android Automotive como destino de implementación.
  7. Haz clic en Run Ícono de ejecución.