7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Android SDK

Audio Latar di Android Menggunakan MediaSessionCompat

Read Time: 12 mins

Indonesian (Bahasa Indonesia) translation by Yanti Baddolo (you can also view the original English article)

Salah satu penggunaan populer alat seluler adalah memutar ulang audio melalui layanan pemutaran musik, podcast yang diunduh, atau sejumlah sumber audio lainnya.  Meskipun fitur ini cukup umum, namun ternyata sulit diterapkan, ditambah dengan banyaknya bagian berbeda yang perlu dibangun dengan benar untuk memberi pengalaman Android kepada pengguna Anda sepenuhnya.

Melalui tutorial ini anda akan belajar mengenai MediaSessionCompat dari perpustakaan pendukung Android, dan bagaimana ini dapat digunakan untuk membuat latar audio yang benar untuk pengguna Anda.

Persiapan

Hal pertama yang perlu Anda lakukan adalah memasukkan Perpustakaan pendukung Android kedalam proyek Anda.  Hal ini bisa dilakukan dengan menambahkan baris berikut kedalam file modul build.gradle Anda dibawah node dependensi.

Setelah proyek Anda tersinkronisasi, buatlah kelas Java baru.  Sebagai contoh saya akan memanggil BackgroundAudioService.  Kelas ini akan membutuhkan ekstensi MediaBrowserServiceCompat. Kita juga akan menerapkan antarmuka dibawah ini: MediaPlayer.OnCompletionListener dan AudioManager.OnAudioFocusChangeListener.

Karna sekarang penerapan MediaBrowserServiceCompat Anda telah dibuat, mari melakukan update terlebih dahulu pada AndroidManifest.xml sebelum kembali kekelas ini.  Pertama, Anda perlu meminta persetujuan WAKE_LOCK.

Selanjutnya dalam node application nyatakan layanan baru anda dengan item intent-filter.  Ini akan memungkinkan layanan Anda mencegat tombol kontrol, aktivitas headphone, dan penjelajahan media untuk perangkat seperti Android Auto ( meskipun kita tidak akan membahas Android Auto pada tutorial ini, beberapa pendukung dasar untukya masih dibutuhkan oleh MediaBrowserServiceCompat).

Pada akhirnya, Anda akan perlu menyatakan penggunaan MediaButtonReceiver dari perpustakaan pendukung Android.  Ini akan mengijinkan Anda mencegat interaksi-interaksi tombol kontrol media dan aktifitas headphone pada perangkat yang menjalankan Kitkat atau versi sebelumnya.

Sekarang file AndroidManifest.xml Anda telah selesai dan dapat ditutup.  Kita akan membuat kelas lainnya bernama MediaStyleHelper, yang ditulis oleh Ian Lake, Advokat pengembang di Google, untuk membersihkan pembuatan notifikasi jenis media.

Begitu selesai dibuat, teruskan dan tutup file tersebut.  Kita akan fokus pada pelayanan audio latar dibagian selanjutnya.

Membangun Pelayanan Audio Latar

Sekarang waktunya menggali inti dari pembuatan media aplikasi Anda.  Ada beberapa Variabel anggota yang akan Anda inginkan untuk dinyatakan pertama-tama pada aplikasi sampel ini: sebuah pemutar media/ MediaPlayer untuk pemutaran sebenarnya, dan objek MediaSessionCompat Yang akan mengatur kontrol metadata dan pemutaran.

Sebagai tambahan, Anda akan membutuhkan BroadcastReceiver yang mendengarkan perubahan pada mode headphone.  Untuk membuatnya tetap sederhana, penerima ini akan membuat MediaPlayer dalam kondisi pause, jika ia sedang dijakankan.

Untuk variabel anggota yang terakhir, Anda akan membuat objek MediaSessionCompat.Callback, yang digunakan untuk mengendalikan kondisi pemutaran ketika ada aksi sesi media.

Kita akan mengunjungi kembali setiap dari metode diatas nantinya pada tutorial ini, sebagai mana ia akan digunakan untuk mengarahkan operasi di palikasi kita.

Terdapat dua metode yang akan perlu dinyatakan, meski hal ini tidak akan dibutuhkan falam keperluan tutorial: onGetRoot() dan onLoadChildren().  Anda bisa menggunakan kode dibawah ini untuk kembali defaults.

Terakhir, Anda akan lebih banyak memakai metode onStartCommand() , yang mana merupakan titik masuk kedalam Service Anda.  Metode ini akan mengambil tujuan yang sesuai dengan Layanan/Service  dan mengirimkannya ke kelasMediaButtonReceiver.

Menginisialisasi Keseluruhan

Sekarang variabel anggota dasar anda telah dibuat dan saatnya untuk menginisialisasi semuanya.  Kita akan melakukannya dengan memanggil beragam metode penolong di onCreate().

Metode pertama, initMediaPlayer(), akan menginisialisasi objek MediaPlayer yang kita buat pada bagian atas kelas, meminta kunci pembangun parsial ( itulah kenapa kita meminta izin di AndroidManifest.xml), dan mengatur volume pemutar.

Metode selanjutnya, initMediaSession(),adalah dimana kita menginisialisasi objek MediaSessionCompat dan menyambungkanna ke tombol media metode kontrol yang mengijinkan kita menangani input pengguna dan pemutaran.  Metode ini dimulai dengan membuat objek ComponentName yang menunjuk ke kelas MediaButtonReceiver di perpustakaan pendukung Android, dan menggunakannya untuk membuat MediaSessionCompat yang baru.  Kemudian kita akan melewatkan objek MediaSession.Callback yang telah dibuat sebelumnya kedalamnya, dan mengatur kebutuhan bendere untuk menerima input tombol media dan sinyal kontrol.  Selanjutnya, kita akan membuat Intent baru untuk menangani input tombol media pada perangkat sebelum Lollipop, dan mengatur token sesi media untuk layanan kita.

Terakhir, kita akan mendaftarkan BroadcastReceiver yang telah dibuat ke bagian atas kelas sehingga kita bisa mendengarkan aktivitas yang berubah pada headphone.

Menangani Fokus Audio

Sekarang Anda telah selesai menginisialisasi objek BroadcastReceiverMediaSessionCompat dan MediaPlayer, sekarang waktunya untuk menangani fokus audio. 

Meskipun kita mungkin menganggap aplikasi audio kita sendiri yang paling penting saat ini, aplikasi lain di perangkat akan bersaing untuk membuat suara mereka sendiri, seperti notifikasi email atau game seluler.  Agar bisa bekerja dengan berbagai situasi ini, sistem Android menggunakan fokus audio untuk menentukan bagaimana audio harus ditangani.

Kasus pertama yang akan kita tangani adalah memulai pemutaran dan mencoba menerima fokus perangkat.  Dalam objek MediaSessionCompat.Callback Anda, pergilah ke metode onPlay() dan tambahkan dibawah ini kedalamnya.

Kode diatas akan memanggil metode yang membantu mencoba memanggil kembali fokus, namun jika gagal, kode ini akan mengembalikannya. Dalam aplikasi sebenarnya, Anda pasti ingin menangani pemutaran yang gagal dengan lebih anggun.  Menggunakan successfullyRetrievedAudioFocus() akan memberi referensi pada sistem AudioManager, dan mencoba meminta fokus audio untuk streaming musik.  Nantinya ini akan mengembalikan boolean yang mewakili sukses tidaknya permintaan.

Anda juga akan menyadari bahwa kita melewati ini dalam metode requestAudioFocus() yang menghubungkan OnAudioFocusChangeListener dengan layanan kita.  Terdapat beberapa perbedaan keadaan yang akan Anda ingin dengarkan agar menjadi “penduduk yang baik” dalam ekosistem aplikasi pada perangkat.

  • AudioManager.AUDIOFOCUS_LOSS: ini terjadi ketika aplikasi yang lain meminta fokus audio.  Ketika hal ini terjadi, Anda harus menghentikan pemutaran di aplikasi Anda.  
  • AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: Tkeadaan ini terjadi ketika aplikasi lain ingin memutar audio namun hanya membutuhkan fokus dalam jangka pendek.  Anda bisa menggunakan ini untuk membuat pemutaran audio Anda berhenti sejenak.  
  • AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: Ketika fokus audio diminta namun tidak menuntut perhatian penuh, aplikasi Anda dapat tetap diputar namun perlu dipelankan.  Ini terjadi ketika suara notifikasi dimainkan oleh perangkat.  
  • AudioManager.AUDIOFOCUS_GAIN:  Kondisi terakhir yang akan kita bahas adalah AUDIOFOCUS_GAIN.  Ini adalah keadaan dimana audio seperti kondisi pada bahasan sebelumnya telah berakhir, dan aplikasi Anda dapat diputar seperti keadaan dan volume sebelumnya.  

Callback onAudioFocusChange() yang disederhanakan mungkin terlihat seperti:  

Memahami MediaSessionCompat.Callback

Sekarang Anda telah memiliki struktur umum dari layanan/Service Anda. Sekarang saatnya untuk masuk lebih dalam ke MediaSessionCompat.Callback.  Pada sesi terakhir Anda telah menambahkan sedikit pada onPlay() untuk mengecek apakah fokus audio dijamin.  Dibawah penyataan prasyarat, Anda akan ingin mengatur objek MediaSessionCompat untuk diaktifkan, memberi keadaan STATE_PLAYING, dan menetapkan tindakan yang benar dan dibutuhkan untuk membuat tombol pause pada kontrol layar kunci untuk perangkat sebelum Lollipop, ponsel, dan notifikasi pada Android.

Metode setMediaPlaybackState() diatas adalah metode penolong yang membuat objek  PlaybackStateCompat.Builder dan memberinya aksi dan kondisi layak, serta membangun dan menghubungkan PlaybackStateCompat dengn objek MediaSessionCompat Anda.

Penting untuk dicatat bahwa Anda akan membutuhkan ACTION_PLAY_PAUSE dan salah satu dari ACTION_PAUSE atau ACTION_PLAY dalam tindakan Anda untuk mendapat kontrol yang baik dalam penggunaan Android.  

Media notification on Android WearMedia notification on Android WearMedia notification on Android Wear

Kembali ke onPlay(), Anda akan ingin menunjukkan notifikasi bahwa aplikasi sedang diputar yang disambungkan dengan objek MediaSessionCompat dengan menggunakan kelas MediaStyleHelper yang telah kita definisikan seblumnya, dan menunjukkan notifikasi tersebut.  

Terakhir, Anda akan memulai MediaPlayer pada bagian akhir onPlay().

Media control notification on an Android Nougat deviceMedia control notification on an Android Nougat deviceMedia control notification on an Android Nougat device

Ketika callback menerima komando untuk pause, onPause() akan dipanggil.  Disini Anda akan menghentikan sejenak MediaPlayer, mengatur keadaan ke STATE_PAUSED, dan menunjukkan notifikasi kondisi sedang pause.

Metode penolong kita,  showPausedNotification() , akan tampak mirip dengan metode showPlayNotification().

Metode selanjutnya di callback yang akan kita diskusikan, onPlayFromMediaId(), menjadikan String dan Bundle sebagai parameter.  Ini adalah metode callback yang bisa Anda gunakan untuk mengubah jejak audio/konten dalam aplikasi Anda.  

Dalam tutorial ini, kita akan menerima ID sumber mentah dan mencoba memainkannya, lalu menginisialisasi ulang metadata pada sesi tersebut.  Sebagaimana Anda diperbolehkan melewati Bundle pada metode ini, Anda juga bisa menggunakannya untuk menata aspek lainnya dalam pemutar ulang media Anda, seperti pengaturan suara latar untuk jejak.  

Sekarang setelah kita mendiskusikan dua metode utama pada callback yang dapat Anda gunakan pada aplikasi Anda, adalah penting untuk mengetahui ada metode pilihan lainnya yang bisa Anda gunakan untuk menata layanan Anda.  Beberapa metode tersebut termasuk onSeekTo(), yang mengijinkan Anda mengubah posisi pemutaran konten, dan onCommand(), yang akan menerima String yang menunjukkan jenis komando, sebuah Bundle untuk tambahan informasi mengenasi komendo, dan callback ResultReceiver , yang memungkinkan Anda mengirimkan komando buatan Anda kedalam Service.  

Mengancurkan/Tearing Down

Ketika file audio kita lengkap, kita akan ingin menentukan apa langkah kita selanjutnya.  Ketika Anda mungkin ini memutar track selanjutnya pada aplikasi, kita akan membuatnya menjadi sederhana dengan merilis MediaPlayer.

Akhirnya kita akan ingin melakukan beberapa hal kecil di metode onDestroy() pada Service kita.  Pertama, kita akan mendapatkan referensi pada layanan sistem AudioManager, dan memanggil abandonAudioFocus() dengan AudioFocusChangeListener sebagai parameter, yang akan memberitahu aplikasi lainnya pada perangkat bahwa Anda akan menyerahkan fokus audio.  Selanjutnya, menghapus register BroadcastReceiver yang diatur untuk mendengarkan perubahan pada headphone, dan merilis objek MediaSessionCompat.  Terakhirm Ana akan ingin membatalkan notifikasi kontrol pemutaran.  

Pada titik ini, Anda sebaiknya memiliki Service menggunakan MediaSessionCompat untuk kontrol pemutaran diseluruh perangkat.  Sementara telah banyak yang terlibat hanya dalam menciptakan layanan, Anda sebaiknya mamu mengontrol pemutaran dari aplikasi Anda, sebuah notifikasi, kontrol kunci layar pada perangkat sebelum Lollipop ( Lollipop akan nmenggunakan notifikasi pada layar kunci), dan dari perangkat periferal seperti Android Wear, begitu Service dimulai  

Media lock screen controls on Android Kit KatMedia lock screen controls on Android Kit KatMedia lock screen controls on Android Kit Kat

Memulai dan Mengontrol Konten dari Aktivitas.  

Sementara sebagian besar kontrol bersifat otomatis, Anda akan tetap perlu memulai dan mengontrol sesi media dari kontrol dalam aplikasi Anda.  Setidaknya Anda akan menginginkan objek  MediaBrowserCompat. ConnectionCallbackMediaControllerCompat. CallbackMediaBrowserCompat, dan MediaControllerCompat tercipta dalam aplikasi Anda.

MediaControllerCompat.Callback akan memiliki metode bernama onPlaybackStateChanged() yang menerima perubahan pada kondisi pemutaran yang bida digunakan untuk membuat UI anda tetap singkron.  

MediaBrowserCompat.ConnectionCallback memiliki sebuah metode onConnected() yang akan dipanggil jika objek MediaBrowserCompat baru dibuat dan disambungkan.  Anda bisa menggunakannya untuk menginisialisasi objek MediaControllerCompat  Anda, menghubungkannya ke MediaControllerCompat.Callback, dan mengasosiasikannya dengan MediaSessionCompat dari layanan/Service Anda.  Begitu selesai, Anda bisa memulai pemutaran audio dari metode ini.  

Anda akan menyadari bahwa potongan kode diatas menggunakan getSupportMediaController().getTransportControls() untuk berkomunikasi dengan sesi media.  Menggunakan teknik yang sama, Anda juga dapat memanggil onPlay() dan onPause() dalam objek MediaSessionCompat.Callback di layanan audio Anda.

Jika Anda telah selesai dengan pemutaran audio, anda dapat menghentikan sejenak layanan audio atau memutus smabungan objek MediaBrowserCompat Anda, yang akan kita lakukan pada tutorial ini ketika Activity ini dihancurkan.  

Pengemasan

Woa!  Seperti yang Anda lihat, terdapat banyak potongan-potongan kecil yang terlibat dalam membuat dan menggunakan layanan audio latar dengan benar.

Dalam tutorial ini, Anda telah membuat layanan yang memainkan file audio sederhana, mendengarkan perubahan pada fokus audio, dan menghubungkannya ke MediaSessionCompat untuk menyediakan kontrol pemutaran universal pada perangkat Android, termasuk handsets dan Android Wear.  Jika Anda mengalami hambatan saat bekerja dnegan tutorial ini, Saya sangat menganjurkan Anda untuk mengecek kode proyek Android terasosiasi di Envato Tuts+'s GitHub.

Dan silahkan mengecek beberapa kursus dan tutorial Android kami disini diEnvato Tuts+!


Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Scroll to top
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.