Mejorando la experiencia de reproducción de Android TV con MediaSession

Contenidos

Habilite el control de voz para la reproducción con el Asistente de Google, Alexa y cualquier otro asistente de voz incorporado

Foto de Rome Wilkerson en UnsplashEn esta publicación, aprendemos más sobre la API de Android MediaSession, por qué debemos usarla y cómo implementarla en las aplicaciones de Android TV (o Fire TV). Ahora que hemos sentado las bases, sigamos una guía paso a paso para una implementación básica de MediaSession. La aplicación de muestra utilizada para este artículo y todo el código a continuación se pueden encontrar aquí. Si se está familiarizando con la implementación de controles de reproducción con los componentes de Leanback, o necesita un resumen de la misma, lea mis artículos anteriores. Cubro desde lo básico hasta ajustes adicionales a los controles de reproducción de Leanback. Según la documentación, una MediaSession permite «la interacción con controladores de medios, botones de volumen, botones de medios y controles de transporte». Además, MediaSession es el centro de control donde podemos leer información sobre lo que se está reproduciendo actualmente en el dispositivo Android y realizar acciones de control de medios como jugar, pausar, rebobinar, saltar, buscar y más.de un activo MediaSession permite que el sistema Android controle la reproducción de medios de una aplicación y consulte información sobre ella. Por ejemplo, si eres un descanso del juego Comando presionando o tocando sus auriculares, active las devoluciones de llamada de MediaSession que le piden a la aplicación del reproductor subyacente que realice esas acciones. Por otro lado, una aplicación de música o video debe proporcionar información sobre lo que se está reproduciendo actualmente. activo sesión de medios. De esta forma, el sistema Android puede mostrar estos datos al usuario y proporcionar interfaces a través de las cuales el usuario puede realizar acciones multimedia, por ejemplo, usar botones en la pantalla o enviar comandos de voz a través de Google Assistant o Amazon Alexa.Notificación de MediaSession de SpotifyLos beneficios de implementar MediaSession en nuestras aplicaciones varían de un dispositivo a otro.

  • El La reproducción de medios se puede controlar por voz en dispositivos compatibles con el Asistente de Google u otros tipos de asistentes de voz.
  • La reproducción se puede controlar en televisores compatibles con HDMI-CEC con los botones de medios tradicionales en el control remoto.
  • Controles multimedia en pantalla en los teléfonos. Dependiendo de la versión de Android, el sistema operativo puede recibir información sobre una MediaSession y Provisión de controles de medios El aparecerá en la pantalla de bloqueo.
  • También permite otros dispositivos, p. viable, para conectarse a la sesión de medios de su aplicación y contrólalo desde tu muñeca.
  • Permita que otras aplicaciones controlen su MediaSession. Por ejemplo, una navegación La aplicación puede solicitar un reproductor de música para reproducir tu lista de reproducción favorita cuando empiezas a conducir.

Esta es una API poderosa. Es no solo sobre controles de transporte (reproducir, pausar, etc.) o ver los metadatos del contenido. También se trata de enviar solicitudes específicas de reproducción de medios a una aplicación que pueda manejarlas y ejecutarlas. Así es como puedes decir con confianza:

«Ok Google, reproduce The afueras de Arcade Fire en Spotify».

Configurando el proyecto

El primer paso es agregar la dependencia androidx.media a su aplicación. build.gradle.implementación «androidx.media:media:1.6.0». Permiso y metadatos opcionales para AndroidManifest.xml.AndroidManifest.xmlNota: Los metadatos com.amazon.voice.supports_background_media_session son opcionales y el cambio de comportamiento al usarlo se describe aquí.

Creación de la MediaSession

Para crear una MediaSession, los únicos argumentos necesarios son un contexto y una etiqueta de cadena, que se utiliza para identificar la MediaSession durante la depuración. private val mediaSession = MediaSessionCompat(context, «VideoPlayback») Conceptualmente, una MediaSession debería persistir mientras viva el reproductor multimedia. Para las aplicaciones de video, esto generalmente significa que la actividad o el fragmento con la interfaz de usuario de reproducción está en primer plano. Mientras tanto, una aplicación de audio MediaSession puede tener el mismo ciclo de vida de servicio que contiene la instancia del reproductor, ya que generalmente admiten la reproducción en segundo plano. Con esto en mente, decidí administrar el ciclo de vida de MediaSession para la aplicación de muestra completamente dentro de SimplePlaybackTransportControlGlue, mientras recibía todas las devoluciones de llamada del ciclo de vida del host, en este caso un VideoSupportFragment. Luego comenzamos la configuración de MediaSession proporcionando un oyente que se invocará cuando se envíen acciones de medios. Para hacer esto, llamamos a la función MediaSession.setCallback() y pasamos una instancia de MediaSessionComapt.Callback. Dentro de estas devoluciones de llamada, realizamos la reproducción, pausa, búsqueda y cualquier otra operación especificada por nuestra clase de devolución de llamada MediaSession.Custom dentro de SimplePlaybackTransportControlGlue. Sin embargo, para que se llamen las devoluciones de llamada, MediaSession debe estar activo. Podemos activar y desactivar una MediaSession llamando a MediaSession.isActive = true/false.

estado de reproducción

Una vez que tenga la información de reproducción sobre sus medios, debe pasarla a MediaSession. Para ello usamos la clase PlaybackState. De esta forma, MediaSession sabe qué acciones están disponibles y cuál es su estado de reproducción actual. Los estados de reproducción existentes para una MediaSession y su documentación se pueden encontrar en la clase PlaybackStateCompat o aquí. En resumen, son: STATE_NONE, STATE_STOPPED, STATE_PAUSED, STATE_PLAYING, STATE_FAST_FORWARDING, STATE_REWINDING, STATE_BUFFERING, STATE_ERROR, STATE_CONNECTING, STATE_SKIPPING_TO_PREVIOUS, STATE_SKIPPING_TO_NEXT y STATE_KIPPING_TO_QUEUE_ITEM actualizarán MediaSession PlaybackState. Sin embargo, dentro de SimplePlaybackTransportControlGlue podemos escuchar casi todos los eventos del reproductor que necesitemos. Esta fue otra razón por la que decidí dejar la MediaSession en el pegamento. Agrega el siguiente código a tu pegamento para escuchar estos eventos y actualizar el valor de playbackState. Algunos eventos no están directamente disponibles para el pegamento. Más específicamente, inicia/detiene el almacenamiento en búfer y envía eventos de error al host de conexión, VideoPlaybackFragment. Puede recibirlos en el host y reenviarlos al pegamento usando funciones públicas. (Para simplificar, elegí no agregar el evento de error ya que hay demasiados).

reproducir acciones

Necesitamos pasar las acciones que admite a MediaSession. Esta información se transmite como Máscara de bits de acciones disponibles. En el momento de escribir este artículo, hay 22 acciones diferentes que admite MediaSession (consúltalas aquí). Nuevamente, en aras de la simplicidad, solo admitimos las promociones de medios más comunes.Nota: Las acciones admitidas deben actualizarse en función de su reproducción multimedia. Por ejemplo, si su aplicación reproduce anuncios, normalmente no debe permitir que el usuario avance o retroceda mientras se reproduce el anuncio. En este caso, debe actualizar PlaybackState y eliminar ACTION_FAST_FORWARD, ACTION_REWIND y cualquier otra acción que desee evitar durante la reproducción de anuncios. Consulte mediaSessionSupportedActions() de la aplicación de muestra aquí para ilustrar esta idea.

Establecer el estado de reproducción de MediaSession

Después de recopilar toda la información sobre el estado de reproducción actual, puede pasarla a MediaSession de esta manera:Nota: Aquí también puede establecer el estado de error de MediaSession llamando a PlaybackStateCompat.Builder.setErrorMessage().

Liberar la MediaSession

Una vez completada la reproducción, recuerde llamar a MediaSession.release() para liberar los recursos utilizados por MediaSession que ya no son necesarios.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.