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)
}
मेटाडेटा प्रत्येक ट्रैक परिवर्तन पर अपडेट किया जाना चाहिए। सिस्टम कार Bluetooth डिस्प्ले और पहनने योग्य उपकरणों पर जानकारी प्रदर्शित करने के लिए METADATA_KEY_TITLE और METADATA_KEY_ARTIST का उपयोग करता है। यदि कवर आर्ट 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें