MediaSession — əsas anlayışlar, inteqrasiya və Android-də işləmə mexanizmi

Müəllif: IT Sectr Dərc olunub: 2026-05-23 Oxuma vaxtı: 8 dəq

MediaSession — Android freymvorkunun media məzmununun idarə edilməsi və xarici cihazlarla inteqrasiyası üçün komponentidir. O, Bluetooth qulaqlıqları, qulaqlıqlar, Android Auto və sistem media mərkəzi ilə vahid əlaqə interfeysi təmin edir. Android Developers Guide, 2026 məlumatlarına görə, MediaSession köhnəlmiş RemoteControlClient-i əvəz edir və sistemlə sinxronlaşan pleyerlər üçün məcburidir.

Əsas məqamlar

  • MediaSession — Android-də media axınlarını idarə etmək üçün mərkəzi komponent, xarici mənbələrdən əmrləri qəbul edir.
  • O, Bluetooth AVRCP, qulaqlıq dəstləri, Android Auto, geyilə bilən cihazlar və Android media mərkəzini dəstəkləyir.
  • Sessiya pleyer vəziyyətini (play/pause/next/previous) və metadatanı (ad, ifaçı, şəkil) sistemlə sinxronlaşdırır.
  • İşləməsi üçün API 14-ə qədər geriyə uyğunluğu təmin edən AndroidX-dən MediaSessionCompat tələb olunur.
  • MediaSession.Callback sistemi daxil olan əmrləri emal edir və MediaSession vəziyyətini dəyişir.

MediaSession nədir?

MediaSession — Android-in sistem komponentidir ki, tətbiqə öz media fəaliyyətini bəyan etməyə və kənardan idarəetmə əmrləri qəbul etməyə imkan verir. İstifadəçi Bluetooth qulaqlıq dəstində Play düyməsini basdıqda, sistem bu hadisəni aktiv MediaSession-a ötürür və tətbiq öz Callback vasitəsilə reaksiya verir.

Android 5.0-dan əvvəl bu məqsədlər üçün RemoteControlClient istifadə olunurdu, lakin o, lazımi çevikliyi təmin etmirdi və müasir ssenariləri — Android Auto, geyilə bilən saatlar, ağıllı dinamikləri dəstəkləmirdi. MediaSession API 21-də təqdim edildi və audio və video ifa edən bütün Android tətbiqləri üçün de-fakto standart oldu.

Android Developer Documentation (2026) məlumatlarına görə, tətbiq hər müstəqil ifa mənbəyi üçün bir MediaSession yaratmalıdır. Eyni zamanda yalnız bir aktiv sessiya ola bilər — hər yeni sessiya avtomatik olaraq əvvəlkini deaktiv edir.

MediaSession və MediaBrowserService

MediaSession-ın MediaBrowserService ilə birləşməsi tam media idarəetmə dövriyyəsini təmin edir: xidmət məzmun ağacını (pleylistlər, kataloqlar) təqdim edir və sessiya naviqasiya və ifa əmrlərini qəbul edir. Bu, Google tərəfindən musiqi pleyerləri, podkastlar və audiokitablar üçün tövsiyə olunan arxitekturadır.

MediaBrowserService foreground-service kimi bildirişlə işə salınır ki, bu da Activity öldürüldükdə belə tətbiqin işləməsini təmin edir. Bu, kiçildilmiş tətbiq zamanı ifanı davam etdirməli olan audio pleyerlər üçün kritik əhəmiyyət daşıyır.

MediaSession necə işləyir

Sessiya iki növ qarşılıqlı əlaqəni dəstəkləyir: o, MediaController-dan (müştəri tərəfi) əmrləri qəbul edir və PlaybackState vasitəsilə vəziyyəti yayımlayır. MediaController eyni prosesdə və ya ayrıca tətbiqdə ola bilər — sistem sorğuları SessionToken vasitəsilə yönləndirir.

İstifadəçi Android-in səs köməkçisini çağırıb "Növbəti mahnını işə sal" dedikdə, sistem MediaBrowserService ilə əlaqə üzrə aktiv MediaSession-ı tapır və ACTION_SKIP_TO_NEXT əmrini göndərir. Tətbiqin Callback-i onSkipToNext() çağırışını alır və PlaybackState-i yeniləyir.

setPlaybackState() vasitəsilə PlaybackState-in yenilənməsi dərhal bütün qoşulmuş MediaController-ları xəbərdar edir. Sistem media mərkəzi, Bluetooth cihazı və Android Auto eyni anda yeniləmə alır — gecikmə normal şəraitdə 50 ms-dən çox deyil.

PlaybackState və onun metadatası

PlaybackState əsas vəziyyət bayraqlarını ehtiva edir: isPlaying, mövqe, sürət, mövcud hərəkətlər (play, pause, seek, stop). Düzgün doldurulmuş PlaybackState olmadan sistem tətbiqin hansı əmrləri dəstəklədiyini bilmir və müvafiq hadisələri göndərmir.

Metadataya (MediaMetadata) cari treklə bağlı məlumat daxildir — title, artist, album art URI. Android Auto və geyilə bilən cihazlar MediaMetadata-dan ekranda məlumat göstərmək üçün istifadə edir. Google I/O 2024 məlumatlarına görə, MediaMetadata-ın düzgün doldurulması tətbiqin üçüncü tərəf launcherlərində görünməsini 40% artırır.

MediaSession-ın əsas komponentləri

MediaSession arxitekturası dörd qarşılıqlı əlaqəli komponentdən ibarətdir, hər biri öz vəzifəsini həll edir. Tərtibatçı sistemlə tam inteqrasiya üçün dördünü də tətbiq etməlidir.

  • MediaSessionCompat — sessiyanın əsas sinfi, tətbiq teqi ilə yaradılır və media düymələri üçün PendingIntent qəbul edir.
  • MediaSession.Callback — əmrlərin işləyicisi. onPlay, onPause, onSkipToNext, onSeekTo və digər metodları tətbiq edir.
  • PlaybackStateCompat — pleyerin cari vəziyyəti. Bayraqları, mövqeyi, sürəti və mövcud hərəkətlərin siyahısını ehtiva edir.
  • MediaMetadataCompat — cari medianın metadatası: ad, ifaçı, albom, şəkil, müddət.

MediaSession-ın həyat dövrü

Sessiya xidmətin və ya Activity-nin onCreate-ində MediaSessionCompat(context, tag) çağırışı ilə yaradılır. Yaradıldıqdan sonra mütləq setFlags(FLAG_HANDLES_MEDIA_BUTTONS | FLAG_HANDLES_TRANSPORT_CONTROLS) çağırılmalıdır. onDestroy-də sistem resurslarını boşaltmaq üçün release() çağırılır.

Həyat dövrünün düzgün idarə edilməmisi ümumi səhvlərdən biridir. Əgər release() çağırılmasa, sessiya sistemdə qalır və növbəti tətbiq yalançı vəziyyət ala bilər. Android 13+ sessiya sızmaları zamanı Logcat-də xəbərdarlıq göstərir.

MediaSession-ın tətbiqə inteqrasiyası

Əsas inteqrasiya sessiyanın yaradılması və Callback-in tətbiqi ilə başlayır. API 14-dən 35-ə qədər bütün Android versiyaları üçün vahid API təmin edən AndroidX media kitabxanasından MediaSessionCompat istifadə etmək tövsiyə olunur.

MediaSession və Callback-in yaradılması

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

Nümunədə MusicService teqi və media düymələrini idarə etmək üçün bayraqlarla MediaSession yaradılır. Callback onPlay və onPause-u tətbiq edir, PlaybackState-i yeniləyir. setActions metodu sistemin bloklama ekranında və media mərkəzində göstərdiyi mövcud hərəkətləri bəyan edir.

MediaMetadata-ın qurulması

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

Metadataya hər treklə dəyişmə zamanı yenilənməlidir. Sistem METADATA_KEY_TITLEMETADATA_KEY_ARTIST-dən avtomobil Bluetooth displeylərində və geyilə bilən cihazlarda məlumat göstərmək üçün istifadə edir. Şəkil URI təyin edilməzsə, pleyer boz placeholder göstərəcək.

Bluetooth və qulaqlıqlardan media əmrlərinin idarə edilməsi

Bluetooth qulaqlıq dəstləri əmrləri AVRCP 1.6+ profili vasitəsilə göndərir. Android bu əmrləri ACTION_MEDIA_BUTTON intent-lərinə ötürür, onlar FLAG_HANDLES_MEDIA_BUTTONS bayrağı qoyulduqda MediaSession tərəfindən tutulur.

İstifadəçi Bluetooth qulaqlıqlarında Play düyməsini basdıqda, sistem KEYCODE_MEDIA_PLAY kodu ilə KeyEvent yaradır ki, bu da Callback-in onMediaButtonEvent metoduna göndərilir. Əgər Callback-də onPlay() tətbiq edilibsə, sistem onu birbaşa çağırır. Qulaqlıq dəstində düymənin tək basılması KEYCODE_MEDIA_PLAY_PAUSE göndərir — pleyer vəziyyəti dəyişməlidir.

Çox düyməli mürəkkəb ssenarilərin idarə edilməsi

Müasir Bluetooth qulaqlıqları 5 düyməyə qədər ola bilər: səs +/-, play/pause, next, previous. Hər düymə öz KeyEvent-ni yaradır ki, bu da Callback tərəfindən düzgün işlənməlidir. Bir çox qulaqlıqda play/pause-un iki dəfə basılması adətən növbəti treklə keçid (ACTION_SKIP_TO_NEXT) kimi şərh olunur.

Android Compatibility Definition Document (2026) məlumatlarına görə, media məzmunlu bütün tətbiqlər KEYCODE_MEDIA_PLAY_PAUSE-u düzgün idarə etməlidir. Bu tələbin göz ardı edilməsi Google Play-də Musiqi və Audio kateqoriyasında tətbiqin reytinqinin avtomatik aşağı salınmasına gətirib çıxarır.

Sistem media mərkəzi ilə sinxronizasiya

Android 11-dən başlayaraq, sistem media mərkəzi (Media Control Panel) bildiriş panelində 5 son MediaSession-ı göstərir. İstifadəçi tətbiqi açmadan pleyeri idarə edə bilər. Düzgün göstərmək üçün MediaBrowserService tətbiq etmək və PlaybackState-i düzgün doldurmaq lazımdır.

Media Control Panel göstərir: trekin adı, ifaçı, şəkil (MediaMetadata-dan), idarəetmə düymələri (PlaybackState-in icazə verilən hərəkətlərindən). Əgər tətbiq aktiv ifa zamanı PlaybackState-i ən azı 10 saniyədə bir dəfə yeniləmirsə, media mərkəzi sessiyanı paneldən gizlədir.

Bildirişlə foreground-service

kotlin
private fun startForegroundService() {
    val notification = NotificationCompat.Builder(this, "media_channel")
        .setSmallIcon(R.drawable.ic_play)
        .setContentTitle("Hal-hazırda ifa olunur")
        .setContentText(currentTrackTitle)
        .setPriority(NotificationCompat.PRIORITY_LOW)
        .setStyle(
            androidx.media.app.NotificationCompat.MediaStyle()
                .setMediaSession(mediaSession.sessionToken)
        )
        .build()
    startForeground(1001, notification)
}

MediaStyle bildirişi sessionToken vasitəsilə MediaSession ilə əlaqələndirilir və standart media düymələrini göstərir. MediaStyle olmadan bildiriş idarəetmə düymələri olmayan adlı bildiriş kimi görünəcək. Android 13+ göstərmək üçün açıq POST_NOTIFICATIONS icazəsi tələb edir.

Tez-tez verilən suallar

Tətbiq eyni anda bir neçə aktiv MediaSession-a malik ola bilərmi?

Texniki olaraq bəli, lakin bir anda yalnız bir sessiya aktiv hesab olunur. setActive(true) çağırmadan yeni sessiya yaradıldıqda əvvəlki aktiv qalır. Tətbiq üçün bir sessiya və ya hər müstəqil audio mənbəyi üçün bir sessiya aktiv vəziyyəti dəyişməklə olması tövsiyə olunur.

MediaSession Audio Focus ilə necə qarşılıqlı əlaqə qurur?

MediaSession Audio Focus-u avtomatik idarə etmir — bu ayrı mexanizmdir. onPlay əmri alındıqda tərtibatçı AudioManager vasitəsilə AudioFocus-u özü tələb edir, fokus itirildikdə isə sessiya vasitəsilə ifanı dayandırır.

Niyə qulaqlıqlardakı media düymələri mənim tətbiqimlə işləmir?

FLAG_HANDLES_MEDIA_BUTTONSFLAG_HANDLES_TRANSPORT_CONTROLS bayraqlarının qoyulduğunu yoxlayın. Həmçinin sessiyanın aktiv olduğundan əmin olun (setActive(true)). Android 12+-də media düymələri yalnız MediaSession vasitəsilə işləyir — köhnə registerMediaButtonEventReceiver dəstəklənmir.

MediaSession-un işləməsi üçün MediaBrowserService lazımdırmı?

Düymələrin əsas idarə edilməsi üçün — yox. Lakin Android Auto, Wear OS və sistem media mərkəzi ilə inteqrasiya üçün MediaBrowserService tələb olunur. Google uzunmüddətli audio ifa edən bütün tətbiqlərdə MediaBrowserService tətbiq etməyi tövsiyə edir.

MediaSession-un düzgün qurulduğunu necə yoxlamaq olar?

Aktiv sessiyaları, onların Callback və PlaybackState-lərini görmək üçün adb shell dumpsys media_session əmrindən istifadə edin. Alət bütün qeydiyyatdan keçmiş sessiyaları teq, aktivlik və son məlum vəziyyətlə göstərəcək — sazlama üçün əlverişli vasitədir.

Nəticə

  • MediaSession — Android-də ifanı idarə etməyin standart üsulu, API 21-dən başlayaraq RemoteControlClient-i əvəz edir.
  • Sessiya Bluetooth, qulaqlıqlar, Android Auto və sistem media mərkəzindən Callback sistemi vasitəsilə əmrlər qəbul edir.
  • PlaybackStateMediaMetadata — sistem UI ilə düzgün sinxronizasiya üçün iki məcburi komponent.
  • İnteqrasiya API 14+ ilə uyğunluğu təmin edən AndroidX media-dan MediaSessionCompat vasitəsilə həyata keçirilir.
  • Sistem media mərkəzində göstərmək üçün MediaBrowserService və MediaStyle bildirişi ilə foreground-service tələb olunur.
  • Audio Focus-un idarə edilməsi — MediaSession tərəfindən avtomatlaşdırılmayan ayrı tapşırıqdır. Tərtibatçı fokusu özü idarə edir.
  • Sazlama üçün aktiv sessiyaları və onların vəziyyətini görmək üçün adb shell dumpsys media_session istifadə edin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun