Apps foundation

El auto es tu lienzo: Libera el desarrollo de Android para la ruta

Bocinas

Acerca de

Acerca de la charla

A medida que las pantallas de los vehículos se expanden en Android Auto y el SO Android Automotive, los desarrolladores se enfrentan a un doble desafío único: ofrecer experiencias enriquecidas y adaptables cuando el vehículo está estacionado, y experiencias seguras para el conductor y basadas en plantillas mientras conduce. En esta sesión técnica integral de 30 minutos, exploramos la arquitectura de extremo a extremo y los enfoques de desarrollo para adaptar las apps para Android a los vehículos.

Desde los aspectos básicos del diseño de apps para usar en vehículos hasta los enfoques más recientes para crear experiencias multimedia que cambian de audio a video cuando el vehículo pasa de estar en movimiento a estar estacionado, obtendrás todo lo que necesitas saber para poner tu app en marcha.

Resumen

  • Android para vehículos se orienta a dos plataformas: Android Auto y el SO Android Automotive. Uno se proyecta desde un teléfono, mientras que el otro se ejecuta directamente en el vehículo.
  • La biblioteca de apps para vehículos proporciona plantillas para interfaces optimizadas para la conducción que se adaptan a varias configuraciones de hardware de automóviles.
  • Las apps para vehículos estacionados se basan en actividades estándar de Android para ofrecer experiencias enriquecidas, como transmisión de video, juegos y navegadores web.
  • La versión 1.9 de la biblioteca de apps para vehículos incluye nuevos componentes de IU y tokens de personalización de marca. También expande la compatibilidad con las plantillas de contenido multimedia por completo al SO Android Automotive.
  • Las funciones de cambio de estacionado a conducción inician de forma dinámica actividades de video nativas cuando el vehículo está estacionado y, luego, vuelven a las plantillas de contenido multimedia para mantener el audio sin interrupciones durante la conducción.

Recursos

Gemini Notebook

Temas

  • android-for-cars
  • android-auto
  • android-automotive-os
  • car-app-library
  • media3
  • parked-apps

Transcripción

Descargar transcripción

Introducción a Android para vehículos

  • Bien.

  • Les damos la bienvenida a todos.

  • Gracias por acompañarnos en esta sesión, El auto es tu lienzo.

  • En esta sesión, se hablará sobre cómo desbloquear el desarrollo de Android para la ruta.

  • Soy Paul Lammertsma.

  • Y yo soy Thomas Weathers.

  • Somos ingenieros de Relaciones con Desarrolladores del equipo de Android para vehículos.

  • Seguro que muchos de ustedes dedicaron mucho tiempo y energía para asegurarse de que sus apps se vean bien y funcionen de manera excelente en una amplia variedad de pantallas y dispositivos, teléfonos, dispositivos plegables, tablets y demás.

  • Hoy nos enfocaremos en una pantalla en la que quizás no hayas pensado.

  • Además, puede ayudarte a llegar a tus usuarios de una manera única.

  • Esa es la pantalla del auto.

  • Comencemos con una breve descripción general de lo que significa Android para vehículos.

  • Android para vehículos no es un sistema monolítico.

  • Puedes segmentar tus anuncios para dos plataformas.

  • Primero, está Android Auto, que es un sistema proyectado que funciona con un teléfono.

  • Con Android Auto, la app se ejecuta en tu teléfono y proyecta su IU en la pantalla del auto a través de una conexión por cable o inalámbrica.

  • En segundo lugar, está el SO Android Automotive, que es una variante de Android que se ejecuta directamente en el vehículo.

  • SO Android Automotive se ejecuta de forma independiente del teléfono, tiene acceso directo al hardware del vehículo, como el control de climatización y la radio, y, lo que es más importante, también administra su propia conexión de datos.

  • Un subconjunto de los autos que ejecutan el SO Android Automotive son autos con Google integrado.

  • Los vehículos con Google integrado también incluyen apps y servicios de Google, como Play Store, Gemini y Google Maps.

  • Si bien hay dos plataformas, nuestro objetivo es facilitarte la compilación de apps una sola vez y que puedas implementarlas para brindar experiencias excelentes en ambas plataformas.

  • Este es un ejemplo de una app de contenido multimedia compilada una vez con la biblioteca de apps para vehículos y cómo se vería en Android Auto y en el SO Android Automotive, en una variedad de tamaños y formas de pantalla diferentes.

  • Existen muchos tipos diferentes de dispositivos y plataformas para los que podrías desarrollar.

  • Esto plantea la pregunta: ¿por qué para los automóviles?

  • En primer lugar, la escala aquí es enorme.

  • En la actualidad, hay más de 250 millones de autos compatibles con Android Auto en circulación y más de 100 modelos de autos con Google integrado de 16 marcas diferentes.

  • Cuando tus apps están en los vehículos, llegas a los usuarios en sus viajes diarios, en sus actividades familiares, cuando hacen mandados y hasta en sus viajes por ruta.

  • En EE.UU., según la encuesta American Driving Survey de 2024 de la AAA, los conductores pasan un promedio de 60 minutos al día al volante.

  • Sin embargo, no solo llegas a los usuarios mientras conducen activamente.

  • También llegarás a ellos cuando estén estacionados.

  • Piensa que tal vez están cargando su vehículo en la estación de carga de VE o tal vez están en la fila para recoger a sus hijos en la escuela.

  • Además, con el aumento de las pantallas específicas para pasajeros, esperamos ver aún más oportunidades en el futuro para impulsar la participación de los usuarios.

  • Bien.

  • Ahora, veamos los diferentes tipos de experiencias que puedes crear para los vehículos.

  • Para comprender cómo compilar para automóviles, es útil comprender las dos situaciones y estados principales que existen para las apps cuando se ejecutan dentro de un vehículo.

  • Primero, están las apps que usas mientras conduces.

  • Estas son experiencias optimizadas para la conducción que se pueden usar mientras el vehículo está en movimiento.

  • Esto incluye apps de las categorías que ves aquí en la pantalla, como apps de audio, que solemos llamar apps de contenido multimedia, mensajería y comunicación, navegación, etcétera.

  • Las experiencias optimizadas para la conducción deben cumplir con criterios estrictos de protección contra distracciones.

  • Existen consideraciones especiales sobre cómo compilar una IU para una app de modo que se pueda usar de forma segura mientras el vehículo está en movimiento.

  • Ahora existen varias formas de compilar apps optimizadas para la conducción.

Descripción general de la biblioteca de apps para vehículos

  • En esta charla, específicamente, nos enfocaremos en el uso de la biblioteca de apps para vehículos.

  • Se trata de un conjunto de bibliotecas de Jetpack que proporcionan un framework en plantillas que brinda interfaces de usuario optimizadas para la conducción y, a su vez, se encarga de la adaptación de las distintas configuraciones de hardware de los automóviles.

  • Por lo tanto, piensa en las modalidades de entrada, los tamaños de pantalla y las relaciones de aspecto.

  • Si bien esta no es la única forma de crear experiencias optimizadas para la conducción en vehículos, el enfoque en el que quiero centrarme en esta charla es la compilación con la biblioteca de apps de Android para vehículos.

  • A menudo, lo llamamos CAL para abreviar.

  • Como mencioné hace un momento, la biblioteca de apps para vehículos es un conjunto de bibliotecas que ayudan a compilar tus apps para usarlas en vehículos.

  • Es un framework con plantillas que proporciona interfaces de usuario optimizadas para la conducción y, a su vez, se encarga de la adaptación de las distintas configuraciones de hardware.

  • Y puedes compilar tu app y tener la confianza de que funcionará bien en todas esas diferentes configuraciones, ya sea que se ejecuten en Android Auto o en el SO Android Automotive.

  • Las apps que se compilan con CAL pueden depender de esta arquitectura de cliente host.

  • La app host, que es Android Auto o Google Automotive App Host en el caso de los vehículos con Google integrado, es el renderizador del sistema.

  • En última instancia, controla lo que se debe mostrar al usuario en sus pantallas.

  • Por lo tanto, como desarrollador de apps, no eres quien dibuja los píxeles.

  • En su lugar, proporcionas datos estructurados y el estado de tus datos a las plantillas de la biblioteca de apps para vehículos.

  • Y es este host el que toma estos datos y los dibuja de forma segura, de una manera que cumple con las normas de seguridad, con un diseño optimizado para evitar distracciones.

  • Entonces, veamos las clases dentro de la CAL, lo que necesitas extender para compilar tu app, comenzando con CarAppService.

  • Esta es una subclase del servicio de Android que actúa como punto de entrada para que las aplicaciones alojadas se comuniquen con las apps cliente, y su propósito es crear instancias de sesión con las que luego interactúa el host.

  • Puedes pensar en una sesión como una instancia de una app cliente que se ejecuta en una pantalla del vehículo.

  • Al igual que otros componentes de Android, tiene un ciclo de vida propio que se puede usar para inicializar y anular recursos utilizados durante la existencia de la instancia de la sesión.

  • Esta es una relación de uno a varios entre CarAppService y una sesión.

  • Por ejemplo, un CarAppService puede tener dos instancias de sesión: una para una pantalla principal y otra para una pantalla de clúster (en el caso de las apps de navegación compatibles con pantallas de clúster).

  • Este es un ejemplo de eso, en el que un automóvil tiene una pantalla principal y una pantalla de clúster, cada una asociada con una sesión dedicada. Así es como tú, como desarrollador de apps, puedes admitir vehículos con varias pantallas.

  • Luego, dentro de una sesión, las instancias de pantalla se encargan de generar las interfaces de usuario que renderizan las apps host.

  • Estas interfaces de usuario se representan con clases de plantilla, cada una de las cuales modela un tipo de diseño específico, que podría ser, por ejemplo, una cuadrícula o una lista.

  • Por lo tanto, cada sesión administra una pila de instancias de pantalla que controlan los flujos de usuarios en las distintas partes de tu aplicación y, al igual que con la sesión, una pantalla tiene un ciclo de vida propio en el que puedes implementar hooks.

  • Sin embargo, el hecho de que el host renderice tu IU y de que uses plantillas de la biblioteca de apps para vehículos no significa que tengas limitaciones estrictas o que no puedas personalizar tu aplicación.

  • Hay una gran cantidad de plantillas y componentes que puedes usar, y también puedes combinarlos para obtener la experiencia que deseas.

  • Existen plantillas de uso general, que pueden usar todos los tipos de apps dentro de la Biblioteca de apps para vehículos, y plantillas de uso especial, que están destinadas a experiencias de apps particulares, como la navegación o los lugares de interés.

  • Sin embargo, antes de entrar en detalles sobre cómo crear experiencias optimizadas para la conducción, quiero hablar de la otra situación en la que puedes ejecutar aplicaciones en vehículos: cuando el vehículo está estacionado.

Cómo desarrollar apps para vehículos estacionados

  • Hay ciertas categorías de aplicaciones que solo se pueden usar mientras el vehículo está estacionado, y esto incluye, por supuesto, apps de video, juegos y navegadores.

  • Sin embargo, cuando el vehículo no está en movimiento, se levantan los lineamientos de distracción del conductor y puedes proporcionar experiencias más acordes con tu IU adaptable existente.

  • Las apps para vehículos estacionados se basan en actividades y son similares, o incluso iguales, a las actividades que se usan en otros dispositivos, como teléfonos o tablets. Hablaremos de las apps para vehículos estacionados en detalle en la siguiente sección.

  • Si bien las experiencias en la app para usar con el automóvil estacionado reutilizan las actividades adaptables existentes, aún hay lineamientos de calidad específicos para automóviles que debes cumplir, desde las declaraciones del manifiesto y los cortes de pantalla hasta la pausa de la reproducción cuando el automóvil comienza a moverse.

  • Y para ayudar a automatizar ese trabajo, lanzamos una nueva habilidad de Android para las apps estacionadas.

  • Por lo tanto, antes de comenzar, asegúrate de haber instalado la CLI de Android, que puedes encontrar en este vínculo corto.

  • Y, luego, una vez que hayas configurado eso, ejecuta android skills list para explorar las habilidades disponibles.

    android skills list
    android skills add android-for-cars-parked-apps
  • Hay una gran cantidad de ellas, muchas habilidades diferentes que puedes usar para llevar tu desarrollo de Android al siguiente nivel.

  • Y, específicamente para Android para vehículos, puedes usar android skills add android-for-cars-parked-apps para agregar la habilidad al contexto de tu agente.

  • Ahora, sin importar cuál sea tu agente de IA favorito, te brinda esta guía paso a paso para configurar tu manifiesto para Android Auto o para el SO Android Automotive, controlar las inserciones de la ventana del auto y aspectos como la navegación hacia atrás, aplicar restricciones de reproducción por distracción del conductor y, además, puede auditar tu app de video, juego o navegador antes de que la envíes a Google Play.

Descripción general de las categorías de apps para vehículos

  • Por lo tanto, compilar apps para vehículos también es un poco particular debido a la noción de estas categorías de apps.

  • Como mencioné anteriormente, hay ciertas categorías de apps que se pueden usar mientras se conduce y otras que se pueden usar mientras el vehículo está estacionado.

  • Estas categorías destacadas son las que se pueden usar mientras conduces.

  • Algunas de estas se indican con CAL, que, como mencioné, es la biblioteca de apps para vehículos, y las apps de esta categoría usan plantillas como las que vimos hace un momento.

  • Ahora, déjame repasar esto rápidamente, no entraré en muchos detalles.

  • Comenzando con las apps de contenido multimedia, estas son apps que reproducen audio, no video.

  • Hay dos maneras de crearlos.

  • La que se encuentra en la parte superior, indicada con MediaBrowserService, es una especie de opción más sencilla.

  • Lo que haces es proporcionar metadatos, mientras que la interfaz de la pantalla de infoentretenimiento se encarga por completo de renderizar la IU de la reproducción y del navegador multimedia de una manera optimizada para el vehículo.

  • La otra opción es compilar apps de contenido multimedia con la Biblioteca de apps para vehículos, lo que te brinda más control y opciones para personalizar el estilo y la presentación de tus apps de contenido multimedia. Thomas nos mostrará más al respecto en un momento.

  • Por supuesto, las apps de navegación son un caso de uso clave, ya que proporcionan rutas y direcciones paso a paso.

  • Las apps para conductores de viajes compartidos también se incluyen en esta categoría.

  • Las apps de puntos de interés te ayudan a encontrar ubicaciones cercanas útiles, como cargadores de VE o lugares de estacionamiento.

  • Las apps de Internet de las cosas o IoT te permiten acceder a dispositivos inteligentes estés donde estés, por ejemplo, para administrar la casa.

  • También hay apps del clima disponibles que pueden mostrar radares en tiempo real, alertas de tormentas y pronósticos específicos de la ubicación.

  • Por último, la comunicación se divide en tres subcategorías: extender las notificaciones básicas al vehículo, o las aplicaciones de mensajería y videollamadas.

  • Y, luego, están las categorías estacionadas: apps de transmisión de video, juegos y navegadores web.

  • Y me complace anunciar que, desde hace unas semanas, la publicación de juegos en Android Auto y el SO Android Automotive está disponible para todos los desarrolladores.

  • Notarás que algunas de estas categorías dicen Abierta, otras dicen En versión beta y otras dicen Próximamente.

  • Abierta significa que cualquier desarrollador puede enviar una app de esta categoría directamente a producción.

  • La versión beta significa que, si bien puedes publicar en segmentos internos o cerrados, la app no se puede publicar en producción, a menos que se te acepte como parte de un programa de acceso anticipado.

  • La documentación de cada una de estas categorías incluye más información y un vínculo a nuestro formulario de interés.

  • Y Próximamente es para las categorías que actualmente no se admiten, pero que planeamos admitir en el futuro.

  • En última instancia, nuestro objetivo es unificar la plataforma.

  • Queremos que puedas compilar y obtener el mayor alcance posible escribiendo una sola vez y distribuyendo tanto para Android Auto como para el SO Android Automotive, independientemente de la categoría.

  • Ahora, Thomas hablará sobre los medios.

