Cómo compilar apps para usar en el SO Android Automotive con el vehículo estacionado

Además de admitir apps compiladas para su uso mientras conduces, el SO Android Automotive admite apps de navegadores, juegos y video para usar mientras el vehículo está estacionado. Con solo unos pequeños cambios, puedes enviar la misma app a vehículos como lo haces a otros dispositivos con pantalla grande.

Cómo probar la app existente en un emulador del SO Android Automotive

Para comenzar a compilar la app para el SO Android Automotive, primero debes probar la app existente en un emulador del SO Android Automotive. Para configurar un emulador, sigue los pasos que se indican en Cómo realizar pruebas con el emulador del SO Android Automotive. Luego, puedes seguir las instrucciones que se indican en Cómo ejecutar tu app en el emulador.

Cuando ejecutes la app, busca problemas de compatibilidad, como los siguientes:

  • Las pantallas de infoentretenimiento tienen orientaciones fijas. Para cumplir con los lineamientos de calidad de apps para automóviles, estas deben admitir las orientaciones vertical y horizontal.
  • Es posible que las APIs disponibles en otros dispositivos no estén disponibles en el SO Android Automotive. Por ejemplo, algunas APIs de los Servicios de Google Play no están disponibles en el SO Android Automotive. Consulta la sección Cómo inhabilitar funciones para obtener más detalles acerca de cómo solucionar estos problemas.

Cómo configurar los archivos de manifiesto de la app

Para orientarla al SO Android Automotive, la app debe tener ciertas entradas de manifiesto. Con ellas, las apps orientadas al SO Android Automotive se envían a Play Store a través de un tipo de versión independiente de Automotive. Se someten a un proceso de revisión manual para garantizar que sean seguras para su uso en un automóvil. Si deseas obtener más información, consulta Cómo distribuir apps para Android en vehículos.

Funciones obligatorias del SO Android Automotive

Para que se las muestre en Play Store en un vehículo, las apps compiladas para el SO Android Automotive deben incluir el siguiente elemento <uses-feature> en el archivo AndroidManifest.xml:

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

Las apps que se envían a segmentos no relacionados con vehículos no pueden declarar los elementos <uses-feature> que se indican en la muestra de código anterior, ya que no pueden depender de hardware específico de un automóvil. Por lo tanto, si quieres ofrecer la misma app para automóviles y otros tipos de dispositivos, debes generar al menos dos variantes de esta: una para dispositivos de automóviles y otra para dispositivos móviles. Si quieres obtener más información sobre cómo crear estas variantes separadas, consulta la siguiente documentación:

Las dos variantes de la app pueden compartir el mismo nombre de paquete, pero deben tener códigos de versión diferentes, ya que se subirán a secciones de Play Store por separado.

Como alternativa, en lugar de usar variantes separadas, las apps pueden usar nombres de paquetes independientes para los APKs o paquetes de aplicaciones para dispositivos móviles y automóviles. Para conocer las compensaciones de cada enfoque, consulta Nombres de paquetes en la guía para desarrolladores de apps multimedia.

Además de los elementos que se muestran en el ejemplo de código anterior, las apps compiladas para el SO Android Automotive deben incluir los siguientes elementos <uses-feature> en el elemento <manifest> raíz:

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

La configuración explícita de estas funciones como no obligatorias garantiza que la app no entre en conflicto con las funciones de hardware disponibles en dispositivos con el SO Android Automotive.

Cómo asegurarte de que no haya actividades con optimización de distracciones

Para asegurarte de que la app solo esté disponible para su uso cuando el vehículo esté estacionado, no incluyas el siguiente elemento <meta-data> en ningún elemento <activity> dentro del manifiesto:

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

Sin estos metadatos, el SO bloquea automáticamente las actividades de la app cuando el automóvil entra en modo de conducción para reducir las distracciones para el conductor. Esto sucede como una devolución de llamada de ciclo de vida onPause, durante la cual debes pausar la reproducción de video y audio de la app.

Cómo optimizar la app para el SO Android Automotive

Para brindarles a los usuarios la mejor experiencia posible, ten en cuenta lo siguiente cuando compiles tu app para el SO Android Automotive.

Optimiza tu contenido para pantallas grandes

Las pantallas de los vehículos con el SO Android Automotive son más similares en tamaño, resolución y relación de aspecto a las tablets y los dispositivos plegables que a los teléfonos. Por lo tanto, optimizar tu app para pantallas grandes también beneficia a los usuarios en vehículos.

En particular, consulta las guías Cómo brindar compatibilidad con diferentes tamaños de pantalla y Cómo migrar tu IU a diseños responsivos para obtener detalles sobre cómo aprovechar al máximo los tamaños de visualización grandes, así como las galerías de contenido multimedia y juegos para obtener inspiración y orientación sobre el diseño.

Otras optimizaciones para pantalla grande, como la compatibilidad de entrada, no son directamente beneficiosas para el SO Android Automotive, pero aún así pueden mejorar la experiencia del usuario. Por ejemplo, la navegación con teclado usa las mismas APIs que la navegación rotativa, por lo que cualquier optimización que se realice allí puede beneficiar a ambos factores de forma.

Cómo trabajar con inserciones de ventanas y cortes de pantalla

Al igual que con otros factores de forma, el SO Android Automotive incluye elementos de la IU del sistema, como barras de estado y navegación, y compatibilidad con pantallas no rectangulares.

De forma predeterminada, las apps se dibujan en un área que no se superpone con las barras del sistema ni los cortes de pantalla. Sin embargo, es posible que desees que tu app oculte las barras del sistema, dibuje contenido detrás de ellas o muestre contenido en un corte de pantalla, como se describe en Cómo diseñar tu app en las inserciones de ventana. Si tu app realiza alguna de estas acciones, consulta las siguientes subsecciones para obtener detalles sobre cómo permitir que tu app funcione bien en el ecosistema de dispositivos con el SO Android Automotive.

Barras del sistema, modo envolvente y renderización de borde a borde

Es posible que las barras del sistema de los vehículos tengan un tamaño y una posición diferentes que en otros factores de forma. Por ejemplo, las barras de navegación se pueden colocar a la izquierda, a la derecha o en la parte inferior de la pantalla. Incluso en el caso de que haya una barra de estado en la parte superior y una barra de navegación en la parte inferior (como sucede con la mayoría de los teléfonos y tablets), es probable que el tamaño de estos elementos sea mucho mayor en los automóviles.

Además, el SO Android Automotive permite a los OEM controlar si las apps pueden ocultar o mostrar las barras del sistema para ingresar al modo envolvente y salir de él. Por ejemplo, al evitar que las apps oculten las barras del sistema, los OEMs pueden garantizar que siempre se pueda acceder a los controles del vehículo, como los de climatización, en la pantalla. Si un OEM impide que las apps controlen las barras del sistema, no sucede nada cuando una app llama a las APIs de WindowInsetsController (o WindowInsetsControllerCompat) para ocultar o mostrar las barras del sistema. Consulta la documentación de show y hide para obtener más información sobre cómo detectar si tu app pudo modificar las inserciones.

Del mismo modo, los OEM también pueden controlar si las apps pueden establecer el color y la translucidez de las barras del sistema para garantizar que las barras y los elementos contenidos en ellas sean claramente visibles en todo momento. Si tu app dibuja de borde a borde, comprueba que solo se dibuje el contenido que no es crítico detrás de las barras del sistema. Es posible que este contenido no sea visible si el OEM del dispositivo evita configurar el color o la translucidez de las barras.

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

Si tu app va de borde a borde, no hagas suposiciones sobre el tamaño, la cantidad, el tipo o la ubicación de las barras del sistema. En su lugar, usa las APIs de inserciones de ventana para distribuir el contenido de tu app en relación con las barras del sistema. Consulta Cómo mostrar el contenido de borde a borde en tu app para obtener más detalles sobre cómo usar estas APIs. Valores de padding hard-coded que, si bien nunca se recomiendan, pueden mantener el contenido en el área segura de otros dispositivos que probablemente no aparezcan en los vehículos

Adáptate a pantallas con formas irregulares

Además de las pantallas rectangulares, algunos vehículos pueden tener pantallas con formas irregulares, como las que se muestran en la Figura 1:

Diagrama de un dispositivo con el SO Android Automotive con una pantalla curva en el lado derecho
Figura 1: Un dispositivo con el SO Android Automotive con una pantalla curva en el lado derecho. El área verde es el rectángulo seguro que no se superpone con el cuadro delimitador del corte de la pantalla de la curva.

Si tu app no renderiza de borde a borde, no necesitas realizar ninguna acción para que se renderice dentro del área segura.

