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

Aplikacje multimedialne często zawierają kolekcje elementów multimedialnych uporządkowanych według hierarchii. Mogą to być na przykład utwory z albumu lub odcinki programów telewizyjnych na playliście. Ta hierarchia elementów multimedialnych jest nazywana biblioteką multimediów.

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

MediaLibraryService udostępnia ustandaryzowany interfejs API, który umożliwia wyświetlanie biblioteki multimediów i uzyskiwanie do niej dostępu. Może to być przydatne np. wtedy, gdy dodajesz obsługę Androida Auto do aplikacji do multimediów, która zapewnia własny, bezpieczny dla sterownika interfejs biblioteki multimediów.

Utwórz MediaLibraryService

Implementacja MediaLibraryService przebiega podobnie do implementacji MediaSessionService. Jedyna różnica polega na tym, że w metodzie onGetSession() należy zwrócić wartość MediaLibrarySession zamiast 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();
  }
}

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 MediaLibraryService API oczekuje, że biblioteka multimediów będzie mieć strukturę typu drzewa, z 1 węzłem głównym i węzłami podrzędnymi, które można odtwarzać lub w dalszym ciągu przeglądać.

MediaLibrarySession rozszerza interfejs API MediaSession, aby dodać interfejsy API do przeglądania treści. W porównaniu z wywołaniem zwrotnym MediaSession wywołanie zwrotne MediaLibrarySession dodaje metody takie jak:

  • onGetLibraryRoot(), gdy klient żąda dostępu do roota MediaItem drzewa treści
  • onGetChildren(), gdy klient wysyła żądanie elementów podrzędnych obiektu MediaItem w drzewie treści
  • onGetSearchResult(), gdy klient wysyła dla danego zapytania do drzewa treści żądanie wyników wyszukiwania

Odpowiednie metody wywołania zwrotnego obejmują obiekt LibraryParams z dodatkowymi sygnałami dotyczącymi typu drzewa treści, którym interesuje się aplikacja kliencka.