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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন