Ringkasan arsitektur aplikasi media

Bagian ini menjelaskan cara memisahkan aplikasi pemutar media menjadi pengontrol media (untuk UI) dan sesi media (untuk pemutar sebenarnya). Di sini dijelaskan dua arsitektur aplikasi media: desain klien/server yang berfungsi dengan baik untuk aplikasi audio, dan desain aktivitas tunggal untuk pemutar video. Artikel ini juga menjelaskan cara membuat aplikasi media merespons kontrol hardware dan bekerja sama dengan aplikasi lain yang menggunakan aliran output audio.

Pemutar dan UI

Aplikasi multimedia yang memutar audio atau video biasanya memiliki dua bagian:

  • Pemutar yang menerima media digital dan merendernya sebagai video dan/atau audio
  • UI yang memiliki kontrol transport untuk menjalankan pemutar dan, jika diinginkan, menampilkan status pemutar

ui-and-player

Di Android, Anda dapat membuat pemutar sendiri dari nol atau memilih dari opsi berikut:

  • Class MediaPlayer menyediakan fungsionalitas dasar untuk pemutar standar yang mendukung format audio/video dan sumber data yang paling umum.
  • ExoPlayer adalah library open source yang mengekspos API audio Android level rendah. ExoPlayer mendukung fitur performa tinggi seperti streaming DASH dan HLS yang tidak tersedia di MediaPlayer. Anda dapat menyesuaikan kode ExoPlayer, sehingga mudah untuk menambahkan komponen baru. ExoPlayer hanya dapat digunakan dengan Android versi 4.1 dan yang lebih tinggi.

Sesi media dan pengontrol media

Sementara API untuk UI dan pemutar dapat bersifat arbitrer, sifat interaksi antara keduanya pada dasarnya sama untuk semua aplikasi pemutar media. Framework Android menentukan dua class, sesi media dan pengontrol media, yang memberlakukan struktur yang ditetapkan secara rapi untuk membuat aplikasi pemutar media.

Sesi media dan pengontrol media berkomunikasi satu sama lain menggunakan callback yang telah ditentukan yang terkait dengan tindakan standar pemutar (memutar, menjeda, berhenti, dll.), serta panggilan kustom yang dapat diperluas yang dapat Anda gunakan untuk menentukan perilaku khusus yang unik untuk aplikasi Anda.

controller-and-session

Sesi media

Sesi media bertanggung jawab atas semua komunikasi dengan pemutar. Class ini menyembunyikan API pemutar dari bagian lain dalam aplikasi Anda. Pemutar hanya dipanggil dari sesi media yang mengendalikannya.

Sesi ini mempertahankan representasi status pemutar (diputar/dijeda) dan informasi tentang media yang sedang diputar. Sebuah sesi dapat menerima callback dari satu atau beberapa pengontrol media. Hal ini memungkinkan pemutar untuk dikontrol oleh UI aplikasi Anda dan juga oleh perangkat pendamping yang menjalankan Wear OS dan Android Auto. Logika yang merespons callback harus konsisten. Respons terhadap callback MediaSession harus sama, apa pun aplikasi klien yang memulai callback itu.

Pengontrol media

Pengontrol media mengisolasi UI Anda. Kode UI Anda hanya berkomunikasi dengan pengontrol media, bukan dengan pemutar itu sendiri. Pengontrol media menerjemahkan tindakan kontrol transport menjadi callback ke sesi media. Pengontrol media juga menerima callback dari sesi media setiap kali status sesi diubah. Hal ini menyediakan mekanisme untuk memperbarui UI yang terkait secara otomatis. Pengontrol media hanya dapat tersambung ke satu sesi media pada satu waktu.

Saat menggunakan pengontrol media dan sesi media, Anda dapat menerapkan antarmuka dan/atau pemutar yang berbeda saat runtime. Anda dapat mengubah tampilan dan/atau performa aplikasi secara terpisah, bergantung pada kemampuan perangkat yang menjalankannya.

Aplikasi video versus aplikasi audio

Saat memutar video, mata dan telinga Anda sama-sama aktif. Saat memutar audio, Anda mendengarkan, tetapi Anda juga dapat menangani aplikasi lain secara bersamaan. Ada desain yang berbeda untuk setiap kasus penggunaan.

Aplikasi video

Aplikasi video memerlukan jendela untuk melihat konten. Karena alasan ini, aplikasi video biasanya diterapkan sebagai aktivitas Android tunggal. Layar tempat video ditampilkan menjadi bagian dari aktivitas.

aktivitas pemutar video

Aplikasi audio

Pemutar audio tidak perlu selalu menampakkan UI-nya. Begitu pemutaran audio dimulai, pemutar dapat berjalan sebagai tugas latar belakang. Pengguna dapat beralih ke aplikasi lain dan bekerja sambil terus mendengarkan.

Untuk menerapkan desain ini di Android, Anda dapat membuat aplikasi audio menggunakan dua komponen: aktivitas untuk UI dan layanan untuk pemutar. Jika pengguna beralih ke aplikasi lain, layanan dapat berjalan di latar belakang. Dengan memfaktorkan kedua bagian aplikasi audio ke dalam komponen terpisah, setiap bagian dapat berjalan lebih efisien. Sebuah UI biasanya berumur pendek dibandingkan dengan pemutar, yang dapat berjalan untuk waktu lama tanpa UI.

Aktivitas audio dan BrowserService

Support library menyediakan dua class untuk menerapkan pendekatan klien/server ini: MediaBrowserService dan MediaBrowser. Komponen layanan diterapkan sebagai subclass dari MediaBrowserService yang berisi sesi media dan pemutarnya. Aktivitas dengan UI dan pengontrol media harus menyertakan MediaBrowser yang berkomunikasi dengan MediaBrowserService.

Penggunaan MediaBrowserService akan memudahkan perangkat pendamping (seperti Android Auto dan Wear) untuk menemukan dan tersambung ke aplikasi Anda, menjelajahi konten, dan mengontrol pemutaran, tanpa mengakses aktivitas UI aplikasi Anda sama sekali. Bahkan, beberapa aplikasi dapat tersambung ke MediaBrowserService yang sama secara bersamaan, di mana setiap aplikasi menggunakan MediaController-nya sendiri. Aplikasi yang menawarkan MediaBrowserService harus dapat menangani beberapa koneksi secara bersamaan.

Aplikasi media dan infrastruktur audio Android

Aplikasi media yang dirancang dengan baik harus "dapat diputar dengan baik bersama" aplikasi lain yang memutar audio. Aplikasi ini harus disiapkan untuk berbagi ponsel dan bekerja sama dengan aplikasi lain di perangkat Anda yang menggunakan audio. Aplikasi ini juga harus merespons kontrol hardware di perangkat.

plays-with-others

Semua perilaku ini dijelaskan dalam Mengontrol Output Audio.

Library media-compat

Library media-compat berisi class yang berguna untuk membuat aplikasi yang memutar audio dan video. Class ini kompatibel dengan perangkat yang menjalankan Android 2.3 (API level 9) dan yang lebih tinggi. Class ini juga berfungsi dengan fitur Android lain untuk menciptakan pengalaman Android yang nyaman dan familier.

Penerapan yang direkomendasikan untuk sesi media dan pengontrol media adalah class MediaSessionCompat dan MediaControllerCompat, yang ditetapkan dalam support library media-compat. Keduanya menggantikan class MediaSession dan MediaController versi lama yang diperkenalkan di Android 5.0 (API level 21). Class compat menawarkan fungsionalitas yang sama tetapi mempermudah pengembangan aplikasi karena Anda hanya perlu menulis ke satu API. Library ini menangani kompatibilitas mundur dengan menerjemahkan metode sesi media menjadi metode yang setara pada versi platform lama, jika tersedia.

Jika Anda sudah memiliki aplikasi yang berfungsi, tetapi menggunakan class versi lama, sebaiknya lakukan update ke class compat. Jika menggunakan versi compat, Anda dapat menghapus semua panggilan ke registerMediaButtonReceiver() dan metode apa pun dari RemoteControlClient.

Mengukur performa

Di Android 8.0 (API level 26) dan yang lebih baru, metode getMetrics() tersedia untuk beberapa class media. Metode ini menampilkan objek PersistableBundle yang berisi informasi konfigurasi dan performa, yang dinyatakan sebagai peta atribut dan nilai. Metode getMetrics() ditentukan untuk class media berikut:

Metrik dikumpulkan secara terpisah untuk setiap instance dan terus ada selama masa aktif instance. Jika tidak ada metrik yang tersedia, metode akan menampilkan null. Metrik sebenarnya yang ditampilkan bergantung pada class-nya.