মিডিয়া বোতামে সাড়া দিচ্ছে

মিডিয়া বোতামগুলি হল হার্ডওয়্যার বোতাম যা Android ডিভাইস এবং অন্যান্য পেরিফেরাল ডিভাইসে পাওয়া যায়, উদাহরণস্বরূপ, একটি ব্লুটুথ হেডসেটে বিরতি/প্লে বোতাম। যখন একজন ব্যবহারকারী একটি মিডিয়া বোতাম টিপে, তখন Android একটি KeyEvent তৈরি করে, যাতে একটি কী কোড থাকে যা বোতামটিকে শনাক্ত করে৷ মিডিয়া বোতাম কী ইভেন্টের মূল কোডগুলি হল ধ্রুবক যা KEYCODE_MEDIA দিয়ে শুরু হয় (উদাহরণস্বরূপ, KEYCODE_MEDIA_PLAY )।

অগ্রাধিকারের এই ক্রমানুসারে অ্যাপগুলি তিনটি ক্ষেত্রে মিডিয়া বোতাম ইভেন্টগুলি পরিচালনা করতে সক্ষম হওয়া উচিত:

  • যখন অ্যাপটির UI কার্যকলাপ দৃশ্যমান হয়
  • যখন UI কার্যকলাপ লুকানো থাকে এবং অ্যাপের মিডিয়া সেশন সক্রিয় থাকে
  • যখন UI কার্যকলাপ লুকানো থাকে এবং অ্যাপের মিডিয়া সেশন নিষ্ক্রিয় থাকে এবং পুনরায় চালু করতে হয়

একটি অগ্রভাগের কার্যকলাপে মিডিয়া বোতামগুলি পরিচালনা করা

ফোরগ্রাউন্ড কার্যকলাপ তার onKeyDown() পদ্ধতিতে মিডিয়া বোতাম কী ইভেন্ট গ্রহণ করে। অ্যান্ড্রয়েডের চলমান সংস্করণের উপর নির্ভর করে, দুটি উপায়ে সিস্টেমটি ইভেন্টটিকে মিডিয়া কন্ট্রোলারে রুট করে:

  • আপনি যদি Android 5.0 (API লেভেল 21) বা তার পরে চালান, তাহলে FLAG_HANDLES_MEDIA_BUTTONS MediaBrowserCompat.ConnectionCallback.onConnected এ কল করুন। এটি স্বয়ংক্রিয়ভাবে আপনার মিডিয়া কন্ট্রোলারের dispatchMediaButtonEvent() কল করবে, যা একটি মিডিয়া সেশন কলব্যাকে কী কোড অনুবাদ করে।
  • Android 5.0 (API স্তর 21) এর আগে, ইভেন্টটি নিজে পরিচালনা করতে আপনাকে onKeyDown() পরিবর্তন করতে হবে। (বিশদ বিবরণের জন্য একটি সক্রিয় মিডিয়া সেশনে মিডিয়া বোতাম পরিচালনা করা দেখুন।) নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে কী কোডটি আটকাতে হয় এবং dispatchMediaButtonEvent() কল করতে হয়। ইভেন্টটি পরিচালনা করা হয়েছে তা নির্দেশ করার জন্য true ফিরে আসতে ভুলবেন না:

    কোটলিন

        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 একটি মিডিয়া সেশন খুঁজে বের করার চেষ্টা করবে যা এটি পরিচালনা করতে পারে। আবার, অ্যান্ড্রয়েডের চলমান সংস্করণের উপর নির্ভর করে, মিডিয়া সেশন অনুসন্ধান করার দুটি উপায় রয়েছে:

  • আপনি যদি অ্যান্ড্রয়েড 8.0 (এপিআই স্তর 26) বা তার পরে চালান, সিস্টেমটি স্থানীয়ভাবে অডিও বাজানো একটি MediaSession দিয়ে শেষ অ্যাপটি খুঁজে বের করার চেষ্টা করে। সেশনটি এখনও সক্রিয় থাকলে অ্যান্ড্রয়েড সরাসরি ইভেন্টটি পাঠায়। অন্যথায়, যদি সেশনটি সক্রিয় না থাকে এবং এতে একটি মিডিয়াবাটন রিসিভার থাকে, তাহলে Android ইভেন্টটি রিসিভারের কাছে পাঠায়, যা সেশনটি পুনরায় চালু করবে এবং তাই এটি ইভেন্টটি গ্রহণ করতে পারে। (বিশদ বিবরণের জন্য একটি নিষ্ক্রিয় মিডিয়া সেশন পুনরায় আরম্ভ করতে মিডিয়া বোতাম ব্যবহার দেখুন।) সেশনে একটি মিডিয়া বোতাম রিসিভার না থাকলে সিস্টেম মিডিয়া বোতাম ইভেন্টটি বাতিল করে দেয় এবং কিছুই হবে না। যুক্তিটি নিম্নলিখিত চিত্রে দেখানো হয়েছে:

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

একটি সক্রিয় মিডিয়া সেশনে মিডিয়া বোতামগুলি পরিচালনা করা

Android 5.0 (API স্তর 21) এবং উচ্চতর, Android স্বয়ংক্রিয়ভাবে onMediaButtonEvent() কল করে আপনার সক্রিয় মিডিয়া সেশনে মিডিয়া বোতাম ইভেন্টগুলি প্রেরণ করে৷ ডিফল্টরূপে এই কলব্যাক KeyEvent কে উপযুক্ত মিডিয়া সেশন কলব্যাক পদ্ধতিতে অনুবাদ করে যা কী কোডের সাথে মেলে।

Android 5.0 (API স্তর 21) এর আগে, Android ACTION_MEDIA_BUTTON অ্যাকশনের মাধ্যমে একটি অভিপ্রায় সম্প্রচার করে মিডিয়া বোতাম ইভেন্টগুলি পরিচালনা করে৷ এই উদ্দেশ্যগুলিকে আটকাতে আপনার অ্যাপটিকে অবশ্যই একটি BroadcastReceiver নিবন্ধন করতে হবে৷ MediaButtonReceiver ক্লাসটি এই উদ্দেশ্যে বিশেষভাবে ডিজাইন করা হয়েছিল। এটি অ্যান্ড্রয়েড মিডিয়া-কম্প্যাট লাইব্রেরির একটি সুবিধার ক্লাস যা ACTION_MEDIA_BUTTON পরিচালনা করে এবং ইনকামিং ইন্টেন্টগুলিকে উপযুক্ত MediaSessionCompat.Callback পদ্ধতি কলগুলিতে অনুবাদ করে৷

একটি MediaButtonReceiver হল একটি স্বল্পস্থায়ী ব্রডকাস্ট রিসিভার। এটি আপনার মিডিয়া সেশন পরিচালনা করছে এমন পরিষেবাতে ইনকামিং ইন্টেন্ট ফরওয়ার্ড করে। আপনি যদি 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() পদ্ধতিটি অন্তর্ভুক্ত করুন। এটি কী কোডটিকে উপযুক্ত সেশন কলব্যাক পদ্ধতিতে অনুবাদ করে।

কোটলিন

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

একটি নিষ্ক্রিয় মিডিয়া সেশন পুনরায় আরম্ভ করতে মিডিয়া বোতাম ব্যবহার করে

যদি অ্যান্ড্রয়েড শেষ সক্রিয় মিডিয়া সেশন শনাক্ত করতে পারে, তাহলে এটি একটি ম্যানিফেস্ট-নিবন্ধিত উপাদানে (যেমন একটি পরিষেবা বা BroadcastReceiver ) একটি ACTION_MEDIA_BUTTON ইন্টেন্ট পাঠিয়ে সেশনটি পুনরায় চালু করার চেষ্টা করে।

এটি আপনার অ্যাপটিকে প্লেব্যাক পুনরায় চালু করতে দেয় যখন এর UI দৃশ্যমান হয় না, যা বেশিরভাগ অডিও অ্যাপের ক্ষেত্রে হয়।

আপনি যখন MediaSessionCompat ব্যবহার করেন তখন এই আচরণটি স্বয়ংক্রিয়ভাবে সক্ষম হয়। আপনি যদি অ্যান্ড্রয়েড ফ্রেমওয়ার্কের MediaSession বা সাপোর্ট লাইব্রেরি 24.0.0 থেকে 25.1.1 পর্যন্ত ব্যবহার করেন তাহলে একটি মিডিয়া বোতামকে একটি নিষ্ক্রিয় মিডিয়া সেশন পুনরায় চালু করতে আপনাকে setMediaButtonReceiver কল করতে হবে।

আপনি একটি নাল মিডিয়া বোতাম রিসিভার সেট করে Android 5.0 (API স্তর 21) এবং উচ্চতর এই আচরণটি অক্ষম করতে পারেন:

কোটলিন

// 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 ফিরে আসুন।

সারাংশ

অ্যান্ড্রয়েডের সমস্ত সংস্করণে মিডিয়া বোতাম ইভেন্টগুলি সঠিকভাবে পরিচালনা করতে, আপনি যখন একটি মিডিয়া সেশন তৈরি করবেন তখন আপনাকে অবশ্যই FLAG_HANDLES_MEDIA_BUTTONS নির্দিষ্ট করতে হবে৷

এছাড়াও, আপনি যে Android সংস্করণগুলিকে সমর্থন করার পরিকল্পনা করছেন তার উপর নির্ভর করে, আপনাকে অবশ্যই এই প্রয়োজনীয়তাগুলি পূরণ করতে হবে:

যখন অ্যান্ড্রয়েড 5.0 বা তার পরে চলমান:

  • onConnected() কলব্যাকে মিডিয়া কন্ট্রোলার থেকে MediaControllerCompat.setMediaController() কে কল করুন
  • একটি মিডিয়া বোতাম একটি নিষ্ক্রিয় অধিবেশন পুনরায় চালু করার অনুমতি দিতে, গতিশীলভাবে একটি MediaButtonReceiver তৈরি করুন setMediaButtonReceiver() কল করে এবং এটি একটি PendingIntent পাস করে

অ্যান্ড্রয়েড 5.0 এর আগে সিস্টেমে চললে:

  • মিডিয়া বোতামগুলি পরিচালনা করতে কার্যকলাপের onKeyDown() ওভাররাইড করুন৷
  • অ্যাপ্লিকেশানের ম্যানিফেস্টে এটি যুক্ত করে স্থিরভাবে একটি MediaButtonReceiver তৈরি করুন৷