Menayangkan konten dengan MediaLibraryService

Aplikasi media sering kali berisi koleksi item media, yang diatur dalam hierarki. Misalnya, lagu dalam album atau episode TV dalam playlist. Hierarki item media ini dikenal sebagai library media.

Contoh konten media yang disusun dalam hierarki
Gambar 1: Contoh hierarki item media yang membentuk library media.

MediaLibraryService menyediakan API standar untuk menayangkan dan mengakses library media Anda. Hal ini dapat berguna, misalnya, saat menambahkan dukungan untuk Android Auto ke aplikasi media Anda, yang menyediakan UI-nya sendiri yang aman bagi pengemudi untuk library media Anda.

Mem-build MediaLibraryService

Mengimplementasikan MediaLibraryService mirip dengan mengimplementasikan MediaSessionService, kecuali dalam metode onGetSession(), Anda harus menampilkan MediaLibrarySession, bukan 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();
  }
}

Jangan lupa untuk mendeklarasikan Service dan juga izin yang diperlukan dalam file manifes:

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

Menggunakan MediaLibrarySession

MediaLibraryService API mengharapkan library media Anda disusun dalam format hierarki, dengan satu node root dan node turunan yang dapat diputar atau dijelajahi lebih lanjut.

MediaLibrarySession memperluas MediaSession API untuk menambahkan API penjelajahan konten. Dibandingkan dengan callback MediaSession, callback MediaLibrarySession menambahkan metode seperti:

  • onGetLibraryRoot() saat klien meminta MediaItem root dari hierarki konten
  • onGetChildren() untuk saat klien meminta turunan MediaItem dalam hierarki konten
  • onGetSearchResult() untuk saat klien meminta hasil penelusuran dari hierarki konten untuk kueri tertentu

Metode callback yang relevan akan menyertakan objek LibraryParams dengan sinyal tambahan tentang jenis hierarki konten yang diminati aplikasi klien.