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.

Prueba la app 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 del manifiesto de tu app

Para orientarla a dispositivos con el SO Android Automotive, la app debe tener ciertas entradas de manifiesto. Después de habilitar la distribución en dispositivos con el SO Android Automotive, las apps compatibles se someten a un proceso de revisión manual para garantizar que sean seguras para su uso en un automóvil. Consulta Cómo distribuir a vehículos para obtener más información.

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 un elemento <uses-feature> en el archivo AndroidManifest.xml para la función android.hardware.type.automotive:

<manifest ...>
  ...
  <!--
    Depending on the track you choose to distribute your app, the android:required attribute can
    also be "false" or left unset. See Choose a track for Android Automotive OS.
  -->
  <uses-feature
      android:name="android.hardware.type.automotive"
      android:required="[true|false]" />
  ...
</manifest>

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.

Entradas de manifiesto específicas de la categoría

Además de los requisitos anteriores, que se aplican a todas las apps para vehículos estacionados, las categorías de video y juegos tienen requisitos adicionales:

Optimiza tu 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 aun 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 ventana 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 de 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 quieras 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 del 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 pueden colocarse 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 vehículos.

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 OEM pueden asegurarse de 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 WindowInsetsController (o WindowInsetsControllerCompat) para mostrar u ocultar 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 configurar el color y la translucidez de las barras del sistema para garantizar que las barras y los elementos contenidos dentro de 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 impide 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.

Cómo adaptar a pantallas con formas irregulares

Además de las pantallas rectangulares, algunos vehículos pueden tener pantallas con forma irregular, como se muestra 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 procesa 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 y configura el atributo android:windowLayoutInDisplayCutoutMode para el tema de tu app, o bien, modifica el atributo layoutInDisplayCutoutMode de la ventana en 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 siempre evitar o ingresar el corte. 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 el comportamiento sea 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 Cómo usar recursos alternativos si tu app establece este comportamiento con archivos de recursos.

Inhabilitar funciones

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, puedes usar Google Play para distribuirla en vehículos con Google integrado. Consulta Cómo distribuir apps para vehículos para obtener más información sobre el proceso de publicación.

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