MediaSession — asosiy tushunchalar, integratsiya va Androidda ishlash mexanizmi

Muallif: IT Sectr Nashr etilgan: 2026-05-23 O'qish vaqti: 8 daq

MediaSession — media kontentini ijro etishni boshqarish va tashqi qurilmalar bilan integratsiya qilish uchun Android freymvorkining komponentidir. U Bluetooth garnituralari, quloqchinlar, Android Auto va tizim media markazi bilan yagona interfeysni ta'minlaydi. Android Developers Guide, 2026 ma'lumotlariga ko'ra, MediaSession eskirgan RemoteControlClient o'rnini egallaydi va tizim bilan sinxronlashadigan pleerlar uchun majburiydir.

Asosiy ma'lumotlar

  • MediaSession — Androidda media oqimlarini boshqarish uchun markaziy komponent, tashqi manbalardan buyruqlarni qabul qiladi.
  • Bluetooth AVRCP, garnituralar, Android Auto, taqiladigan qurilmalar va Android media markazini qo'llab-quvvatlaydi.
  • Sessiya pleer holatini (play/pause/next/previous) va metama'lumotlarni (nom, ijrochi, rasm) tizim bilan sinxronlashtiradi.
  • Ishlashi uchun API 14 gacha orqaga moslikni ta'minlovchi AndroidX dan MediaSessionCompat talab qilinadi.
  • MediaSession.Callback tizimi kiruvchi buyruqlarni qayta ishlaydi va MediaSession holatini o'zgartiradi.

MediaSession nima?

MediaSession — Androidning tizim komponenti bo'lib, ilovaga o'z media faoliyatini e'lon qilish va tashqaridan boshqaruv buyruqlarini qabul qilish imkonini beradi. Foydalanuvchi Bluetooth garniturasida Play tugmasini bosganda, tizim bu hodisani faol MediaSession ga uzatadi va ilova o'z Callback orqali reaksiya bildiradi.

Android 5.0 dan oldin bu maqsadlar uchun RemoteControlClient ishlatilgan, ammo u kerakli moslashuvchanlikni ta'minlamagan va zamonaviy stsenariylarni — Android Auto, aqlli soatlar, aqlli dinamiklarni qo'llab-quvvatlamagan. MediaSession API 21 da joriy qilingan va audio va video ijro etuvchi barcha Android ilovalari uchun de-fakto standartga aylangan.

Android Developer Documentation (2026) ma'lumotlariga ko'ra, ilova har bir mustaqil ijro manbai uchun bitta MediaSession yaratishi kerak. Bir vaqtning o'zida faqat bitta faol sessiya bo'lishi mumkin — har bir yangi sessiya avtomatik ravishda oldingisini faolsizlantiradi.

MediaSession va MediaBrowserService

MediaSessionning MediaBrowserService bilan birlashmasi to'liq media boshqaruv siklini ta'minlaydi: xizmat kontent daraxtini (pleylistlar, kataloglar) taqdim etadi va sessiya navigatsiya va ijro buyruqlarini qabul qiladi. Bu Google tomonidan musiqa pleerlari, podkastlar va audiokitoblar uchun tavsiya etilgan arxitekturadir.

MediaBrowserService bildirishnoma bilan foreground-service sifatida ishga tushadi, bu Activity o'ldirilganda ham ilovaning ishlashini kafolatlaydi. Bu kichraytirilgan ilova vaqtida ijroni davom ettirishi kerak bo'lgan audio pleerlar uchun juda muhimdir.

MediaSession qanday ishlaydi

Sessiya ikki turdagi o'zaro aloqani qo'llab-quvvatlaydi: u MediaController dan (mijoz tomoni) buyruqlarni qabul qiladi va PlaybackState orqali holatni tarqatadi. MediaController bir xil jarayonda yoki alohida ilovada bo'lishi mumkin — tizim so'rovlarni SessionToken orqali yo'naltiradi.

Foydalanuvchi Android ovozli yordamchisini chaqirib “Keyingi trekni yoq” deb aytganda, tizim MediaBrowserService bilan bog'lanish orqali faol MediaSessionni topadi va ACTION_SKIP_TO_NEXT buyrug'ini yuboradi. Ilovaning Callback i onSkipToNext() chaqiruvini oladi va PlaybackState ni yangilaydi.

setPlaybackState() orqali PlaybackState ni yangilash barcha ulangan MediaController larni darhol xabardor qiladi. Tizim media markazi, Bluetooth qurilmasi va Android Auto bir vaqtda yangilanishni oladi — kechikish normal sharoitda 50 ms dan oshmaydi.

PlaybackState va uning metama'lumotlari

PlaybackState asosiy holat bayroqlarini o'z ichiga oladi: isPlaying, pozitsiya, tezlik, mavjud harakatlar (play, pause, seek, stop). To'g'ri to'ldirilgan PlaybackState bo'lmasa, tizim ilova qaysi buyruqlarni qo'llab-quvvatlashini bilmaydi va tegishli hodisalarni yubormaydi.

Metama'lumotlar (MediaMetadata) joriy trek haqidagi ma'lumotlar bilan holatni to'ldiradi — title, artist, album art URI. Android Auto va taqiladigan qurilmalar MediaMetadata dan ekranda ma'lumot ko'rsatish uchun foydalanadi. Google I/O 2024 ma'lumotlariga ko'ra, MediaMetadata ni to'g'ri to'ldirish ilovaning uchinchi tomon launcherlarida ko'rinishini 40% ga oshiradi.

MediaSessionning asosiy komponentlari

MediaSession arxitekturasi to'rtta o'zaro bog'liq komponentdan iborat bo'lib, har biri o'z vazifasini hal qiladi. Dasturchi tizim bilan to'liq integratsiya uchun barcha to'rttasini amalga oshirishi kerak.

  • MediaSessionCompat — sessiyaning asosiy klassi, ilova tegi bilan yaratiladi va media tugmalari uchun PendingIntent qabul qiladi.
  • MediaSession.Callback — buyruqlarni qayta ishlovchi. onPlay, onPause, onSkipToNext, onSeekTo va boshqa metodlarni amalga oshiradi.
  • PlaybackStateCompat — pleerning joriy holati. Bayroqlar, pozitsiya, tezlik va mavjud harakatlar ro'yxatini o'z ichiga oladi.
  • MediaMetadataCompat — joriy medianing metama'lumotlari: nom, ijrochi, albom, rasm, davomiylik.

MediaSessionning hayot sikli

Sessiya xizmat yoki Activity ning onCreate ida MediaSessionCompat(context, tag) chaqiruvi bilan yaratiladi. Yaratilgandan so'ng majburiy ravishda setFlags(FLAG_HANDLES_MEDIA_BUTTONS | FLAG_HANDLES_TRANSPORT_CONTROLS) chaqirilishi kerak. onDestroy da tizim resurslarini bo'shatish uchun release() chaqiriladi.

Hayot siklini noto'g'ri boshqarish keng tarqalgan xatolardan biridir. Agar release() chaqirilmasa, sessiya tizimda qoladi va keyingi ilova noto'g'ri holatni olishi mumkin. Android 13+ sessiya oqishlarida Logcat da ogohlantirish ko'rsatadi.

MediaSessionni ilovaga integratsiya qilish

Asosiy integratsiya sessiyani yaratish va Callback ni amalga oshirish bilan boshlanadi. API 14 dan 35 gacha barcha Android versiyalari uchun yagona API ni ta'minlovchi AndroidX media kutubxonasidan MediaSessionCompat dan foydalanish tavsiya etiladi.

MediaSession va Callback ni yaratish

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()
    }
}

Misolda MusicService tegi va media tugmalarini qayta ishlash uchun bayroqlar bilan MediaSession yaratiladi. Callback onPlay va onPause ni amalga oshiradi, PlaybackState ni yangilaydi. setActions metodi tizim bloklash ekranida va media markazida ko'rsatadigan mavjud harakatlarni e'lon qiladi.

MediaMetadata ni sozlash

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)
}

Metama'lumotlar har bir trek o'zgarishida yangilanishi kerak. Tizim METADATA_KEY_TITLE va METADATA_KEY_ARTIST dan avtomobil Bluetooth displeylari va taqiladigan qurilmalarda ma'lumot ko'rsatish uchun foydalanadi. Agar rasm URI o'rnatilmasa, pleer kulrang placeholder ko'rsatadi.

Bluetooth va quloqchinlardan media buyruqlarini qayta ishlash

Bluetooth garnituralari buyruqlarni AVRCP 1.6+ profili orqali yuboradi. Android bu buyruqlarni ACTION_MEDIA_BUTTON intentlariga uzatadi, ular FLAG_HANDLES_MEDIA_BUTTONS bayrog'i o'rnatilganda MediaSession tomonidan ushlanadi.

Foydalanuvchi Bluetooth quloqchinlarida Play tugmasini bosganda, tizim KEYCODE_MEDIA_PLAY kodi bilan KeyEvent yaratadi, u Callbackning onMediaButtonEvent metodiga yuboriladi. Agar Callbackda onPlay() amalga oshirilgan bo'lsa, tizim uni to'g'ridan-to'g'ri chaqiradi. Garniturada tugmani bir marta bosish KEYCODE_MEDIA_PLAY_PAUSE ni yuboradi — pleer holatni o'zgartirishi kerak.

Ko'p tugmali murakkab stsenariylarni qayta ishlash

Zamonaviy Bluetooth quloqchinlari 5 tagacha tugmaga ega bo'lishi mumkin: ovoz +/-, play/pause, next, previous. Har bir tugma o'z KeyEvent ini yaratadi, uni Callback to'g'ri qayta ishlashi kerak. Ko'p quloqchinlarda play/pause ni ikki marta bosish odatda keyingi trekka o'tish (ACTION_SKIP_TO_NEXT) sifatida talqin qilinadi.

Android Compatibility Definition Document (2026) ma'lumotlariga ko'ra, media kontentli barcha ilovalar KEYCODE_MEDIA_PLAY_PAUSE ni to'g'ri qayta ishlashi shart. Ushbu talabni e'tiborsiz qoldirish Google Play da Musiqa va Audio toifasida ilova reytingining avtomatik pasayishiga olib keladi.

Tizim media markazi bilan sinxronlashtirish

Android 11 dan boshlab, tizim media markazi (Media Control Panel) bildirishnomalar panelida 5 ta oxirgi MediaSession ni ko'rsatadi. Foydalanuvchi ilovani ochmasdan pleerni boshqarishi mumkin. To'g'ri ko'rsatish uchun MediaBrowserService ni amalga oshirish va PlaybackState ni to'g'ri to'ldirish kerak.

Media Control Panel ko'rsatadi: trek nomi, ijrochi, rasm (MediaMetadata dan), boshqaruv tugmalari (PlaybackState ning ruxsat etilgan harakatlaridan). Agar ilova faol ijro vaqtida PlaybackState ni kamida 10 sekundda bir marta yangilamasa, media markazi sessiyani paneldan yashiradi.

Bildirishnoma bilan foreground-service

kotlin
private fun startForegroundService() {
    val notification = NotificationCompat.Builder(this, "media_channel")
        .setSmallIcon(R.drawable.ic_play)
        .setContentTitle("Hozir ijro etilmoqda")
        .setContentText(currentTrackTitle)
        .setPriority(NotificationCompat.PRIORITY_LOW)
        .setStyle(
            androidx.media.app.NotificationCompat.MediaStyle()
                .setMediaSession(mediaSession.sessionToken)
        )
        .build()
    startForeground(1001, notification)
}

