मीडिया बटन का जवाब देना

मीडिया बटन, Android डिवाइसों और अन्य सहायक डिवाइसों पर मौजूद हार्डवेयर बटन होते हैं. उदाहरण के लिए, ब्लूटूथ हेडसेट पर 'रोकें/चलाएं' बटन. जब कोई उपयोगकर्ता मीडिया बटन दबाता है, तो Android एक KeyEvent जनरेट करता है. इसमें बटन की पहचान करने वाला एक कुंजी कोड होता है. मीडिया बटन KeyEvent के लिए कुंजी कोड, KEYCODE_MEDIA से शुरू होने वाले कॉन्सटेंट होते हैं (उदाहरण के लिए, KEYCODE_MEDIA_PLAY).

ऐप्लिकेशन, मीडिया बटन इवेंट को तीन मामलों में इस क्रम में मैनेज कर पाएंगे प्राथमिकता:

  • जब ऐप्लिकेशन की यूज़र इंटरफ़ेस (यूआई) गतिविधि दिख रही हो
  • जब यूज़र इंटरफ़ेस (यूआई) गतिविधि छिपी हुई हो और ऐप्लिकेशन का मीडिया सेशन चालू हो
  • जब यूज़र इंटरफ़ेस (यूआई) गतिविधि छिपा दी गई हो और ऐप्लिकेशन का मीडिया सेशन बंद हो और उसे रीस्टार्ट करने की ज़रूरत हो

फ़ोरग्राउंड गतिविधि में मीडिया बटन को मैनेज करना

फ़ोरग्राउंड गतिविधि को उसके onKeyDown() में मीडिया बटन से जुड़े मुख्य इवेंट के बारे में जानकारी मिलती है तरीका. Android के मौजूदा वर्शन के हिसाब से, इवेंट को दो तरीकों से रूट किया जाता है मीडिया कंट्रोलर:

  • अगर आपके डिवाइस में Android 5.0 (एपीआई लेवल 21) या उसके बाद का वर्शन है, तो कॉल करें FLAG_HANDLES_MEDIA_BUTTONS अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है MediaBrowserCompat.ConnectionCallback.onConnected. इससे आपके मीडिया कंट्रोलर के dispatchMediaButtonEvent(), जो कुंजी कोड को मीडिया सेशन कॉलबैक में बदल देता है.
  • Android 5.0 (एपीआई लेवल 21) से पहले के वर्शन के लिए, आपको 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)
        }
        

    Java

        @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 (एपीआई लेवल 26) या इसके बाद के वर्शन का इस्तेमाल किया जा रहा है, तो सिस्टम मीडिया सेशन वाला आखिरी ऐप्लिकेशन ढूंढना, जिसने स्थानीय तौर पर ऑडियो चलाया. अगर सेशन अब भी चालू है, तो Android इवेंट को सीधे उसे भेज देता है. नहीं तो, अगर सेशन चालू नहीं है और उसमें मीडियाबटन का रिसीवर है, तो Android इवेंट भेजता है पाने वाले को भेजा जाता है, जिससे सेशन फिर से शुरू हो जाएगा, ताकि उसे इवेंट मिल सके. (ज़्यादा जानकारी के लिए, किसी बंद मीडिया सेशन को फिर से चालू करने के लिए, मीडिया बटन का इस्तेमाल करना लेख देखें.) अगर सेशन में मीडिया बटन रिसीवर नहीं है, तो सिस्टम मीडिया को खारिज कर देता है बटन इवेंट रिकॉर्ड कर सकते हैं और कुछ नहीं होगा. यह लॉजिक यहां दिखाया गया है डायग्राम:

  • Android 8.0 (एपीआई लेवल 26) से पहले के वर्शन में, सिस्टम इवेंट को चालू मीडिया सेशन. अगर एक से ज़्यादा मीडिया सेशन चालू हैं, तो Android, वह मीडिया सेशन चुनने के लिए जो चलाए जाने की तैयारी कर रहा है (बफ़रिंग/कनेक्ट कर रहा है), या रोका गया हो. (देखें किसी चालू मीडिया सेशन में मीडिया बटन मैनेज करना देखें.) अगर कोई चालू नहीं है सत्र के दौरान, Android इवेंट को सबसे हाल के सक्रिय सत्र में भेजने की कोशिश करता है. (ज़्यादा जानकारी के लिए, किसी बंद मीडिया सेशन को फिर से चालू करने के लिए, मीडिया बटन का इस्तेमाल करना लेख देखें.) लॉजिक को इस डायग्राम में दिखाया गया है:

किसी चालू मीडिया सेशन में मीडिया बटन मैनेज करना

Android 5.0 (एपीआई लेवल 21) और उसके बाद के वर्शन पर, Android, मीडिया बटन इवेंट को कॉल करके आपके ऐक्टिव मीडिया सेशन में अपने-आप भेजता है onMediaButtonEvent(). डिफ़ॉल्ट रूप से यह कॉलबैक, KeyEvent को ऐसे मीडिया सेशन कॉलबैक तरीके में बदल देता है जो कुंजी कोड से मेल खाता हो.

Android 5.0 (एपीआई लेवल 21) से पहले के वर्शन में, Android इंटेंट ब्रॉडकास्ट करके मीडिया बटन के इवेंट मैनेज करता है ACTION_MEDIA_BUTTON कार्रवाई के साथ. आपके ऐप्लिकेशन को BroadcastReceiver को इन इंटेंट का इस्तेमाल करने की अनुमति नहीं है. कॉन्टेंट बनाने MediaButtonReceiver अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है क्लास ख़ास तौर पर इस मकसद से ऐसा नहीं किया जा सकता. यह Android मीडिया-कंपैट लाइब्रेरी ACTION_MEDIA_BUTTON को हैंडल करता है और आने वाले इंटेंट को सही MediaSessionCompat.Callback तरीके कॉल करना ज़रूरी है.

MediaButtonReceiver, कुछ समय के लिए उपलब्ध BroadcastReceiver होता है. यह इनकमिंग को फ़ॉरवर्ड करता है के लिए इंटेंट कर रहे हैं. अगर आपको डिजिटल विज्ञापन से Android 5.0 से पहले के सिस्टम में मीडिया बटन जोड़ने के लिए, आपको अपने मेनिफ़ेस्ट में मौजूद MediaButtonReceiver को MEDIA_BUTTON इंटेंट फ़िल्टर से सेट करें.:

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

Java

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 इंटेंट भेजकर, सेशन को रीस्टार्ट करने की कोशिश करता है.

इससे, ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) नहीं दिखने पर, फिर से वीडियो चलाया जा सकता है. ज़्यादातर ऑडियो ऐप्लिकेशन में ऐसा होता है.

MediaSessionCompat का इस्तेमाल करने पर, यह सेटिंग अपने-आप चालू हो जाती है. अगर आपको Android फ़्रेमवर्क की MediaSession या सहायता लाइब्रेरी 24.0.0 से 25.1.1 मीडिया बटन को फिर से प्रारंभ होने देने के लिए आपको setMediaButtonReceiver को कॉल करना होगा इनऐक्टिव मीडिया सेशन.

Android 5.0 (एपीआई लेवल 21) और उसके बाद वाले वर्शन में, इस कार्रवाई को शून्य मीडिया बटन रिसीवर सेट करना:

Kotlin

// Create a MediaSessionCompat
mediaSession = MediaSessionCompat(context, LOG_TAG)
mediaSession.setMediaButtonReceiver(null)

Java

// Create a MediaSessionCompat
mediaSession = new MediaSessionCompat(context, LOG_TAG);
mediaSession.setMediaButtonReceiver(null);

मीडिया बटन हैंडलर को पसंद के मुताबिक बनाना

onMediaButtonEvent() का डिफ़ॉल्ट तरीका, कुंजी कोड को एक्सट्रैक्ट करता है. साथ ही, मीडिया सेशन की मौजूदा स्थिति और काम करने वाली कार्रवाइयों की सूची का इस्तेमाल करके, कॉल करने का तरीका तय करता है. उदाहरण के लिए, KEYCODE_MEDIA_PLAY onPlay() शुरू करता है.

सभी ऐप्लिकेशन पर, मीडिया बटन का एक जैसा अनुभव देने के लिए, आपको और सिर्फ़ किसी खास मकसद से भटकते हैं. अगर मीडिया बटन कस्टम हैंडलिंग की ज़रूरत है, तो अपने कॉलबैक की onMediaButtonEvent() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है करने का तरीका, इसका इस्तेमाल करके KeyEvent निकालें intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT), इवेंट को खुद मैनेज करें और true वापस जाएं.

खास जानकारी

Android के सभी वर्शन में, मीडिया बटन के इवेंट सही तरीके से मैनेज करने के लिए, आपको: FLAG_HANDLES_MEDIA_BUTTONS तय करें को अपडेट करें.

इसके अलावा, आप जिन Android वर्शन पर काम करने वाले हैं, उनके हिसाब से आपको इन ज़रूरी शर्तों को भी पूरा करना होगा:

Android 5.0 या उसके बाद वाले वर्शन में काम करते समय:

  • मीडिया कंट्रोलर onConnected() कॉलबैक से, MediaControllerCompat.setMediaController() को कॉल करें
  • मीडिया बटन को इनऐक्टिव सेशन फिर से शुरू करने की अनुमति देने के लिए, कॉल करके डाइनैमिक तौर पर MediaButtonReceiver बनाएं setMediaButtonReceiver() और उसे PendingIntent पास करना

Android 5.0 से पहले के सिस्टम में चलाते समय:

  • मीडिया बटन को हैंडल करने के लिए, गतिविधि के onKeyDown() को बदलें
  • ऐप्लिकेशन के मेनिफ़ेस्ट में जोड़कर, MediaButtonReceiver को स्टैटिक तरीके से बनाएं