MediaSession — komponen kerangka Android untuk mengelola pemutaran konten media dan integrasi dengan perangkat eksternal. Ini menyediakan antarmuka tunggal untuk interaksi dengan headset Bluetooth, headphone, Android Auto, dan pusat media sistem. Menurut Android Developers Guide, 2026, MediaSession menggantikan RemoteControlClient yang usang dan wajib untuk pemutar yang menyinkronkan dengan sistem.
Poin Utama
MediaSession — adalah komponen sistem Android yang memungkinkan aplikasi untuk mendeklarasikan aktivitas medianya dan menerima perintah kontrol dari luar. Ketika pengguna menekan tombol Play pada headset Bluetooth, sistem meneruskan peristiwa ini ke MediaSession aktif, dan aplikasi bereaksi melalui Callback-nya sendiri.
Sebelum Android 5.0, untuk tujuan ini digunakan RemoteControlClient, tetapi tidak memberikan fleksibilitas yang diperlukan dan tidak mendukung skenario modern — Android Auto, jam tangan pintar, speaker pintar. MediaSession diperkenalkan di API 21 dan menjadi standar de facto untuk semua aplikasi Android dengan pemutaran audio dan video.
Menurut Android Developer Documentation (2026), aplikasi harus membuat satu MediaSession untuk setiap sumber pemutaran independen. Pada satu waktu hanya ada satu sesi aktif — setiap sesi baru secara otomatis menonaktifkan sesi sebelumnya.
Kombinasi MediaSession dengan MediaBrowserService menyediakan siklus manajemen media yang lengkap: layanan menyediakan pohon konten (daftar putar, katalog), dan sesi menerima perintah navigasi dan pemutaran. Ini adalah arsitektur yang direkomendasikan oleh Google untuk pemutar musik, podcast, dan buku audio.
MediaBrowserService berjalan sebagai foreground-service dengan notifikasi, yang menjamin aplikasi tetap berjalan bahkan setelah Activity dimatikan. Ini sangat penting untuk pemutar audio yang harus terus memutar saat aplikasi diminimalkan.
Sesi mendukung dua jenis interaksi: ia menerima perintah dari MediaController (sisi klien) dan menyiarkan status melalui PlaybackState. MediaController dapat berada dalam proses yang sama atau di aplikasi terpisah — sistem merutekan permintaan melalui SessionToken.
Ketika pengguna memanggil asisten suara Android dan mengatakan “Putar lagu berikutnya”, sistem menemukan MediaSession aktif melalui koneksi dengan MediaBrowserService dan mengirim perintah ACTION_SKIP_TO_NEXT. Callback aplikasi menerima panggilan onSkipToNext() dan memperbarui PlaybackState.
Pembaruan PlaybackState melalui setPlaybackState() segera memberi tahu semua MediaController yang terhubung. Pusat media sistem, perangkat Bluetooth, dan Android Auto menerima pembaruan secara bersamaan — penundaan tidak melebihi 50 ms dalam kondisi normal.
PlaybackState berisi flag status kunci: isPlaying, posisi, kecepatan, tindakan yang tersedia (play, pause, seek, stop). Tanpa PlaybackState yang diisi dengan benar, sistem tidak tahu perintah apa yang didukung aplikasi dan tidak mengirim peristiwa yang sesuai.
Metadata (MediaMetadata) melengkapi status dengan informasi tentang lagu saat ini — title, artist, album art URI. Android Auto dan perangkat wearable menggunakan MediaMetadata untuk menampilkan informasi di layar. Menurut Google I/O 2024, pengisian MediaMetadata yang benar meningkatkan visibilitas aplikasi di peluncur pihak ketiga sebesar 40%.
Arsitektur MediaSession terdiri dari empat komponen yang saling terhubung, masing-masing menyelesaikan tugasnya sendiri. Pengembang harus mengimplementasikan keempatnya untuk integrasi penuh dengan sistem.
Sesi dibuat di onCreate layanan atau Activity dengan memanggil MediaSessionCompat(context, tag). Setelah dibuat, harus memanggil setFlags(FLAG_HANDLES_MEDIA_BUTTONS | FLAG_HANDLES_TRANSPORT_CONTROLS). Di onDestroy dipanggil release() untuk membebaskan sumber daya sistem.
Manajemen siklus hidup yang tidak benar adalah salah satu kesalahan umum. Jika release() tidak dipanggil, sesi tetap berada di sistem, dan aplikasi berikutnya dapat menerima status palsu. Android 13+ menampilkan peringatan di Logcat saat kebocoran sesi.
Integrasi dasar dimulai dengan membuat sesi dan mengimplementasikan Callback. Disarankan menggunakan MediaSessionCompat dari perpustakaan AndroidX media, yang menyediakan API seragam untuk semua versi Android — dari API 14 hingga 35.
class MusicService : Service() {
private lateinit var mediaSession: MediaSessionCompat
private lateinit var stateBuilder: PlaybackStateCompat.Builder
override fun onCreate() {
super.onCreate()
mediaSession = MediaSessionCompat(this, "MusicService")
mediaSession.setFlags(
MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS
)
mediaSession.setCallback(MediaSessionCallback())
updatePlaybackState(false)
}
private inner class MediaSessionCallback : MediaSessionCompat.Callback() {
override fun onPlay() {
updatePlaybackState(true)
}
override fun onPause() {
updatePlaybackState(false)
}
}
private fun updatePlaybackState(isPlaying: Boolean) {
stateBuilder = PlaybackStateCompat.Builder()
.setState(
if (isPlaying) PlaybackStateCompat.STATE_PLAYING
else PlaybackStateCompat.STATE_PAUSED,
AudioTrackCompat.CURRENT_POSITION_NOT_SET,
1.0f
)
.setActions(
PlaybackStateCompat.ACTION_PLAY
or PlaybackStateCompat.ACTION_PAUSE
or PlaybackStateCompat.ACTION_SKIP_TO_NEXT
or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS
)
mediaSession.setPlaybackState(stateBuilder.build())
}
override fun onDestroy() {
mediaSession.release()
super.onDestroy()
}
}
Dalam contoh, MediaSession dibuat dengan tag MusicService dan flag untuk memproses tombol media. Callback mengimplementasikan onPlay dan onPause, memperbarui PlaybackState. Metode setActions mendeklarasikan tindakan yang tersedia yang ditampilkan sistem di layar kunci dan di pusat media.
private fun setMetadata(title: String, artist: String) {
val metadata = MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title)
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, 300000L)
.putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, albumArtUrl)
.build()
mediaSession.setMetadata(metadata)
}
Metadata harus diperbarui setiap kali berganti lagu. Sistem menggunakan METADATA_KEY_TITLE dan METADATA_KEY_ARTIST untuk menampilkan informasi di layar Bluetooth mobil dan perangkat wearable. Jika URI sampul tidak diatur, pemutar akan menampilkan placeholder abu-abu.
Headset Bluetooth mengirim perintah melalui profil AVRCP 1.6+. Android mentransmisikan perintah ini ke intent ACTION_MEDIA_BUTTON, yang dicegat oleh MediaSession saat flag FLAG_HANDLES_MEDIA_BUTTONS diatur.
Ketika pengguna menekan tombol Play pada headphone Bluetooth, sistem membuat KeyEvent dengan kode KEYCODE_MEDIA_PLAY, yang dikirim ke metode onMediaButtonEvent Callback. Jika onPlay() diimplementasikan di Callback, sistem memanggilnya langsung. Pada penekanan tunggal tombol headset, KEYCODE_MEDIA_PLAY_PAUSE dikirim — pemutar harus mengalihkan status.
Headphone Bluetooth modern dapat memiliki hingga 5 tombol: volume +/-, play/pause, next, previous. Setiap tombol menghasilkan KeyEvent sendiri yang harus diproses dengan benar oleh Callback. Tekanan ganda play/pause biasanya diartikan sebagai melompat ke lagu berikutnya (ACTION_SKIP_TO_NEXT) di banyak headset.
Menurut Android Compatibility Definition Document (2026), semua aplikasi dengan konten media wajib memproses KEYCODE_MEDIA_PLAY_PAUSE dengan benar. Mengabaikan persyaratan ini menyebabkan penurunan peringkat aplikasi secara otomatis di Google Play untuk kategori Musik & Audio.
Mulai dari Android 11, pusat media sistem (Media Control Panel) menampilkan hingga 5 sesi MediaSession terbaru di panel notifikasi. Pengguna dapat mengontrol pemutar tanpa membuka aplikasi. Untuk tampilan yang benar, perlu mengimplementasikan MediaBrowserService dan mengisi PlaybackState dengan benar.
Media Control Panel menampilkan: judul lagu, artis, sampul (dari MediaMetadata), tombol kontrol (dari tindakan yang diizinkan PlaybackState). Jika aplikasi tidak memperbarui PlaybackState setidaknya sekali setiap 10 detik selama pemutaran aktif, pusat media menyembunyikan sesi dari panel.
private fun startForegroundService() {
val notification = NotificationCompat.Builder(this, "media_channel")
.setSmallIcon(R.drawable.ic_play)
.setContentTitle("Sedang diputar")
.setContentText(currentTrackTitle)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setStyle(
androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(mediaSession.sessionToken)
)
.build()
startForeground(1001, notification)
}
Notifikasi MediaStyle terhubung dengan MediaSession melalui sessionToken dan menampilkan tombol media standar. Tanpa MediaStyle, notifikasi akan terlihat seperti peringatan biasa tanpa tombol kontrol. Android 13+ memerlukan izin eksplisit POST_NOTIFICATIONS untuk ditampilkan.
Pertanyaan yang Sering Diajukan
Secara teknis ya, tetapi pada satu waktu hanya satu sesi yang dianggap aktif. Saat membuat sesi baru tanpa memanggil setActive(true), sesi sebelumnya tetap aktif. Disarankan memiliki satu sesi per aplikasi atau per sumber audio independen dengan mengalihkan status aktif.
MediaSession tidak mengelola Audio Focus secara otomatis — ini adalah mekanisme terpisah. Saat menerima perintah onPlay, pengembang secara mandiri meminta AudioFocus melalui AudioManager, dan saat kehilangan fokus, menghentikan pemutaran melalui sesi.
Periksa pengaturan flag FLAG_HANDLES_MEDIA_BUTTONS dan FLAG_HANDLES_TRANSPORT_CONTROLS. Juga pastikan sesi aktif (setActive(true)). Di Android 12+, tombol media hanya berfungsi melalui MediaSession — registerMediaButtonEventReceiver lama tidak didukung.
Untuk pemrosesan tombol dasar — tidak. Tetapi untuk integrasi dengan Android Auto, Wear OS, dan pusat media sistem, MediaBrowserService diperlukan. Google merekomendasikan mengimplementasikan MediaBrowserService di semua aplikasi dengan pemutaran audio jangka panjang.
Gunakan perintah adb shell dumpsys media_session untuk melihat sesi aktif, Callback, dan PlaybackState mereka. Alat ini akan menampilkan semua sesi terdaftar dengan tag, aktivitas, dan status terakhir yang diketahui — alat yang nyaman untuk debugging.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga