Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Cómo agregar compatibilidad con el SO Android Automotive a tu app de música

El SO Android Automotive permite a los usuarios instalar apps en el automóvil. Para llegar a los usuarios en esta plataforma, debes distribuir una app optimizada para conductores que sea compatible con el SO Android Automotive. Puedes reutilizar casi todo el código y los recursos de la app de Android Auto, pero debes crear una compilación independiente que cumpla con los requisitos de esta página.

Descripción general del desarrollo

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

  1. Habilita las funciones automotrices en Android Studio
  2. Crea un módulo automotor
  3. Actualiza tus dependencias de Gradle
  4. Agrega actividades de configuración o acceso (opcional)

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

Te recomendamos usar Android Studio 3.6 Beta 1 o una versión posterior para compilar y probar tu app en el SO Android Automotive. Todas las funciones del SO Android Automotive ya están habilitadas de forma predeterminada en Android Studio 3.6.

Si prefieres usar Android Studio 3.5, sigue estos pasos para habilitar las funciones del SO Android Automotive:

  1. Asegúrate de que el archivo studioFlags.xml exista en una de las siguientes ubicaciones, según tu sistema operativo:

    • Windows: %USERPROFILE%\.AndroidStudio3.5\config\options
    • macOS: ~/Library/Preferences/AndroidStudio3.5/options
    • Linux: ~/.AndroidStudio3.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 automotor

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 automotor 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. Selecciona Add No Activity y haz clic en Finish.

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

<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 implementas actividades de acceso o configuración, agrégalas aquí. 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.

Filtros de intents

El SO Android Automotive usa intents explícitos para activar actividades en tu app de música. El archivo de manifiesto no debe contener ninguna actividad que tenga filtros de intents CATEGORY_LAUNCHER o ACTION_MAIN.

Las actividades como la que se muestra en el siguiente ejemplo suelen orientarse a un teléfono o a otro dispositivo móvil. Estas actividades deben declararse en el módulo que compila la app para teléfonos, no en el que compila tu app del SO Android Automotive.

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

Actualiza tus dependencias de Gradle

Te recomendamos mantener el servicio de exploración multimedia en un módulo separado compartido entre la app para teléfonos y el módulo automotor. Si usas este enfoque, debes actualizar el módulo automotor para incluir el módulo compartido, 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

Además del servicio de exploración multimedia, también puedes proporcionar actividades de configuración y acceso optimizadas 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.

Solo debes implementar estas actividades si la app del SO Android Automotive necesita permitir a los usuarios acceder o especificar ajustes de configuración de la app. Android Auto no usa estas actividades.

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. Recuerda que esta actividad solo se activa cuando una app ejecuta el SO Android Automotive. Las apps de teléfono conectadas a Android Auto no la usan.

Flujos de trabajo de la actividad de configuración

La actividad de configuración puede proporcionar al usuario diferentes flujos de trabajo. En el siguiente diagrama, 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: Flujos de trabajo de la 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, como un ícono. El usuario puede presionar o seleccionar esta prestación en 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. Recuerda que esta actividad solo se activa cuando una app ejecuta el SO Android Automotive. Las apps de teléfono conectadas a Android Auto no la usan.

Flujo de trabajo de la actividad de acceso

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

Flujos de trabajo para una actividad de acceso

Figura 2: Flujos de trabajo de la actividad de acceso

Solicita el acceso cuando se inicie la app

Si quieres que un usuario tenga que acceder antes de poder usar tu app, el servicio de navegador multimedia, debe completar las siguientes acciones:

  1. En el método onLoadChildren() de tu servicio, envía un resultado nulo mediante el método sendResult().
  2. Configura el PlaybackState de la sesión multimedia en STATE_ERROR mediante el método setState(). De este modo, se indica al SO Android Automotive que no se podrán llevar a cabo otras operaciones hasta que se resuelva el error.
  3. Establece el código de error de 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.
  4. Establece el mensaje de error de PlaybackState de la sesión multimedia mediante 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.
  5. Configura los extras de PlaybackState de la sesión multimedia mediante 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 varias 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 ayudarte a crear experiencias de acceso sin problemas para los usuarios.

Te recomendamos las siguientes herramientas como ayuda con el fin de crear 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 a fin de admitir los usuarios existentes del 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. Entonces, cuando acceden 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 hacer 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 sugerir que el usuario se autentique mediante la ejecución de un error recuperable. Cuando se usa un error recuperable, el sistema muestra el mensaje al usuario sin interrumpir la reproducción del elemento multimedia actual. Para implementar el control de errores recuperables, completa los siguientes pasos:

  1. Establece el errorCode del 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 es recuperable.
  3. Configura los extras de PlaybackState de la sesión multimedia mediante 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. Mantén el estado de 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á.