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 meliputi:
- Kontrol media sistem Android
- Aplikasi pendamping Android Wear OS
- Android Auto dan Automotive OS
- Asisten suara, seperti Asisten Google
- Aplikasi Pengujian Pengontrol Media
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
Anda dapat 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 untuk mem-build MediaController
akan menghubungkan
pengontrol ke sesi yang diberikan. Hal ini terjadi 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.
Artinya, memanggil play()
di 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 mengetahui detail selengkapnya tentang penggunaan Player.Listener
. Antarmuka MediaController.Listener
menentukan callback tambahan untuk peristiwa dan perintah masuk dari
MediaSession
yang terhubung, seperti
onAvailableSessionCommandsChanged()
untuk saat sesi media mengubah perintah sesi yang tersedia dan
onDisconnected()
untuk saat pengontrol terputus dari sesi.
Seperti komponen lainnya, jangan lupa untuk merilis MediaController
jika
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 yang tertunda yang dikirim ke sesi dan hanya melepaskan ikatan dari layanan sesi setelah perintah ini ditangani atau setelah periode waktu tunggu, mana saja yang terjadi lebih dulu.
Membuat dan menggunakan MediaBrowser
MediaBrowser
dibuat berdasarkan kemampuan yang ditawarkan oleh
MediaController
untuk juga memungkinkan 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, ambil node root
dengan getLibraryRoot()
terlebih dahulu:
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 library media dengan mengambil turunan
MediaItem
di library dengan 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());