MediaSession — মূল ধারণা, ইন্টিগ্রেশন এবং Android-এ কার্যপ্রণালী

লেখক: IT Sectr প্রকাশিত: 2026-05-23 পড়ার সময়: 8 মিনিট

MediaSession হল Android ফ্রেমওয়ার্কের একটি উপাদান যা মিডিয়া কন্টেন্ট প্লেব্যাক পরিচালনা এবং বাহ্যিক ডিভাইসের সাথে ইন্টিগ্রেশনের জন্য। এটি Bluetooth হেডসেট, হেডফোন, Android Auto এবং সিস্টেম মিডিয়া সেন্টারের সাথে ইন্টারঅ্যাকশনের জন্য একটি ইউনিফাইড ইন্টারফেস প্রদান করে। Android Developers Guide, 2026 অনুযায়ী, MediaSession পুরনো RemoteControlClient-এর স্থলাভিষিক্ত হয়েছে এবং সিস্টেমের সাথে সিঙ্ক করা প্লেয়ারগুলির জন্য বাধ্যতামূলক।

মূল পয়েন্ট

  • MediaSession Android-এ মিডিয়া স্ট্রিম পরিচালনার জন্য কেন্দ্রীয় উপাদান, যা বাহ্যিক উৎস থেকে কমান্ড গ্রহণ করে।
  • এটি Bluetooth AVRCP, হেডসেট, Android Auto, পরিধেয় ডিভাইস এবং Android মিডিয়া সেন্টার সমর্থন করে।
  • সেশন প্লেয়ারের অবস্থা (play/pause/next/previous) এবং মেটাডেটা (শিরোনাম, শিল্পী, কভার আর্ট) সিস্টেমের সাথে সিঙ্ক করে।
  • এটির জন্য AndroidX থেকে MediaSessionCompat প্রয়োজন, যা API 14 পর্যন্ত পশ্চাদগামী সামঞ্জস্য প্রদান করে।
  • MediaSession.Callback সিস্টেম আগত কমান্ড প্রক্রিয়া করে এবং MediaSession-এর অবস্থা পরিবর্তন করে।

MediaSession কী?

MediaSession হল Android-এর একটি সিস্টেম উপাদান যা একটি অ্যাপকে তার মিডিয়া কার্যকলাপ ঘোষণা করতে এবং বাহ্যিক উৎস থেকে নিয়ন্ত্রণ কমান্ড গ্রহণ করতে দেয়। যখন ব্যবহারকারী Bluetooth হেডসেটে Play বাটন চাপেন, সিস্টেম এই ইভেন্টটি সক্রিয় MediaSession-এ পাঠায় এবং অ্যাপ তার Callback-এর মাধ্যমে প্রতিক্রিয়া জানায়।

Android 5.0-এর আগে, এই উদ্দেশ্যে RemoteControlClient ব্যবহার করা হত, কিন্তু এটি পর্যাপ্ত নমনীয়তা প্রদান করেনি এবং আধুনিক পরিস্থিতি — Android Auto, স্মার্টওয়াচ, স্মার্ট স্পিকার — সমর্থন করত না। MediaSession API 21-এ চালু হয় এবং অডিও এবং ভিডিও প্লেব্যাক সহ সমস্ত Android অ্যাপের জন্য ডি ফ্যাক্টো মানদণ্ডে পরিণত হয়।

Android ডেভেলপার ডকুমেন্টেশন (2026) অনুযায়ী, একটি অ্যাপের প্রতিটি স্বাধীন প্লেব্যাক উৎসের জন্য একটি করে MediaSession তৈরি করা উচিত। যেকোনো সময়ে শুধুমাত্র একটি সেশন সক্রিয় থাকতে পারে — যেকোনো নতুন সেশন স্বয়ংক্রিয়ভাবে আগেরটি নিষ্ক্রিয় করে দেয়।

MediaSession এবং MediaBrowserService

MediaSession-এর সাথে MediaBrowserService-এর সংমিশ্রণ মিডিয়া পরিচালনার একটি সম্পূর্ণ চক্র প্রদান করে: পরিষেবা একটি কন্টেন্ট ট্রি (প্লেলিস্ট, ক্যাটালগ) প্রদান করে এবং সেশন নেভিগেশন এবং প্লেব্যাক কমান্ড গ্রহণ করে। এটি Google-এর সুপারিশকৃত আর্কিটেকচার মিউজিক প্লেয়ার, পডকাস্ট এবং অডিওবুকের জন্য।

MediaBrowserService একটি নোটিফিকেশনসহ ফোরগ্রাউন্ড পরিষেবা হিসেবে চলে, যা Activity নষ্ট হয়ে গেলেও অ্যাপের কাজ চালিয়ে যাওয়া নিশ্চিত করে। এটি অডিও প্লেয়ারগুলির জন্য গুরুত্বপূর্ণ যেগুলিকে অ্যাপ মিনিমাইজ করেও চালিয়ে যেতে হয়।

MediaSession কীভাবে কাজ করে

সেশন দুটি ধরণের ইন্টারঅ্যাকশন সমর্থন করে: এটি MediaController (ক্লায়েন্ট পক্ষ) থেকে কমান্ড গ্রহণ করে এবং PlaybackState-এর মাধ্যমে অবস্থা সম্প্রচার করে। MediaController একই প্রক্রিয়ায় বা আলাদা অ্যাপে থাকতে পারে — সিস্টেম SessionToken-এর মাধ্যমে অনুরোধ রুট করে।

যখন ব্যবহারকারী Android ভয়েস অ্যাসিস্ট্যান্টকে কল করে এবং “পরবর্তী ট্র্যাক চালান” বলে, সিস্টেম MediaBrowserService-এর সাথে সংযোগের মাধ্যমে সক্রিয় MediaSession খুঁজে পায় এবং ACTION_SKIP_TO_NEXT কমান্ড পাঠায়। অ্যাপের Callback onSkipToNext() কল পায় এবং PlaybackState আপডেট করে।

setPlaybackState()-এর মাধ্যমে PlaybackState আপডেট করা সমস্ত সংযুক্ত MediaController ইনস্ট্যান্সকে তাৎক্ষণিকভাবে জানিয়ে দেয়। সিস্টেম মিডিয়া সেন্টার, Bluetooth ডিভাইস এবং Android Auto একসাথে আপডেট পায় — সাধারণ অবস্থায় বিলম্ব 50 ms-এর বেশি হয় না।

PlaybackState এবং এর মেটাডেটা

PlaybackState-এ মূল অবস্থার ফ্ল্যাগ থাকে: isPlaying, অবস্থান, গতি, উপলব্ধ কর্ম (play, pause, seek, stop)। সঠিকভাবে পূর্ণ PlaybackState ছাড়া, সিস্টেম জানে না অ্যাপ কোন কমান্ড সমর্থন করে এবং সংশ্লিষ্ট ইভেন্ট পাঠায় না।

মেটাডেটা (MediaMetadata) বর্তমান ট্র্যাক সম্পর্কে তথ্য দিয়ে অবস্থা সম্পূরক করে — শিরোনাম, শিল্পী, অ্যালবাম আর্ট URI। Android Auto এবং পরিধেয় ডিভাইস স্ক্রিনে তথ্য প্রদর্শনের জন্য MediaMetadata ব্যবহার করে। Google I/O 2024 অনুযায়ী, সঠিক MediaMetadata পূরণ তৃতীয় পক্ষের লঞ্চারগুলিতে অ্যাপের দৃশ্যমানতা 40% বাড়ায়।

MediaSession-এর মূল উপাদান

MediaSession আর্কিটেকচারে চারটি পরস্পর সংযুক্ত উপাদান রয়েছে, প্রতিটির নিজস্ব কাজ রয়েছে। সম্পূর্ণ সিস্টেম ইন্টিগ্রেশনের জন্য ডেভেলপারকে চারটিই বাস্তবায়ন করতে হবে।

  • MediaSessionCompat — মূল সেশন ক্লাস, একটি অ্যাপ ট্যাগ দিয়ে তৈরি এবং মিডিয়া বাটনের জন্য PendingIntent গ্রহণ করে।
  • MediaSession.Callback — কমান্ড হ্যান্ডলার। onPlay, onPause, onSkipToNext, onSeekTo এবং অন্যান্য পদ্ধতি বাস্তবায়ন করে।
  • PlaybackStateCompat — বর্তমান প্লেয়ারের অবস্থা। ফ্ল্যাগ, অবস্থান, গতি এবং উপলব্ধ কর্মের তালিকা ধারণ করে।
  • MediaMetadataCompat — বর্তমান মিডিয়ার মেটাডেটা: শিরোনাম, শিল্পী, অ্যালবাম, কভার আর্ট, সময়কাল।

MediaSession জীবনচক্র

সেশন একটি পরিষেবা বা Activity-র onCreate পদ্ধতিতে MediaSessionCompat(context, tag) কল করে তৈরি করা হয়। তৈরির পরে, setFlags(FLAG_HANDLES_MEDIA_BUTTONS | FLAG_HANDLES_TRANSPORT_CONTROLS) কল করা আবশ্যক। onDestroy-এ, সিস্টেম সম্পদ মুক্ত করতে release() কল করা হয়।

ভুল জীবনচক্র ব্যবস্থাপনা সাধারণ ভুলগুলির মধ্যে একটি। যদি release() কল না করা হয়, সেশন সিস্টেমে থেকে যায় এবং পরবর্তী অ্যাপ পুরনো অবস্থা পেতে পারে। Android 13+ সেশন লিকের জন্য Logcat সতর্কতা দেখায়।

অ্যাপ্লিকেশনে MediaSession ইন্টিগ্রেশন

মৌলিক ইন্টিগ্রেশন একটি সেশন তৈরি এবং Callback বাস্তবায়নের মাধ্যমে শুরু হয়। AndroidX মিডিয়া লাইব্রেরি থেকে MediaSessionCompat ব্যবহার করার পরামর্শ দেওয়া হয়, যা সমস্ত Android সংস্করণের — API 14 থেকে 35 — জন্য একটি ইউনিফাইড API প্রদান করে।

MediaSession এবং Callback তৈরি করা

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

এই উদাহরণে, MusicService ট্যাগ এবং মিডিয়া বাটন পরিচালনার জন্য ফ্ল্যাগ সহ একটি MediaSession তৈরি করা হয়েছে। Callback onPlay এবং onPause বাস্তবায়ন করে, PlaybackState আপডেট করে। setActions পদ্ধতি উপলব্ধ কর্ম ঘোষণা করে যা সিস্টেম লক স্ক্রিন এবং মিডিয়া সেন্টারে প্রদর্শন করে।

MediaMetadata সেট করা

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

প্রতি ট্র্যাক পরিবর্তনে মেটাডেটা আপডেট করা উচিত। সিস্টেম গাড়ির Bluetooth ডিসপ্লে এবং পরিধেয় ডিভাইসে তথ্য প্রদর্শনের জন্য METADATA_KEY_TITLE এবং METADATA_KEY_ARTIST ব্যবহার করে। যদি কভার আর্ট URI সেট না করা হয়, প্লেয়ার একটি ধূসর প্লেসহোল্ডার দেখাবে।

Bluetooth এবং হেডফোন থেকে মিডিয়া কমান্ড পরিচালনা

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 আপডেট না করে, মিডিয়া সেন্টার সেশনটি প্যানেল থেকে লুকিয়ে ফেলে।

নোটিফিকেশনসহ ফোরগ্রাউন্ড পরিষেবা

kotlin
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 অনুমতি প্রয়োজন।

সচরাচর জিজ্ঞাসিত প্রশ্ন

একই সময়ে একটি অ্যাপে কি একাধিক সক্রিয় MediaSession থাকতে পারে?

প্রযুক্তিগতভাবে হ্যাঁ, কিন্তু যেকোনো মুহূর্তে শুধুমাত্র একটি সেশন সক্রিয় বিবেচিত হয়। setActive(true) কল না করে নতুন সেশন তৈরি করলে আগেরটি সক্রিয় থাকে। প্রতি অ্যাপে একটি সেশন বা সক্রিয় অবস্থা পরিবর্তনসহ প্রতি স্বাধীন অডিও উৎসে একটি সেশন রাখার পরামর্শ দেওয়া হয়।

MediaSession কীভাবে Audio Focus-এর সাথে ইন্টারঅ্যাক্ট করে?

MediaSession স্বয়ংক্রিয়ভাবে Audio Focus পরিচালনা করে না — এটি একটি পৃথক প্রক্রিয়া। onPlay কমান্ড পাওয়ার পর, ডেভেলপারকে স্বাধীনভাবে AudioManager-এর মাধ্যমে AudioFocus অনুরোধ করতে হয় এবং ফোকাস হারালে সেশনের মাধ্যমে প্লেব্যাক বিরাম দিতে হয়।

আমার অ্যাপের সাথে হেডফোনের মিডিয়া বাটন কাজ করে না কেন?

পরীক্ষা করুন যে FLAG_HANDLES_MEDIA_BUTTONS এবং FLAG_HANDLES_TRANSPORT_CONTROLS ফ্ল্যাগ সেট আছে। এছাড়াও নিশ্চিত করুন যে সেশন সক্রিয় (setActive(true))। Android 12+-এ, মিডিয়া বাটন শুধুমাত্র MediaSession-এর মাধ্যমে কাজ করে — পুরনো registerMediaButtonEventReceiver সমর্থিত নয়।

MediaSession কাজ করার জন্য কি MediaBrowserService প্রয়োজন?

মৌলিক বাটন পরিচালনার জন্য — না। কিন্তু Android Auto, Wear OS এবং সিস্টেম মিডিয়া সেন্টারের সাথে ইন্টিগ্রেশনের জন্য MediaBrowserService প্রয়োজন। Google দীর্ঘ অডিও প্লেব্যাকযুক্ত সমস্ত অ্যাপে MediaBrowserService বাস্তবায়নের পরামর্শ দেয়।

MediaSession সঠিকভাবে কনফিগার করা হয়েছে কিনা কীভাবে পরীক্ষা করবেন?

সক্রিয় সেশন, তাদের Callbacks এবং PlaybackState দেখতে adb shell dumpsys media_session কমান্ড ব্যবহার করুন। এই ইউটিলিটি তাদের ট্যাগ, কার্যকলাপের অবস্থা এবং শেষ পরিচিত অবস্থাসহ সমস্ত নিবন্ধিত সেশন দেখায় — ডিবাগিংয়ের জন্য একটি সুবিধাজনক টুল।

সারসংক্ষেপ

  • MediaSession Android-এ প্লেব্যাক পরিচালনার মানক উপায়, যা API 21 থেকে RemoteControlClient-এর স্থলাভিষিক্ত।
  • সেশন Callback সিস্টেমের মাধ্যমে Bluetooth, হেডফোন, Android Auto এবং সিস্টেম মিডিয়া সেন্টার থেকে কমান্ড গ্রহণ করে।
  • PlaybackState এবং MediaMetadata সিস্টেম UI-এর সাথে সঠিক সিঙ্ক্রোনাইজেশনের জন্য দুটি বাধ্যতামূলক উপাদান।
  • ইন্টিগ্রেশন AndroidX মিডিয়া থেকে MediaSessionCompat-এর মাধ্যমে করা হয়, যা API 14+ এর সাথে সামঞ্জস্য প্রদান করে।
  • সিস্টেম মিডিয়া সেন্টারে প্রদর্শনের জন্য MediaBrowserService এবং MediaStyle নোটিফিকেশনসহ ফোরগ্রাউন্ড পরিষেবা প্রয়োজন।
  • Audio Focus পরিচালনা একটি পৃথক কাজ যা MediaSession স্বয়ংক্রিয় করে না। ডেভেলপার স্বাধীনভাবে ফোকাস পরিচালনা করে।
  • ডিবাগিংয়ের জন্য, সক্রিয় সেশন এবং তাদের অবস্থা দেখতে adb shell dumpsys media_session ব্যবহার করুন।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন