MediaLibraryService ile içerik sunma

Medya uygulamaları genellikle hiyerarşik olarak düzenlenmiş medya öğesi koleksiyonları içerir. Örneğin, bir albümdeki şarkılar veya oynatma listesindeki TV bölümleri. Medya öğelerinin bu hiyerarşisi medya kitaplığı olarak bilinir.

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

MediaLibraryService, medya kitaplığınızı yayınlamak ve kitaplığınıza erişmek için standartlaştırılmış bir API sağlar. Bu, örneğin medya uygulamanıza Android Auto desteği eklerken faydalı olabilir. Bu destek, medya kitaplığınız için sürücüye güvenli kendi kullanıcı arayüzünü sağlar.

MediaLibraryService oluşturma

MediaLibraryService uygulamak, MediaSessionService uygulamaya benzer. Tek fark, onGetSession() yönteminde MediaSession yerine MediaLibrarySession döndürmeniz gerektiğidir.

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

Service ve gerekli izinlerinizi manifest dosyasında da belirtmeyi 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ın

MediaLibraryService API, medya kitaplığınızın tek bir kök düğüm ve oynatılabilir veya gezilebilir alt düğümler içeren bir ağaç biçiminde yapılandırılmasını bekler.

MediaLibrarySession, içeriklere göz atma API'leri eklemek için MediaSession API'yi genişletir. MediaSession geri çağırma yöntemine kıyasla MediaLibrarySession geri çağırma yöntemi aşağıdakiler gibi yöntemler ekler:

  • onGetLibraryRoot() Bir istemci, içerik ağacının kökünü MediaItem istediğinde
  • onGetChildren() istemci, içerik ağacındaki bir MediaItem öğesinin alt öğelerini istediğinde
  • onGetSearchResult() Müşteri belirli bir sorgu için içerik ağacından arama sonuçları istediğinde

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