Actualizaciones de contenido multimedia de la biblioteca de apps para vehículos

  • Saludos,

  • Muy bien.

  • Por eso, el año pasado presentamos la biblioteca de apps para vehículos para apps multimedia en la versión 1.8, que incluye IU de navegación con plantillas y acciones personalizadas para Android Auto.

  • Esto incluía la plantilla de reproducción de contenido multimedia que se muestra aquí a la izquierda.

  • Este año, en I/O, presentamos más IU navegables a través de la biblioteca de apps para vehículos 1.9.

  • Por lo tanto, con la versión beta de CAL 1.9, ahora puedes acceder a actualizaciones de funciones clave en Auto y Automotive OS.

  • Entre los aspectos destacados, se incluyen la personalización de la marca a través de la expresión de la app, lo que te permite adaptar los tokens de color y forma con diseños renderizados por el host y, al mismo tiempo, mantener las reglas de seguridad, junto con nuevos componentes de la IU, como secciones destacadas, elementos de lista condensados, chips desplazables y un minirreproductor persistente.

  • Además, CAL 1.9 expande la compatibilidad con las plantillas de contenido multimedia por completo a AAOS, lo que impulsa una verdadera unificación de la plataforma en ambos ecosistemas.

  • Pronto lanzaremos la próxima iteración de la Biblioteca de apps para vehículos: la versión 10 de la CAL.

  • La versión 10 de CAL incluirá más plantillas personalizadas para las apps de comunicación, lo que brindará experiencias de llamadas más sólidas y personalizadas mientras se conduce.

  • También incluimos una nueva categoría de apps y plantillas para apps que ofrecen experiencias de conversación mientras se conduce.

  • Por último, se están desarrollando aún más funciones para que las transiciones de estacionamiento a conducción sean más fluidas con las plantillas de la biblioteca de apps para vehículos.

  • Próximamente, más información.

Funciones de estacionamiento y conducción

  • Las funciones de estacionamiento y conducción que usan la biblioteca de apps para vehículos permiten que tu app cambie de modo de forma dinámica y muestre contenido adaptable mientras el vehículo está detenido, y que vuelva sin problemas a las plantillas de la biblioteca de apps para vehículos cuando se conduce.

  • Entre las aplicaciones clave, se incluyen ofrecer flujos de autenticación personalizados cuando el vehículo está detenido o habilitar una experiencia de estacionamiento dedicada, como la transmisión de videopodcasts o clips de música.

  • Esto se integra directamente con la plantilla de reproducción de contenido multimedia.

  • Por lo tanto, los vehículos detenidos otorgan a los conductores acceso completo a la actividad nativa de Android de tu app, lo que habilita rich media, como la transmisión de video.

  • En cuanto el auto se pone en marcha, se activan las protecciones contra distracciones, lo que hace que la app vuelva a la plantilla multimedia de la biblioteca de apps para vehículos para mantener una escucha de audio compatible y sin interrupciones.

  • Estamos en un momento de transformación para las experiencias en el vehículo.

  • Las apps de contenido multimedia quieren evolucionar más allá de las interfaces tradicionales de exploración y reproducción para ofrecer momentos más enriquecidos, interactivos y envolventes tanto para conductores como para pasajeros.

  • Ahora, analizaremos un ejemplo de cómo puedes agregar una actividad de video nativa con la biblioteca de Media3 para que comience a reproducirse cuando el auto se estacione.

  • Para comenzar, conectarás una superficie de renderización de video directamente a tu instancia de reproducción en segundo plano.

    override fun onStart() {
           super.onStart()
           ...
           controllerFuture = MediaController.Builder(
             this,
             sessionToken
           ).buildAsync()
    
           controllerFuture?.addListener({
               mediaController = controllerFuture?.get()
               playerView.player = mediaController
           }, ContextCompat.getMainExecutor(this))
    }
  • Debes evitar crear una instancia de un reproductor de contenido multimedia independiente dentro de esta actividad. En su lugar, debes mantener un ExoPlayer o un reproductor de contenido multimedia central dentro de tu servicio principal, como un servicio de biblioteca de contenido multimedia de Media3, que controle la combinación de transmisiones de audio y video.

  • Por lo tanto, durante el movimiento, cuando no hay un servicio activo vinculado, el reproductor solo decodifica el audio, pero cuando los conductores abren tu actividad de video cuando están estacionados, debes conectar su superficie de renderización directamente al reproductor de servicios subyacente.

  • Por lo tanto, con Media3, mediaController implementa el reproductor de forma nativa, lo que permite una asignación directa, como se ve aquí, playerView set-- playerView.player se establece directamente en mediaController.

  • Por lo tanto, a continuación, querrás registrar tu punto de entrada nativo con ParkedOnlyOnClickListener.

    val watchVideoAction = Action.Builder()
      .setTitle("Watch Video")
      .setIcon(videoCarIcon)
      .setOnClickListener(
        ParkedOnlyOnClickListener.create {
          val intent = Intent(
            carContext,
            VideoPlayerActivity::class.java
          )
            .apply {
              addFlags(
                Intent.FLAG_ACTIVITY_NEW_TASK
              )
            }
          carContext.startActivity(intent)
        })
      .build()
  • Este wrapper proporciona un activador de intents dentro de la barra de encabezado de tu interfaz de reproducción de contenido multimedia.

  • Por lo tanto, incluye una acción para iniciar la reproducción de video, uniendo su objeto de escucha de selección en un ParkedOnlyOnClickListener.

  • Por lo tanto, en el modo Conducción, la app host intercepta estas presiones y muestra un mensaje de seguridad del sistema, por lo que no podrás acceder a esa pantalla mientras conduces, pero cuando estés estacionado, la devolución de llamada activará el startActivity dentro de carContext para iniciar la actividad de pantalla completa designada.

  • Recuerda que, en estas apps de la biblioteca de apps para vehículos, debes marcar tu destino de video como distractionOptimized=false dentro del manifiesto para que el sistema operativo reconozca que este es solo un flujo de trabajo de estacionamiento.

    <activity
       android:name=".VideoPlayerActivity"
       android:exported="false"
       android:launchMode="singleTop">
       <meta-data
           android:name="distractionOptimized"
           android:value="false" />
    </activity>

Cómo controlar las transiciones de estacionamiento a conducción

  • Por último, veamos qué sucede cuando el conductor cambia de estacionamiento a conducción.

  • Si la actividad no está optimizada para evitar distracciones y permanece activa mientras el vehículo se mueve, el AAOS presenta una superposición de bloqueo del sistema que, básicamente, te indica que debes estacionar para seguir usando la app.

  • Para evitar esta pantalla bloqueada, nuestro objetivo es volver sin problemas a la plantilla de reproducción de contenido multimedia sin interrumpir el audio.

  • Por lo tanto, cuando isRequiresDistractionOptimization se evalúe como verdadero aquí, básicamente, borraremos la superficie de renderización de video de la sesión multimedia subyacente y llamaremos a finish en la actividad del reproductor, ya que se inició sobre la experiencia de CAL. Cuando se finaliza, se vuelve directamente a la plantilla de reproducción de contenido multimedia y se continúa con la reproducción de audio.

    class VideoPlayerActivity : ComponentActivity(){
      override fun onStart() {
    
        …
    
        if (uxRestrictionsManager?
            .currentCarUxRestrictions?
            .isRequiresDistractionOptimization
                == true) {
          revertToCarAppTemplate()
        }
      }
    
      private fun revertToCarAppTemplate() {
        mediaControllerCompat
          .sendCommand("CMD_CLEAR_VIDEO_SURFACE",
                       null, null)
        finish()
      }
    }
  • Mantener esa reproducción de audio sin interrupciones es clave para una excelente experiencia del usuario, por lo que, si mantienes activa tu sesión multimedia como un servicio en primer plano, el sonido continuará sin problemas en estos cambios de estado.

    <activity
            android:name="androidx.car.app.activity.CarAppActivity"
            android:exported="true"
            android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
    
            <action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
        </intent-filter>
        <meta-data
                android:name="distractionOptimized"
                android:value="true" />
    </activity>
  • También debes anular el onNewIntent en la pantalla de CAL para capturar intents de SHOW_MEDIA_PLAYBACK.

    class MyCarAppSession : Session() {
        override fun onCreateScreen(intent: Intent): Screen {
            // 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
            val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
            mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)
    
            // 2. Handle deep link if cold-started from the vehicle's media widget
            handlePlaybackIntent(intent)
            return HomeScreen(carContext)
        }
        override fun onNewIntent(intent: Intent) {
            super.onNewIntent(intent)
    
            // 3. Handle deep link when the session is already running
            handlePlaybackIntent(intent)
        }
    }
  • De esta manera, cada vez que los usuarios interactúen con un widget de contenido multimedia del sistema del vehículo que se encuentra en la pantalla principal de los automóviles, el vínculo directo los dirigirá directamente a la vista de Está sonando en la biblioteca de apps para vehículos.

  • Por lo tanto, validar estas transiciones durante el proceso de desarrollo es muy sencillo.

  • Puedes ejecutar comandos de adb en AAOS.

  • En este caso, sería emulate-driving-state drive o emulate-driving-state park cuando quieras volver a cambiar entre actividades.

  • Este es un ejemplo en el que se usa nuestra nueva app de contenido multimedia de Media3 de ejemplo con la Biblioteca de apps para vehículos con reproducción de video de estacionamiento a conducción.

  • Así que echa un vistazo a nuestro stand de Android adaptable en la planta baja y en nuestro GitHub de muestras de automóviles muy pronto.

  • Las funciones de estacionamiento y conducción están disponibles actualmente en el SO Android Automotive para las apps de contenido multimedia que ya se integraron con la CAL del vehículo para la experiencia de conducción, en la que ahora pueden ofrecer experiencias más sólidas mientras el vehículo está estacionado.

  • Consulta nuestra documentación muy pronto en developer.android.com y expresa tu interés allí para incluir esta función en tu app.

  • Paul.

