Menghubungkan ke aplikasi media

Pengontrol media berinteraksi dengan sesi media untuk membuat kueri dan mengontrol pemutaran aplikasi media. Di Media3, MediaController API mengimplementasikan antarmuka Player. Contoh aplikasi klien yang menggunakan pengontrol media antara lain:

Pengontrol media juga dapat berguna dalam aplikasi media, misalnya jika pemutar dan sesi media berada di Service yang terpisah dari Activity atau Fragment dengan UI.

Membuat MediaController

Untuk membuat MediaController, mulailah dengan membuat SessionToken untuk MediaSession yang sesuai. Metode onStart() dari Activity atau Fragment bisa menjadi tempat yang tepat untuk hal ini.

Kotlin

val sessionToken = 
  SessionToken(context, ComponentName(context, PlaybackService::class.java))

Java

SessionToken sessionToken = 
  new SessionToken(context, new ComponentName(context, PlaybackService.class));

Menggunakan SessionToken ini kemudian mem-build MediaController akan menghubungkan pengontrol ke sesi yang ditentukan. Proses ini berlangsung secara asinkron, jadi Anda harus memproses hasilnya dan menggunakannya jika tersedia.

Kotlin

val controllerFuture =
  MediaController.Builder(context, sessionToken).buildAsync()
controllerFuture.addListener({
  // MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor())

Java

ListenableFuture<MediaController> controllerFuture =
  new MediaController.Builder(context, sessionToken).buildAsync();
controllerFuture.addListener(() -> {
  // MediaController is available here with controllerFuture.get()
}, MoreExecutors.directExecutor());

Menggunakan MediaController

MediaController mengimplementasikan antarmuka Player, sehingga Anda dapat menggunakan perintah yang ditentukan dalam antarmuka untuk mengontrol pemutaran MediaSession yang terhubung. Ini berarti bahwa memanggil play() pada MediaController akan mengirim perintah ke MediaSession yang terhubung, yang kemudian akan mendelegasikan perintah ke Player yang mendasarinya.

Demikian pula, Anda dapat menambahkan Player.Listener ke pengontrol untuk memproses perubahan dalam status Player. Lihat panduan Peristiwa pemain untuk detail selengkapnya tentang penggunaan Player.Listener. Antarmuka MediaController.Listener menentukan callback tambahan untuk peristiwa dan perintah masuk dari MediaSession yang terhubung, seperti onAvailableSessionCommandsChanged() saat sesi media mengubah perintah sesi yang tersedia dan onDisconnected() saat pengontrol terputus dari sesi.

Seperti komponen lainnya, jangan lupa merilis MediaController saat tidak lagi diperlukan, seperti dalam metode onStop() dari Activity atau Fragment.

Kotlin

MediaController.releaseFuture(controllerFuture)

Java

MediaController.releaseFuture(controllerFuture);

Melepaskan pengontrol akan tetap mengirimkan semua perintah tertunda yang dikirim ke sesi dan hanya terlepas dari layanan sesi setelah perintah ini ditangani atau setelah periode waktu tunggu, mana saja yang terjadi lebih dahulu.

Membuat dan menggunakan MediaBrowser

MediaBrowser di-build di atas kemampuan yang ditawarkan oleh MediaController untuk juga mengaktifkan penjelajahan library media yang ditawarkan oleh MediaLibraryService aplikasi media.

Kotlin

val browserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync()
browserFuture.addListener({
  // MediaBrowser is available here with browserFuture.get()
}, MoreExecutors.directExecutor())

Java

ListenableFuture<MediaBrowser> browserFuture =
  new MediaBrowser.Builder(context, sessionToken).buildAsync();
browserFuture.addListener(() -> {
  // MediaBrowser is available here with browserFuture.get()
}, MoreExecutors.directExecutor());

Untuk mulai menjelajahi library konten aplikasi media, pertama-tama ambil node root dengan getLibraryRoot():

Kotlin

// Get the library root to start browsing the library tree.
val rootFuture = mediaBrowser.getLibraryRoot(/* params= */ null)
rootFuture.addListener({
  // Root node MediaItem is available here with rootFuture.get().value
}, MoreExecutors.directExecutor())

Java

// Get the library root to start browsing the library tree.
ListenableFuture<LibraryResult<MediaItem>> rootFuture =
  mediaBrowser.getLibraryRoot(/* params= */ null);
rootFuture.addListener(() -> {
  // Root node MediaItem is available here with rootFuture.get().value
}, MoreExecutors.directExecutor());

Selanjutnya, Anda dapat menjelajahi koleksi media dengan mengambil turunan MediaItem di library tersebut menggunakan getChildren(). Misalnya, untuk mengambil turunan node root MediaItem:

Kotlin

// Get the library root to start browsing the library tree.
val childrenFuture = 
  mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Int.MAX_VALUE, null)
childrenFuture.addListener({
  // List of children MediaItem nodes is available here with
  // childrenFuture.get().value
}, MoreExecutors.directExecutor())

Java

ListenableFuture<LibraryResult<ImmutableList<MediaItem>>> childrenFuture =
  mediaBrowser.getChildren(rootMediaItem.mediaId, 0, Integer.MAX_VALUE, null);
childrenFuture.addListener(() -> {
  // List of children MediaItem nodes is available here with
  // childrenFuture.get().value
}, MoreExecutors.directExecutor());