Cómo agregar compatibilidad con el SO Android Automotive a tu app para usar en el vehículo estacionado

Cuando distribuyes tu app en dispositivos con el SO Android Automotive, debes tener en cuenta algunas consideraciones exclusivas del factor de forma. En esta guía, se explican esas consideraciones.

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.

Configura el archivo de manifiesto de tu app

Para segmentar tu app para dispositivos con el SO Android Automotive, esta debe tener ciertas entradas de manifiesto. Después de habilitar la distribución en dispositivos con el SO Android Automotive, Google Play revisa las apps compatibles para garantizar que sean seguras para su uso en un automóvil. Para obtener más información, consulta Cómo distribuir apps para automóviles.

Funciones obligatorias del SO Android Automotive

Todas las apps creadas para el SO Android Automotive deben cumplir con ciertos requisitos para distribuirse a través de Google Play. Consulta Cumple con los requisitos de las funciones de Google Play para obtener más información.

Entradas de manifiesto específicas de la categoría

Además de los requisitos anteriores, que se aplican a todas las apps para usar con el vehículo estacionado, las categorías de video y juegos tienen requisitos adicionales:

Cumple con los requisitos de distracción del conductor

Evitar la distracción del conductor es fundamental cuando llevas tu app a los automóviles. En el caso de las apps para usar con el automóvil estacionado, esto se logra principalmente impidiendo que se use la app o que reproduzca audio mientras las restricciones de experiencia del usuario (UX) están activas, como se indica en los lineamientos de calidad DD-2 y DD-3.

Impedir el uso mientras las restricciones de la experiencia del usuario están activas

De forma predeterminada, no se pueden usar ni iniciar actividades mientras las restricciones de UX están activas. Para asegurarte de que este comportamiento se aplique a tu app, no debe incluir el siguiente elemento <meta-data> en ningún elemento <activity> dentro del manifiesto:

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

Si una actividad de tu app está en estado Reanudada cuando se activan las restricciones de la UX, se oculta con una actividad propiedad del SO.

Como mínimo, la actividad de tu app pasa al estado de ciclo de vida Paused. 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 tu app.

En los dispositivos que incluyen el modo de compatibilidad del SO Android Automotive, el bloqueo del sistema hace que las actividades de tu app pasen del estado Paused al estado Stopped.

Detener la reproducción y evitar que se reanude

En el caso de algunas apps, pausar la reproducción durante onPause() y hacer un seguimiento del estado para evitar la reanudación de la reproducción hasta que se ejecute onResume() es suficiente para cumplir con los requisitos de distracción del conductor.

Si reaccionar a las devoluciones de llamada de ciclo de vida no es suficiente para tu app, puedes detectar el estado de restricción de UX directamente, como se describe en la siguiente sección. Por ejemplo, las apps que admiten pantalla en pantalla podrían preferir escuchar directamente en lugar de tener verificaciones condicionales en las devoluciones de llamada del ciclo de vida.

Ten en cuenta las restricciones de la experiencia del usuario

Para detectar restricciones de UX, primero agrega una dependencia a la biblioteca android.car en el archivo build.gradle del módulo de tu app. Esta es una extensión del SDK de Android que proporciona APIs específicas para el SO Android Automotive.

android {
    ...
    useLibrary("android.car")
}

Usa CarUxRestrictionsManager para leer el estado de restricción de la UX. No intentes determinar el estado de restricción de UX a partir de otro estado de hardware, como la marcha o la velocidad, ya que las restricciones de UX pueden variar de una pantalla a otra dentro de un vehículo.

val car = Car.createCar(context) ?: return
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as? CarUxRestrictionsManager ?: return

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentCarUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions ->
    // Handle UX restrictions
}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

El único valor que proporciona CarUxRestrictions al que hace referencia tu app es el valor de retorno de isRequiresDistractionOptimization. Los demás valores solo son relevantes para las actividades marcadas como optimizadas para evitar distracciones.

Prueba tu implementación

Para validar que tu app cumpla con los requisitos de distracción del conductor, sigue este procedimiento:

  1. Instala tu app en una imagen del sistema sin Google Play Store ni el modo de compatibilidad.
  2. Con la cuadrícula de apps del selector abierta, simula la conducción y verifica que no se pueda abrir tu app.
  3. Deja de simular la conducción, abre tu app en una pantalla de reproducción y comienza la reproducción.
  4. Vuelve a simular la conducción y verifica que se pause la reproducción.
    1. Si tu app admite la integración con MediaSession, usa adb shell cmd media_session dispatch play y verifica que no se reanude la reproducción.

Optimiza tu app para el SO Android Automotive

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

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. Nunca se recomiendan los valores de padding hard-coded para ningún factor de forma, pero en los automóviles es probable que no funcionen para mantener el contenido en el área segura.

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:

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.

Atributos de inhabilitación

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:

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

Como alternativa, si tu 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 de pantalla en pantalla (PIP), sigue las prácticas recomendadas establecidas para verificar si la función está disponible y reaccionar de forma adecuada.

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

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