MediaLibraryService ile içerik sunma

Medya uygulamaları genellikle bir hiyerarşide düzenlenmiş medya öğesi koleksiyonları içerir. Örneğin, albümdeki şarkılar veya şarkı listesindeki TV bölümleri. Medya öğeleri hiyerarşisine medya kitaplığı denir.

Hiyerarşide düzenlenmiş medya içeriği örnekleri
Şekil 1: Medya kitaplığı oluşturan medya öğesi hiyerarşilerine örnekler.

MediaLibraryService, medya kitaplığınızı sunmak ve bunlara erişmek için standartlaştırılmış bir API sağlar. Bu, örneğin, medya uygulamanıza, medya kitaplığınız için sürücüler için güvenli bir kullanıcı arayüzü sağlayan Android Auto desteği eklerken yararlı olabilir.

MediaLibraryService oluşturun

MediaLibraryService uygulanması MediaSessionService uygulamasına benzer ancak onGetSession() yönteminde MediaSession yerine MediaLibrarySession döndürmeniz gerekir.

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

Manifest dosyasında da Service ve gerekli izinleri beyan etmeyi unutmayı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" />

MediaLibrarySession kullan

MediaLibraryService API, medya kitaplığınızın tek bir kök düğüm ve oynatılabilir ya da daha fazla göz atılabilir olabilecek alt düğümlerden oluşan bir ağaç biçiminde yapılandırılmasını bekler.

MediaLibrarySession, MediaSession API'yi içerik tarama API'leri ekleyecek şekilde genişletir. MediaSession geri çağırma ile karşılaştırıldığında MediaLibrarySession geri çağırma aşağıdaki gibi yöntemler ekler:

  • onGetLibraryRoot() İstemci bir içerik ağacının kök MediaItem kodunu istediğinde
  • onGetChildren() İstemci, içerik ağacındaki bir MediaItem öğesinin alt öğelerini istediğinde
  • onGetSearchResult() İstemci, belirli bir sorgu için içerik ağacından arama sonuçları istediğinde

İlgili geri çağırma yöntemleri, istemci uygulamasının ilgilendiği içerik ağacı türüyle ilgili ek sinyaller içeren bir LibraryParams nesnesi içerir.