মিডিয়া বোতাম হল Android ডিভাইস ও অন্যান্য পেরিফেরাল ডিভাইসে থাকা হার্ডওয়্যার বোতাম, যেমন, ব্লুটুথ হেডসেটে থাকা পজ/প্লে বোতাম। ব্যবহারকারী কোনও মিডিয়া বোতাম প্রেস করলে, Android একটি KeyEvent জেনারেট করে, যার মধ্যে একটি কী কোড থাকে যা বোতামটি শনাক্ত করে। মিডিয়া বোতামের KeyEvent-এর জন্য কী কোড হল কনস্ট্যান্ট যা KEYCODE_MEDIA দিয়ে শুরু হয় (যেমন, KEYCODE_MEDIA_PLAY)।
অ্যাপকে তিনটি ক্ষেত্রে মিডিয়া বোতাম ইভেন্ট ম্যানেজ করতে হবে, এই অগ্রাধিকারের ক্রম অনুযায়ী:
- অ্যাপের UI অ্যাক্টিভিটি যখন দেখা যায়
- UI অ্যাক্টিভিটি লুকানো থাকলে এবং অ্যাপের মিডিয়া সেশন চালু থাকলে
- UI অ্যাক্টিভিটি লুকানো থাকলে এবং অ্যাপের মিডিয়া সেশন অ্যাক্টিভ না থাকলে এবং রিস্টার্ট করতে হলে
ফোরগ্রাউন্ড অ্যাক্টিভিটিতে মিডিয়া বোতাম ম্যানেজ করা
ফোরগ্রাউন্ড অ্যাক্টিভিটি তার onKeyDown()
মেথডে মিডিয়া বোতাম কী ইভেন্ট পায়। Android-এর যে ভার্সন চলছে তার উপর নির্ভর করে, সিস্টেম দুটি উপায়ে ইভেন্টকে মিডিয়া কন্ট্রোলারে
রুট করে:
- আপনি Android 5.0 (API লেভেল 21) বা তার পরবর্তী কোনও ভার্সন ব্যবহার করলে,
FLAG_HANDLES_MEDIA_BUTTONSMediaBrowserCompat.ConnectionCallback.onConnectedকল করুন। এটি অটোমেটিক আপনার মিডিয়া কন্ট্রোলারেরdispatchMediaButtonEvent()-কে কল করবে, যা কী কোডকে মিডিয়া সেশন কলব্যাকে ট্রান্সলেট করে। - Android 5.0 (API লেভেল ২১)-এর আগে, ইভেন্ট নিজেকে ম্যানেজ করতে আপনাকে
onKeyDown()পরিবর্তন করতে হবে। (বিস্তারিত জানতে অ্যাক্টিভ মিডিয়া সেশনে মিডিয়া বোতাম ম্যানেজ করা দেখুন।) নিম্নলিখিত কোড স্নিপেট থেকে জানা যায় যে কীভাবে কী কোড ইন্টারসেপ্ট করতে হয় এবং dispatchMediaButtonEvent() কল করতে হয়। ইভেন্টটি যে ম্যানেজ করা হয়েছে তা বোঝাতেtrueরিটার্ন করতে ভুলবেন না:Kotlin
fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { return super.onKeyDown(keyCode, event) } when (keyCode) { KeyEvent.KEYCODE_MEDIA_PLAY -> { yourMediaController.dispatchMediaButtonEvent(event) return true } } return super.onKeyDown(keyCode, event) }
জাভা
@Override boolean onKeyDown(int keyCode, KeyEvent event) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { return super.onKeyDown(keyCode, event); } switch (keyCode) { case KeyEvent.KEYCODE_MEDIA_PLAY: yourMediaController.dispatchMediaButtonEvent(event); return true; } return super.onKeyDown(keyCode, event); }
মিডিয়া সেশন খোঁজা হচ্ছে
ফোরগ্রাউন্ড অ্যাক্টিভিটি ইভেন্টটি ম্যানেজ না করলে, Android এমন একটি মিডিয়া সেশন খোঁজার চেষ্টা করবে যা এটি ম্যানেজ করতে পারে। আবার, Android-এর যে ভার্সন চলছে তার উপর নির্ভর করে, মিডিয়া সেশন সার্চ করার দুটি উপায় আছে:
আপনি Android 8.0 (API লেভেল ২৬) বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করলে, সিস্টেম MediaSession সহ শেষ অ্যাপটি খোঁজার চেষ্টা করে যা লোকালি অডিও চালিয়েছে। সেশনটি এখনও অ্যাক্টিভ থাকলে, Android সরাসরি এতে ইভেন্ট পাঠায়। অন্যথায়, সেশন অ্যাক্টিভ না থাকলে এবং এতে mediabutton রিসিভার থাকলে, Android রিসিভারকে ইভেন্ট পাঠায়, যা সেশন রিস্টার্ট করবে এবং তাই এটি ইভেন্ট রিসিভ করতে পারবে। (বিস্তারিত জানতে অ্যাক্টিভ নেই এমন মিডিয়া সেশন আবার চালু করতে মিডিয়া বোতাম ব্যবহার করা দেখুন।) সেশনে মিডিয়া বোতাম রিসিভার না থাকলে, সিস্টেম মিডিয়া বোতাম ইভেন্ট বাতিল করে দেয় এবং কিছুই হয় না। এই লজিকটি নিম্নলিখিত ডায়াগ্রামে দেখানো হয়েছে:

Android 8.0 (API লেভেল ২৬)-এর আগের ভার্সনে, সিস্টেম কোনও অ্যাক্টিভ মিডিয়া সেশনে ইভেন্ট পাঠানোর চেষ্টা করে। একাধিক অ্যাক্টিভ মিডিয়া সেশন থাকলে, Android এমন একটি মিডিয়া সেশন বেছে নেওয়ার চেষ্টা করে যা চালানোর জন্য প্রস্তুত হচ্ছে (বাফারিং/কানেক্ট করা হচ্ছে), চালানো হচ্ছে বা পজ করা আছে, বন্ধ হয়ে যাওয়া মিডিয়া সেশন বেছে নেয় না। (আরও বিবরণের জন্য অ্যাক্টিভ মিডিয়া সেশনে মিডিয়া বোতাম ম্যানেজ করা দেখুন।) কোনও অ্যাক্টিভ সেশন না থাকলে, Android সবচেয়ে সাম্প্রতিক অ্যাক্টিভ সেশনে ইভেন্ট পাঠানোর চেষ্টা করে। (বিস্তারিত জানতে অ্যাক্টিভ নেই এমন মিডিয়া সেশন আবার চালু করতে মিডিয়া বোতাম ব্যবহার করা দেখুন।) এই লজিকটি নিম্নলিখিত ডায়াগ্রামে দেখানো হয়েছে:

অ্যাক্টিভ মিডিয়া সেশনে মিডিয়া বোতাম ম্যানেজ করা
Android 5.0 (API লেভেল 21) এবং তার পরবর্তী যেকোনও ভার্সনে, Android অটোমেটিক আপনার অ্যাক্টিভ মিডিয়া সেশনে মিডিয়া বোতাম ইভেন্ট ডিসপ্যাচ করে
onMediaButtonEvent() কল করার মাধ্যমে।
ডিফল্ট হিসেবে, এই কলব্যাক KeyEvent-কে উপযুক্ত মিডিয়া সেশন কলব্যাক পদ্ধতিতে অনুবাদ করে যা কী কোডের সাথে মেলে।
Android 5.0 (API লেভেল ২১)-এর আগে, Android ACTION_MEDIA_BUTTON অ্যাকশন সহ ইনটেন্ট ব্রডকাস্ট করার মাধ্যমে
মিডিয়া বোতাম ইভেন্ট ম্যানেজ করে। এইসব ইনটেন্ট ইন্টারসেপ্ট করতে আপনার অ্যাপকে অবশ্যই
BroadcastReceiver রেজিস্টার করতে হবে। MediaButtonReceiver
ক্লাসটি বিশেষভাবে এই উদ্দেশ্যে ডিজাইন করা হয়েছে। এটি
Android
মিডিয়া-কম্প্যাট লাইব্রেরির একটি কনভেনিয়েন্স ক্লাস যা
ACTION_MEDIA_BUTTON ম্যানেজ করে এবং ইনকামিং ইনটেন্টকে
উপযুক্ত MediaSessionCompat.Callback মেথড কলে অনুবাদ করে।
MediaButtonReceiver হল স্বল্পস্থায়ী BroadcastReceiver। এটি আপনার মিডিয়া সেশন ম্যানেজ করছে এমন পরিষেবায় ইনকামিং
ইনটেন্ট ফরওয়ার্ড করে। Android 5.0-এর আগের ভার্সনের সিস্টেমে
মিডিয়া বোতাম ব্যবহার করতে চাইলে, আপনাকে অবশ্যই
MEDIA_BUTTON ইনটেন্ট ফিল্টার সহ আপনার ম্যানিফেস্টে MediaButtonReceiver অন্তর্ভুক্ত করতে হবে।:
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
BroadcastReceiver আপনার পরিষেবায় ইনটেন্ট ফরওয়ার্ড করে। ইনটেন্ট পার্স করতে
এবং আপনার মিডিয়া সেশনে কলব্যাক জেনারেট করতে, আপনার পরিষেবার onStartCommand()-এ MediaButtonReceiver.handleIntent() পদ্ধতি অন্তর্ভুক্ত করুন।
এটি কী কোডকে উপযুক্ত সেশন কলব্যাক পদ্ধতিতে অনুবাদ করে।
Kotlin
private val mediaSessionCompat: MediaSessionCompat = ... override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { MediaButtonReceiver.handleIntent(mediaSessionCompat, intent) return super.onStartCommand(intent, flags, startId) }
জাভা
private MediaSessionCompat mediaSessionCompat = ...; public int onStartCommand(Intent intent, int flags, int startId) { MediaButtonReceiver.handleIntent(mediaSessionCompat, intent); return super.onStartCommand(intent, flags, startId); }
অ্যাক্টিভ নেই এমন মিডিয়া সেশন আবার চালু করতে মিডিয়া বোতাম ব্যবহার করা
Android যদি শেষ অ্যাক্টিভ মিডিয়া সেশন শনাক্ত করতে পারে, তাহলে এটি ম্যানিফেস্ট-রেজিস্টার করা কম্পোনেন্টে (যেমন, কোনও পরিষেবা বা BroadcastReceiver) ACTION_MEDIA_BUTTON ইনটেন্ট পাঠিয়ে সেশন রিস্টার্ট করার চেষ্টা করে।
এর ফলে, আপনার অ্যাপের UI দেখা না গেলেও এটি প্লেব্যাক রিস্টার্ট করতে পারে, যা বেশিরভাগ অডিও অ্যাপের ক্ষেত্রে প্রযোজ্য।
আপনি MediaSessionCompat ব্যবহার করলে এই আচরণ অটোমেটিক চালু হয়ে যায়। আপনি যদি
Android ফ্রেমওয়ার্কের MediaSession বা 24.0.0 থেকে 25.1.1 পর্যন্ত
সাপোর্ট লাইব্রেরি ব্যবহার করেন, তাহলে আপনাকে setMediaButtonReceiver কল করতে হবে যাতে মিডিয়া বোতামটি একটি
নিষ্ক্রিয় মিডিয়া সেশন রিস্টার্ট করতে পারে।
আপনি Android 5.0 (API লেভেল ২১) এবং তার পরবর্তী ভার্সনে এই আচরণ বন্ধ করতে পারবেন, এর জন্য আপনাকে একটি নাল মিডিয়া বোতাম রিসিভার সেট করতে হবে:
Kotlin
// Create a MediaSessionCompat mediaSession = MediaSessionCompat(context, LOG_TAG) mediaSession.setMediaButtonReceiver(null)
জাভা
// Create a MediaSessionCompat mediaSession = new MediaSessionCompat(context, LOG_TAG); mediaSession.setMediaButtonReceiver(null);
মিডিয়া বোতাম হ্যান্ডলার কাস্টমাইজ করা হচ্ছে
onMediaButtonEvent()-এর ডিফল্ট অ্যাকশন কী কোড এক্সট্র্যাক্ট করে এবং কোন পদ্ধতি কল করতে হবে তা নির্ধারণ করতে মিডিয়া সেশনের বর্তমান অবস্থা এবং সমর্থিত অ্যাকশনের তালিকা ব্যবহার করে। যেমন, KEYCODE_MEDIA_PLAY, onPlay()-কে ইনভোক করে।
সব অ্যাপ জুড়ে একই ধরনের মিডিয়া বোতামের অভিজ্ঞতা প্রদান করতে, আপনাকে ডিফল্ট অ্যাকশন
ব্যবহার করতে হবে এবং শুধুমাত্র নির্দিষ্ট উদ্দেশ্যে তা থেকে বিচ্যুত হতে হবে। কোনও মিডিয়া বোতাম
কাস্টম হ্যান্ডেল করতে হলে, আপনার কলব্যাকের
onMediaButtonEvent()
পদ্ধতি ওভাররাইড করুন, intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT)
ব্যবহার করে KeyEvent
এক্সট্র্যাক্ট করুন,
ইভেন্টটি নিজে হ্যান্ডেল করুন এবং true রিটার্ন করুন।
সারাংশ
Android-এর সব ভার্সনে মিডিয়া বোতাম ইভেন্ট সঠিকভাবে ম্যানেজ করতে, মিডিয়া সেশন তৈরি করার সময়
আপনাকে অবশ্যই FLAG_HANDLES_MEDIA_BUTTONS
উল্লেখ করতে হবে।
এছাড়াও, আপনি Android-এর যে ভার্সনে সাপোর্ট দিতে চান, তার উপর নির্ভর করে আপনাকে এইসব প্রয়োজনীয়তাও পূরণ করতে হবে:
Android 5.0 বা তার পরবর্তী যেকোনও ভার্সনে রান করার সময়:
- মিডিয়া কন্ট্রোলার
onConnected()কলব্যাক থেকেMediaControllerCompat.setMediaController()-কে কল করুন - কোনও মিডিয়া বোতামকে একটি নিষ্ক্রিয় সেশন রিস্টার্ট করার অনুমতি দিতে,
setMediaButtonReceiver()কল করে এবং এটিকে একটিPendingIntentপাস করে ডায়নামিকভাবে একটিMediaButtonReceiverতৈরি করুন
Android 5.0-এর আগের ভার্সনে চলা সিস্টেমে:
- মিডিয়া বোতাম ম্যানেজ করতে অ্যাক্টিভিটির
onKeyDown()ওভাররাইড করুন - অ্যাপের ম্যানিফেস্টে যোগ করে স্ট্যাটিক্যালি
MediaButtonReceiverতৈরি করুন