MediaStyle bildirishnomasi sessionToken orqali MediaSession bilan bog'lanadi va standart media tugmalarini ko'rsatadi. MediaStyle bo'lmasa, bildirishnoma boshqaruv tugmalarisiz oddiy ogohlantirish kabi ko'rinadi. Android 13+ ko'rsatish uchun aniq POST_NOTIFICATIONS ruxsatini talab qiladi.

Tez-tez so'raladigan savollar

Ilova bir vaqtning o'zida bir nechta faol MediaSession ga ega bo'lishi mumkinmi?

Texnik jihatdan ha, lekin bir vaqtning o'zida faqat bitta sessiya faol hisoblanadi. setActive(true) chaqirmasdan yangi sessiya yaratilganda oldingisi faol qoladi. Har bir ilova yoki har bir mustaqil audio manbai uchun bitta sessiyani faol holatni almashtirish bilan tavsiya etiladi.

MediaSession Audio Focus bilan qanday o'zaro aloqada bo'ladi?

MediaSession Audio Focus ni avtomatik boshqarmaydi — bu alohida mexanizm. onPlay buyrug'ini olganda dasturchi AudioManager orqali AudioFocus ni o'zi so'raydi, fokus yo'qolganda esa sessiya orqali ijroni to'xtatadi.

Nega quloqchinlardagi media tugmalari mening ilovam bilan ishlamaydi?

FLAG_HANDLES_MEDIA_BUTTONS va FLAG_HANDLES_TRANSPORT_CONTROLS bayroqlarining o'rnatilganligini tekshiring. Shuningdek, sessiya faol ekanligiga ishonch hosil qiling (setActive(true)). Android 12+ da media tugmalari faqat MediaSession orqali ishlaydi — eski registerMediaButtonEventReceiver qo'llab-quvvatlanmaydi.

MediaSession ishlashi uchun MediaBrowserService kerakmi?

Tugmalarni asosiy qayta ishlash uchun — yo'q. Lekin Android Auto, Wear OS va tizim media markazi bilan integratsiya uchun MediaBrowserService talab qilinadi. Google uzoq muddatli audio ijro etuvchi barcha ilovalarda MediaBrowserService ni amalga oshirishni tavsiya qiladi.

MediaSession to'g'ri sozlanganligini qanday tekshirish mumkin?

Faol sessiyalar, ularning Callback va PlaybackState larni ko'rish uchun adb shell dumpsys media_session buyrug'idan foydalaning. Asbob barcha ro'yxatdan o'tgan sessiyalarni teg, faollik va oxirgi ma'lum holat bilan ko'rsatadi — nosozliklarni tuzatish uchun qulay vosita.

Xulosa

  • MediaSession — Androidda ijroni boshqarishning standart usuli, API 21 dan boshlab RemoteControlClient o'rnini egallaydi.
  • Sessiya Bluetooth, quloqchinlar, Android Auto va tizim media markazidan Callback tizimi orqali buyruqlarni qabul qiladi.
  • PlaybackState va MediaMetadata — tizim UI bilan to'g'ri sinxronlash uchun ikkita majburiy komponent.
  • Integratsiya API 14+ bilan moslikni ta'minlovchi AndroidX media dan MediaSessionCompat orqali amalga oshiriladi.
  • Tizim media markazida ko'rsatish uchun MediaBrowserService va MediaStyle bildirishnomasi bilan foreground-service talab qilinadi.
  • Audio Focus ni boshqarish — MediaSession tomonidan avtomatlashtirilmaydigan alohida vazifa. Dasturchi fokusni o'zi boshqaradi.
  • Nosozliklarni tuzatish uchun faol sessiyalar va ularning holatini ko'rish uchun adb shell dumpsys media_session dan foydalaning.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing