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-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-ı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.
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 ə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 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.
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.
Ə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.
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.
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_TITLE və METADATA_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 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.
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.
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.
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
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-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.
FLAG_HANDLES_MEDIA_BUTTONS və FLAG_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.
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.
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ə
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.
Həm də oxuyun