MediaSession میڈیا مواد کے پلے بیک کو منظم کرنے اور بیرونی آلات کے ساتھ انضمام کے لیے Android فریم ورک کا ایک جزو ہے۔ یہ Bluetooth ہیڈسیٹ، ہیڈفون، Android Auto اور سسٹم میڈیا سینٹر کے ساتھ تعامل کے لیے ایک متحد انٹرفیس فراہم کرتا ہے۔ Android Developers Guide, 2026 کے مطابق، MediaSession متروک RemoteControlClient کی جگہ لیتا ہے اور ان پلیئرز کے لیے لازمی ہے جو سسٹم کے ساتھ ہم آہنگ ہوتے ہیں۔
اہم نکات
MediaSession Android میں ایک سسٹم جزو ہے جو ایپ کو اپنی میڈیا سرگرمی کا اعلان کرنے اور بیرونی ذرائع سے کنٹرول کمانڈز وصول کرنے کی اجازت دیتا ہے۔ جب صارف Bluetooth ہیڈسیٹ پر Play بٹن دباتا ہے، سسٹم اس ایونٹ کو فعال MediaSession کو بھیجتا ہے، اور ایپ اپنے Callback کے ذریعے جواب دیتی ہے۔
Android 5.0 سے پہلے، اس مقصد کے لیے RemoteControlClient استعمال ہوتا تھا، لیکن یہ کافی لچک فراہم نہیں کرتا تھا اور جدید منظرناموں — Android Auto، سمارٹ واچز، سمارٹ اسپیکرز — کو سپورٹ نہیں کرتا تھا۔ MediaSession کو API 21 میں متعارف کرایا گیا اور آڈیو اور ویڈیو پلے بیک والی تمام Android ایپس کے لیے حقیقی معیار بن گیا۔
Android ڈویلپر دستاویزات (2026) کے مطابق، ایک ایپ کو ہر آزاد پلے بیک ماخذ کے لیے ایک MediaSession بنانا چاہیے۔ کسی بھی وقت صرف ایک سیشن فعال ہو سکتا ہے — کوئی بھی نیا سیشن خود بخود پچھلے سیشن کو غیر فعال کر دیتا ہے۔
MediaSession کا MediaBrowserService کے ساتھ امتزاج میڈیا مینجمنٹ کا ایک مکمل چکر فراہم کرتا ہے: سروس ایک مواد کا درخت (پلے لسٹس، کیٹلاگ) فراہم کرتی ہے، اور سیشن نیویگیشن اور پلے بیک کمانڈز قبول کرتا ہے۔ یہ Google کی طرف سے میوزک پلیئرز، پوڈکاسٹس اور آڈیو بکس کے لیے تجویز کردہ آرکیٹیکچر ہے۔
MediaBrowserService ایک اطلاع کے ساتھ پیش منظر کی خدمت کے طور پر چلتا ہے، جو Activity کے تباہ ہونے پر بھی ایپ کے کام جاری رکھنے کو یقینی بناتا ہے۔ یہ آڈیو پلیئرز کے لیے اہم ہے جنہیں ایپ کے چھوٹا ہونے پر بھی چلتے رہنا چاہیے۔
سیشن دو قسم کے تعامل کی حمایت کرتا ہے: یہ MediaController (کلائنٹ سائیڈ) سے کمانڈز وصول کرتا ہے اور PlaybackState کے ذریعے حالت نشر کرتا ہے۔ MediaController ایک ہی عمل میں یا کسی علیحدہ ایپ میں ہو سکتا ہے — سسٹم SessionToken کے ذریعے درخواستوں کو روٹ کرتا ہے۔
جب صارف Android آواز اسسٹنٹ کو کال کرتا ہے اور “اگلا ٹریک چلائیں” کہتا ہے، سسٹم MediaBrowserService سے کنکشن کے ذریعے فعال MediaSession ڈھونڈتا ہے اور ACTION_SKIP_TO_NEXT کمانڈ بھیجتا ہے۔ ایپ کا Callback onSkipToNext() کال وصول کرتا ہے اور PlaybackState کو اپ ڈیٹ کرتا ہے۔
setPlaybackState() کے ذریعے PlaybackState کو اپ ڈیٹ کرنا تمام منسلک MediaController مثالوں کو فوری طور پر مطلع کرتا ہے۔ سسٹم میڈیا سینٹر، Bluetooth ڈیوائس اور Android Auto بیک وقت اپ ڈیٹ وصول کرتے ہیں — عام حالات میں تاخیر 50 ms سے زیادہ نہیں ہوتی۔
PlaybackState میں اہم حالت کے جھنڈے ہوتے ہیں: isPlaying، مقام، رفتار، دستیاب اقدامات (play, pause, seek, stop)۔ مناسب طریقے سے بھرے ہوئے PlaybackState کے بغیر، سسٹم نہیں جانتا کہ ایپ کون سی کمانڈز سپورٹ کرتی ہے اور متعلقہ واقعات نہیں بھیجتا۔
میٹا ڈیٹا (MediaMetadata) موجودہ ٹریک کے بارے میں معلومات — عنوان، فنکار، البم آرٹ URI — کے ساتھ حالت کو مکمل کرتا ہے۔ Android Auto اور پہننے کے قابل آلات اسکرین پر معلومات ظاہر کرنے کے لیے MediaMetadata استعمال کرتے ہیں۔ Google I/O 2024 کے مطابق، MediaMetadata کو صحیح طریقے سے بھرنا تیسرے فریق لانچرز میں ایپ کی مرئیت کو 40% بڑھاتا ہے۔
MediaSession آرکیٹیکچر چار باہم جڑے ہوئے اجزاء پر مشتمل ہے، ہر ایک کا اپنا کردار ہے۔ مکمل سسٹم انضمام کے لیے ڈویلپر کو چاروں کو نافذ کرنا ہوگا۔
سیشن کسی سروس یا Activity کے onCreate طریقہ میں MediaSessionCompat(context, tag) کال کرکے بنایا جاتا ہے۔ تخلیق کے بعد، setFlags(FLAG_HANDLES_MEDIA_BUTTONS | FLAG_HANDLES_TRANSPORT_CONTROLS) کال کرنا ضروری ہے۔ onDestroy میں، سسٹم وسائل کو آزاد کرنے کے لیے release() کال کیا جاتا ہے۔
زندگی کے چکر کا غلط انتظام عام غلطیوں میں سے ایک ہے۔ اگر release() نہیں بلایا جاتا، سیشن سسٹم میں رہتا ہے اور اگلی ایپ کو پرانی حالت مل سکتی ہے۔ Android 13+ سیشن لیک پر Logcat انتباہ دکھاتا ہے۔
بنیادی انضمام ایک سیشن بنانے اور Callback نافذ کرنے سے شروع ہوتا ہے۔ AndroidX میڈیا لائبریری سے MediaSessionCompat استعمال کرنے کی سفارش کی جاتی ہے، جو Android کے تمام ورژنز — API 14 سے 35 — کے لیے ایک متحد API فراہم کرتی ہے۔
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()
}
}
اس مثال میں، MusicService ٹیگ اور میڈیا بٹنوں کو ہینڈل کرنے کے لیے جھنڈوں کے ساتھ ایک MediaSession بنایا گیا ہے۔ Callback onPlay اور onPause کو نافذ کرتا ہے، PlaybackState کو اپ ڈیٹ کرتا ہے۔ setActions طریقہ دستیاب اقدامات کا اعلان کرتا ہے جو سسٹم لاک اسکرین اور میڈیا سینٹر پر دکھاتا ہے۔
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_KEY_TITLE اور METADATA_KEY_ARTIST کا استعمال کرتا ہے کاروں کے Bluetooth ڈسپلے اور پہننے کے قابل آلات پر معلومات دکھانے کے لیے۔ اگر کور آرٹ URI سیٹ نہیں کیا جاتا، پلیئر ایک سرمئی پلیس ہولڈر دکھائے گا۔
Bluetooth ہیڈسیٹ AVRCP 1.6+ پروفائل کے ذریعے کمانڈز بھیجتے ہیں۔ Android ان کمانڈز کو ACTION_MEDIA_BUTTON انٹینٹ کے طور پر نشر کرتا ہے، جو FLAG_HANDLES_MEDIA_BUTTONS جھنڈا سیٹ ہونے پر MediaSession کے ذریعے روک لی جاتی ہیں۔
جب صارف Bluetooth ہیڈفون پر Play بٹن دباتا ہے، سسٹم KEYCODE_MEDIA_PLAY کوڈ کے ساتھ ایک KeyEvent بناتا ہے، جو Callback کے onMediaButtonEvent طریقہ کو بھیجا جاتا ہے۔ اگر Callback میں onPlay() نافذ ہے، سسٹم اسے براہ راست کال کرتا ہے۔ ہیڈسیٹ بٹن کے ایک بار دبانے سے KEYCODE_MEDIA_PLAY_PAUSE بھیجا جاتا ہے — پلیئر کو حالت تبدیل کرنی چاہیے۔
جدید Bluetooth ہیڈفون میں 5 تک بٹن ہو سکتے ہیں: والیوم +/-, play/pause, next, previous۔ ہر بٹن اپنا KeyEvent پیدا کرتا ہے، جسے Callback کے ذریعے صحیح طریقے سے ہینڈل کیا جانا چاہیے۔ بہت سے ہیڈسیٹ پر play/pause کا ڈبل پریس عام طور پر اگلے ٹریک (ACTION_SKIP_TO_NEXT) پر جانے کے طور پر تشریح کیا جاتا ہے۔
Android مطابقت تعریف دستاویز (2026) کے مطابق، میڈیا مواد والی تمام ایپس کو KEYCODE_MEDIA_PLAY_PAUSE کو صحیح طریقے سے ہینڈل کرنا چاہیے۔ اس ضرورت کو نظر انداز کرنا Google Play میں موسیقی اور آڈیو زمرہ کے لیے ایپ کی درجہ بندی میں خودکار کمی کا باعث بنتا ہے۔
Android 11 سے شروع کرتے ہوئے، سسٹم میڈیا سینٹر (میڈیا کنٹرول پینل) اطلاعی شیڈ میں 5 حالیہ MediaSession سیشنز تک دکھاتا ہے۔ صارف ایپ کھولے بغیر پلیئر کو کنٹرول کر سکتا ہے۔ درست نمائش کے لیے MediaBrowserService کو نافذ کرنا اور PlaybackState کو صحیح طریقے سے بھرنا ضروری ہے۔
میڈیا کنٹرول پینل دکھاتا ہے: ٹریک کا عنوان، فنکار، کور آرٹ (MediaMetadata سے)، کنٹرول بٹن (PlaybackState کے دستیاب اقدامات سے)۔ اگر ایپ فعال پلے بیک کے دوران ہر 10 سیکنڈ میں کم از کم ایک بار PlaybackState اپ ڈیٹ نہیں کرتی، میڈیا سینٹر سیشن کو پینل سے چھپا دیتا ہے۔
private fun startForegroundService() {
val notification = NotificationCompat.Builder(this, "media_channel")
.setSmallIcon(R.drawable.ic_play)
.setContentTitle("اب چل رہا ہے")
.setContentText(currentTrackTitle)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setStyle(
androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(mediaSession.sessionToken)
)
.build()
startForeground(1001, notification)
}
MediaStyle اطلاع sessionToken کے ذریعے MediaSession سے منسلک ہوتی ہے اور معیاری میڈیا بٹن دکھاتی ہے۔ MediaStyle کے بغیر، اطلاع کنٹرول بٹنوں کے بغیر عام انتباہ کے طور پر ظاہر ہوگی۔ Android 13+ نمائش کے لیے واضح POST_NOTIFICATIONS اجازت درکار ہے۔
اکثر پوچھے گئے سوالات
تکنیکی طور پر ہاں، لیکن کسی بھی وقت صرف ایک سیشن فعال سمجھا جاتا ہے۔ setActive(true) کال کیے بغیر نیا سیشن بنانے پر، پچھلا سیشن فعال رہتا ہے۔ ایپ کے لیے ایک سیشن یا فعال حالت کی تبدیلی کے ساتھ ہر آزاد آڈیو ماخذ کے لیے ایک سیشن رکھنے کی سفارش کی جاتی ہے۔
MediaSession Audio Focus کو خود بخود منظم نہیں کرتا — یہ ایک الگ طریقہ کار ہے۔ onPlay کمانڈ وصول کرنے پر، ڈویلپر کو آزادانہ طور پر AudioManager کے ذریعے AudioFocus کی درخواست کرنی ہوتی ہے، اور فوکس کھونے پر سیشن کے ذریعے پلے بیک روکنا ہوتا ہے۔
چیک کریں کہ FLAG_HANDLES_MEDIA_BUTTONS اور FLAG_HANDLES_TRANSPORT_CONTROLS جھنڈے سیٹ ہیں۔ نیز یقینی بنائیں کہ سیشن فعال ہے (setActive(true))۔ Android 12+ پر، میڈیا بٹن صرف MediaSession کے ذریعے کام کرتے ہیں — پرانا registerMediaButtonEventReceiver تعاون یافتہ نہیں ہے۔
بنیادی بٹن ہینڈلنگ کے لیے — نہیں۔ لیکن Android Auto، Wear OS اور سسٹم میڈیا سینٹر کے ساتھ انضمام کے لیے MediaBrowserService ضروری ہے۔ Google طویل آڈیو پلے بیک والی تمام ایپس میں MediaBrowserService نافذ کرنے کی سفارش کرتا ہے۔
فعال سیشنز، ان کے Callbacks اور PlaybackState دیکھنے کے لیے adb shell dumpsys media_session کمانڈ استعمال کریں۔ یہ افادیت اپنے ٹیگ، سرگرمی کی حالت اور آخری معلوم حالت کے ساتھ تمام رجسٹرڈ سیشن دکھاتی ہے — ڈیبگنگ کے لیے ایک آسان ٹول۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں