Cómo entregar contenido con un MediaLibraryService

Las apps de contenido multimedia suelen contener colecciones de elementos multimedia organizados en una jerarquía. Por ejemplo, canciones en un álbum o episodios de TV en una playlist. Esta jerarquía de elementos multimedia se conoce como biblioteca multimedia.

Ejemplos de contenido multimedia organizado en una jerarquía
Figura 1: Ejemplos de jerarquías de elementos multimedia que forman una biblioteca multimedia.

Un MediaLibraryService proporciona una API estandarizada para entregar y acceder a tu biblioteca de contenido multimedia. Esto puede ser útil, por ejemplo, cuando agregas compatibilidad con Android Auto a tu app de música, que proporciona su propia IU segura para el conductor para tu biblioteca de música.

Compila un MediaLibraryService

La implementación de un MediaLibraryService es similar a implementar un MediaSessionService, excepto que, en el método onGetSession(), debes mostrar un MediaLibrarySession en lugar de un MediaSession.

Kotlin

class PlaybackService : MediaLibraryService() {
  var mediaLibrarySession: MediaLibrarySession? = null
  var callback: MediaLibrarySession.Callback = object : MediaLibrarySession.Callback {...}

  // If desired, validate the controller before returning the media library session
  override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaLibrarySession? =
    mediaLibrarySession

  // Create your player and media library session in the onCreate lifecycle event
  override fun onCreate() {
    super.onCreate()
    val player = ExoPlayer.Builder(this).build()
    mediaLibrarySession = MediaLibrarySession.Builder(this, player, callback).build()
  }

  // Remember to release the player and media library session in onDestroy
  override fun onDestroy() {
    mediaLibrarySession?.run { 
      player.release()
      release()
      mediaLibrarySession = null
    }
    super.onDestroy()
  }
}

Java

class PlaybackService extends MediaLibraryService {
  MediaLibrarySession mediaLibrarySession = null;
  MediaLibrarySession.Callback callback = new MediaLibrarySession.Callback() {...};

  @Override
  public MediaLibrarySession onGetSession(MediaSession.ControllerInfo controllerInfo) {
    // If desired, validate the controller before returning the media library session
    return mediaLibrarySession;
  }

  // Create your player and media library session in the onCreate lifecycle event
  @Override
  public void onCreate() {
    super.onCreate();
    ExoPlayer player = new ExoPlayer.Builder(this).build();
    mediaLibrarySession = new MediaLibrarySession.Builder(this, player, callback).build();
  }

  // Remember to release the player and media library session in onDestroy
  @Override
  public void onDestroy() {
    if (mediaLibrarySession != null) {
      mediaLibrarySession.getPlayer().release();
      mediaLibrarySession.release();
      mediaLibrarySession = null;
    }
    super.onDestroy();
  }
}

Recuerda declarar tu Service y los permisos necesarios en el archivo de manifiesto también:

<service
    android:name=".PlaybackService"
    android:foregroundServiceType="mediaPlayback"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.media3.session.MediaSessionService"/>
    </intent-filter>
</service>

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- For targetSdk 34+ -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />

Usa un MediaLibrarySession

La API de MediaLibraryService espera que tu biblioteca de contenido multimedia esté estructurada en un formato de árbol, con un solo nodo raíz y nodos secundarios que puedan reproducirse o explorarse.

Un MediaLibrarySession extiende la API de MediaSession para agregar APIs de navegación de contenido. En comparación con la devolución de llamada MediaSession, la devolución de llamada MediaLibrarySession agrega métodos como los siguientes:

  • onGetLibraryRoot() para cuando un cliente solicita el MediaItem raíz de un árbol de contenido
  • onGetChildren() para cuando un cliente solicita los elementos secundarios de un MediaItem en el árbol de contenido
  • onGetSearchResult() para cuando un cliente solicita resultados de la búsqueda del árbol de contenido para una búsqueda determinada

Los métodos de devolución de llamada relevantes incluirán un objeto LibraryParams con indicadores adicionales sobre el tipo de árbol de contenido que le interesa a una app cliente.