Si tu app renderiza de borde a borde, puedes elegir cómo quieres que se comporte con respecto a los cortes de pantalla. Para lograrlo, usa recursos si configuras el atributo android:windowLayoutInDisplayCutoutMode para el tema de tu app, o bien modifica el atributo layoutInDisplayCutoutMode de la ventana durante el tiempo de ejecución.

Debido a que los tipos de cortes de pantalla presentes en los dispositivos con el SO Android Automotive son diferentes a los de los dispositivos móviles, no uses LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT ni LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, ya que tienen un comportamiento optimizado para los cortes que se encuentran en los dispositivos móviles. En su lugar, usa LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER o LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS para evitar siempre el corte o ingresar siempre. Cuando elijas la última opción, consulta Cómo brindar compatibilidad con cortes de pantalla para obtener más detalles sobre las APIs relacionadas con estos cortes.

Si tu app se renderiza en el área de corte de pantalla y quieres que tenga un comportamiento diferente entre el SO Android Automotive y los dispositivos móviles, consulta Cómo inhabilitar funciones para obtener orientación si tu app establece este comportamiento durante el tiempo de ejecución y Usar recursos alternativos si tu app establece este comportamiento con archivos de recursos.

Funciones inhabilitadas

Si quieres que una app para dispositivos móviles existente esté disponible en el SO Android Automotive, es posible que algunas características y funcionalidades no sean relevantes o no estén disponibles. Por ejemplo, por lo general, los automóviles no proporcionan acceso a las cámaras. Además, solo hay un subconjunto de Servicios de Google Play disponible para el SO Android Automotive. Consulta los Servicios de Google Play para automóviles para obtener más información.

Puedes usar la API de PackageManager.hasSystemFeature para detectar si la app se ejecuta en el SO Android Automotive. Para ello, busca la función FEATURE_AUTOMOTIVE, como se muestra en el siguiente ejemplo:

Kotlin

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

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Como alternativa, si la app también tiene un componente de Android Auto, puedes usar la API de CarConnection de la Biblioteca de apps de Android para vehículos para detectar si se ejecuta en el SO Android Automotive o en Android Auto, o si directamente no está conectada a ningún automóvil.

Para la función pantalla en pantalla (PIP), sigue las prácticas recomendadas establecidas para verificar si la función está disponible y reaccionar de forma adecuada.

Cómo controlar situaciones sin conexión

Si bien los vehículos se conectan cada vez más con Internet, se recomienda que las apps controlen la ejecución sin conexión a Internet, como en los siguientes casos:

  • Los usuarios pueden inhabilitar los datos móviles que ofrece el fabricante de automóviles como parte de un paquete de suscripción.
  • Es posible que el acceso a los datos móviles esté limitado en ciertas áreas.
  • Es posible que los automóviles con radios Wi-Fi estén fuera del alcance del Wi-Fi o que un OEM los desactive a favor de una red móvil.

Prepárate para manejar estas situaciones en la app a través de la degradación elegante de la funcionalidad que depende del acceso a Internet, por ejemplo, cuando ofreces contenido sin conexión. Si deseas obtener más información, consulta las prácticas recomendadas para optimizar las herramientas de redes.

Cómo usar recursos alternativos

Si deseas adaptar la app para vehículos, puedes usar el calificador de recursos car y proporcionar recursos alternativos cuando se ejecuta en un vehículo con el SO Android Automotive. Por ejemplo, si usas recursos de dimensión para almacenar valores de relleno, puedes usar un valor mayor en el conjunto de recursos car para agrandar los objetivos táctiles.

Cómo distribuir la app

Después de probar la app con los lineamientos de calidad de apps para vehículos de su categoría y de compilarla con el SO Android Automotive con los cambios necesarios en su categoría, podrás publicarla en los segmentos de factores de forma de Automotive OS en Play Store. Si quieres obtener más información sobre el proceso de publicación, consulta Cómo distribuir apps para Android en vehículos.

Cómo enviar comentarios sobre las apps para usar con el vehículo estacionado

Si tienes un problema o una solicitud de función mientras desarrollas la app para usar con el vehículo estacionado, para el SO Android Automotive, puedes informarlo con la Herramienta de seguimiento de errores de Google. Asegúrate de completar toda la información solicitada en la plantilla de problemas. Antes de informar un problema nuevo, verifica si ya se informó en la lista de problemas. Para suscribirte a un problema o votarlo, haz clic en el ícono de estrella que aparece en la herramienta de seguimiento. Para obtener más información, consulta Cómo suscribirte a un problema.

Cómo crear un error nuevo