Wyświetlanie treści przy użyciu usługi MediaLibraryService

Aplikacje multimedialne często zawierają kolekcje elementów multimedialnych uporządkowane hierarchicznie. Może to być na przykład album lub odcinki serialu na playliście. Ta hierarchia elementów multimediów nosi nazwę biblioteki multimediów.

Przykłady treści multimedialnych uporządkowanych hierarchicznie
Ilustracja 1. Przykłady hierarchii elementów multimedialnych, które tworzą bibliotekę multimediów.

MediaLibraryService udostępnia standardowy interfejs API do obsługi biblioteki multimediów i dostępu do niej. Jest to przydatne na przykład wtedy, gdy dodajesz obsługę Androida Auto do aplikacji do multimediów, która ma własny, bezpieczny dla sterownika interfejs biblioteki multimediów.

Kompilacja: MediaLibraryService

Implementacja funkcji MediaLibraryService jest podobna do implementacji funkcji MediaSessionService, z tą różnicą, że w metodzie onGetSession() zamiast MediaSession należy zwracać MediaLibrarySession.

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();
  }
}

Pamiętaj, aby w pliku manifestu zadeklarować Service i wymagane uprawnienia:

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

Użyj MediaLibrarySession

Interfejs API MediaLibraryService wymaga, aby biblioteka multimediów miała format drzewa z jednym węzłem głównym i węzłami podrzędnymi, które można odtwarzać lub przeglądać.

MediaLibrarySession rozszerza interfejs API MediaSession o interfejsy API przeglądania treści. W porównaniu z metodą MediaSession wywołania zwrotnego metoda MediaLibrarySession wywołania zwrotnego umożliwia stosowanie takich metod jak:

  • onGetLibraryRoot() w przypadku, gdy klient żąda głównego elementu MediaItem drzewa treści
  • onGetChildren() gdy klient prosi o podkatalogi MediaItem w drzewie treści
  • onGetSearchResult() w przypadku, gdy klient zażąda wyników wyszukiwania z drzewa treści dla danego zapytania

Odpowiednie metody wywołania będą zawierać obiekt LibraryParams z dodatkowymi sygnałami o typie drzewa treści, którym zainteresowana jest aplikacja klienta.