Novedades de la biblioteca de apps para vehículos

  • Muy bien.

  • Gracias, Thomas.

  • Antes de terminar, quiero compartir con ustedes un par de formas de obtener más información sobre lo que se viene este año.

  • Como mencionó Thomas, CAL 1.9 se encuentra actualmente en versión alfa.

  • Pronto pasará a la fase beta.

  • Y, luego, CAL 1.10 entrará en fase alfa antes de fin de año, por lo que podrás comenzar a evaluar las IU conversacionales y las funciones de comunicación y de estacionamiento más recientes.

  • Por último, nos complace compartir, como mencioné, que los juegos están disponibles en Android Auto y el SO Android Automotive, por lo que este es el momento perfecto para optimizar tus títulos de juegos para vehículos.

  • Para obtener más información sobre los detalles de la implementación, asegúrate de revisar la documentación en la guía "Cómo compilar juegos para vehículos".

  • Puedes obtener más información para adaptar tus juegos para vehículos y mantenerte al tanto de las novedades y los cambios de Android para vehículos en nuestra página "Novedades".

  • Esperamos que hayas visto cómo los vehículos y sus usuarios están listos para tus apps.

  • Puedes desarrollar tus apps adaptables existentes para ofrecer experiencias enriquecidas cuando el vehículo está estacionado y usar una variedad de plantillas de la biblioteca de apps para vehículos para crear esas experiencias seguras y optimizadas para la conducción.

  • Antes de publicar, puedes realizar pruebas exhaustivas con la consola central de escritorio, los emuladores, el AAOS que se ejecuta en la Pixel Tablet o Firebase Test Lab.

  • Ya tienes las habilidades para desarrollar contenido para este ecosistema, y millones de vehículos esperan tus apps, así que pongamos esa app en marcha.

Código

Fragmentos de código

Fragmento de shell en el minuto 9:03 de "Cómo desarrollar apps para vehículos estacionados"
android skills list
android skills add android-for-cars-parked-apps
Fragmento de Kotlin en el minuto 15:20 de "Funciones de estacionamiento para conducir"
override fun onStart() {
       super.onStart()
       ...
       controllerFuture = MediaController.Builder(
         this,
         sessionToken
       ).buildAsync()

       controllerFuture?.addListener({
           mediaController = controllerFuture?.get()
           playerView.player = mediaController
       }, ContextCompat.getMainExecutor(this))
}
Fragmento de Kotlin en el minuto 16:06 de "Funciones para estacionar y conducir"
val watchVideoAction = Action.Builder()
  .setTitle("Watch Video")
  .setIcon(videoCarIcon)
  .setOnClickListener(
    ParkedOnlyOnClickListener.create {
      val intent = Intent(
        carContext,
        VideoPlayerActivity::class.java
      )
        .apply {
          addFlags(
            Intent.FLAG_ACTIVITY_NEW_TASK
          )
        }
      carContext.startActivity(intent)
    })
  .build()
Fragmento de XML en el minuto 16:42 de "Funciones de estacionamiento para conducir"
<activity
   android:name=".VideoPlayerActivity"
   android:exported="false"
   android:launchMode="singleTop">
   <meta-data
       android:name="distractionOptimized"
       android:value="false" />
</activity>
Fragmento de Kotlin en el minuto 17:17 de "Cómo controlar las transiciones de estacionamiento a conducción"
class VideoPlayerActivity : ComponentActivity(){
  override fun onStart() {

    …

    if (uxRestrictionsManager?
        .currentCarUxRestrictions?
        .isRequiresDistractionOptimization
            == true) {
      revertToCarAppTemplate()
    }
  }

  private fun revertToCarAppTemplate() {
    mediaControllerCompat
      .sendCommand("CMD_CLEAR_VIDEO_SURFACE",
                   null, null)
    finish()
  }
}
Fragmento de XML en el minuto 17:36 de "Cómo controlar las transiciones de estacionamiento a conducción"
<activity
        android:name="androidx.car.app.activity.CarAppActivity"
        android:exported="true"
        android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />

        <action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
    </intent-filter>
    <meta-data
            android:name="distractionOptimized"
            android:value="true" />
</activity>
Fragmento de Kotlin en el minuto 17:49 de "Cómo controlar las transiciones de estacionamiento a conducción"
class MyCarAppSession : Session() {
    override fun onCreateScreen(intent: Intent): Screen {
        // 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
        val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
        mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)

        // 2. Handle deep link if cold-started from the vehicle's media widget
        handlePlaybackIntent(intent)
        return HomeScreen(carContext)
    }
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)

        // 3. Handle deep link when the session is already running
        handlePlaybackIntent(intent)
    }
}