MediaSession — konsep kunci, integrasi, dan mekanisme kerja di Android

Penulis: IT Sectr Diterbitkan: 2026-05-23 Waktu membaca: 8 mnt

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 — komponen pusat untuk mengelola aliran media di Android, menerima perintah dari sumber eksternal.
  • Mendukung Bluetooth AVRCP, headset, Android Auto, perangkat wearable, dan pusat media Android.
  • Sesi menyinkronkan status pemutar (play/pause/next/previous) dan metadata (judul, artis, sampul) dengan sistem.
  • Untuk bekerja memerlukan MediaSessionCompat dari AndroidX, yang menyediakan kompatibilitas mundur hingga API 14.
  • Sistem Callback MediaSession.Callback memproses perintah masuk dan mengubah status MediaSession.

Apa itu MediaSession?

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.

MediaSession dan MediaBrowserService

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.

Bagaimana MediaSession bekerja

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 dan metadata-nya

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%.

Komponen kunci MediaSession

Arsitektur MediaSession terdiri dari empat komponen yang saling terhubung, masing-masing menyelesaikan tugasnya sendiri. Pengembang harus mengimplementasikan keempatnya untuk integrasi penuh dengan sistem.

  • MediaSessionCompat — kelas utama sesi, dibuat dengan tag aplikasi dan menerima PendingIntent untuk tombol media.
  • MediaSession.Callback — penangan perintah. Mengimplementasikan onPlay, onPause, onSkipToNext, onSeekTo, dan metode lainnya.
  • PlaybackStateCompat — status pemutar saat ini. Berisi flag, posisi, kecepatan, dan daftar tindakan yang tersedia.
  • MediaMetadataCompat — metadata media saat ini: judul, artis, album, sampul, durasi.

Siklus hidup MediaSession

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 MediaSession ke dalam aplikasi

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.

Membuat MediaSession dan Callback

kotlin
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.

Mengatur MediaMetadata

kotlin
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.

Memproses perintah media dari Bluetooth dan headset

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.

Menangani skenario kompleks dengan beberapa tombol

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.

Sinkronisasi dengan pusat media sistem

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.

Foreground-service dengan notifikasi

kotlin
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

Bisakah aplikasi memiliki beberapa MediaSession aktif secara bersamaan?

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.

Bagaimana MediaSession berinteraksi dengan Audio Focus?

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.

Mengapa tombol media di headphone tidak berfungsi dengan aplikasi saya?

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.

Apakah MediaBrowserService diperlukan untuk MediaSession?

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.

Bagaimana cara memeriksa apakah MediaSession dikonfigurasi dengan benar?

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

  • MediaSession — cara standar untuk mengelola pemutaran di Android, menggantikan RemoteControlClient mulai dari API 21.
  • Sesi menerima perintah dari Bluetooth, headphone, Android Auto, dan pusat media sistem melalui sistem Callback.
  • PlaybackState dan MediaMetadata — dua komponen wajib untuk sinkronisasi yang benar dengan UI sistem.
  • Integrasi dilakukan melalui MediaSessionCompat dari AndroidX media, yang menyediakan kompatibilitas dengan API 14+.
  • Untuk ditampilkan di pusat media sistem, diperlukan MediaBrowserService dan foreground-service dengan notifikasi MediaStyle.
  • Pengelolaan Audio Focus — tugas terpisah, tidak diotomatisasi oleh MediaSession. Pengembang mengelola fokus secara mandiri.
  • Untuk debugging, gunakan adb shell dumpsys media_session untuk melihat sesi aktif dan statusnya.

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.

Diskusikan proyek

Baca juga