Exibir conteúdo com um MediaLibraryService

Os apps de mídia geralmente contêm coleções de itens de mídia organizados em uma hierarquia. Por exemplo, músicas em um álbum ou episódios de TV em uma playlist. Essa hierarquia de itens de mídia é conhecida como biblioteca de mídia.

Exemplos de conteúdo de mídia organizado em uma hierarquia
Figura 1: exemplos de hierarquias de itens de mídia que formam uma biblioteca de mídia.

Um MediaLibraryService fornece uma API padronizada para servir e acessar sua biblioteca de mídia. Isso pode ser útil, por exemplo, ao adicionar suporte ao Android Auto ao seu app de mídia, que fornece a própria interface segura para motoristas para a biblioteca de mídia.

Crie um MediaLibraryService

A implementação de um MediaLibraryService é semelhante à implementação de um MediaSessionService. A diferença é que, no método onGetSession(), é necessário retornar uma MediaLibrarySession em vez de uma 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();
  }
}

Não se esqueça de declarar o Service e as permissões necessárias no arquivo de manifesto também:

<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" />

Use um MediaLibrarySession

A API MediaLibraryService espera que sua biblioteca de mídia seja estruturada em um formato de árvore, com um único nó raiz e nós filhos que podem ser reproduzidos ou navegáveis.

Um MediaLibrarySession estende a API MediaSession para adicionar APIs de navegação de conteúdo. Em comparação com o callback MediaSession, o callback MediaLibrarySession adiciona métodos como:

  • onGetLibraryRoot() para quando um cliente solicita o MediaItem raiz de uma árvore de conteúdo
  • onGetChildren() para quando um cliente solicita os filhos de um MediaItem na árvore de conteúdo
  • onGetSearchResult() para quando um cliente solicita resultados da pesquisa da árvore de conteúdo para uma determinada consulta

Os métodos de callback relevantes vão incluir um objeto LibraryParams com outros indicadores sobre o tipo de árvore de conteúdo em que um app cliente tem interesse.