रेडियो कंट्रोल की सुविधा को लागू करना

रेडियो कंट्रोल की सुविधा, MediaSession और MediaBrowse पर आधारित है. इनकी मदद से, मीडिया और वॉइस असिस्टेंट ऐप्लिकेशन, रेडियो को कंट्रोल कर सकते हैं. ज़्यादा जानकारी के लिए, developer.android.com पर कार के लिए मीडिया ऐप्लिकेशन बनाना लेख पढ़ें.

packages/apps/Car/libs में, car-broadcastradio-support लाइब्रेरी में मीडिया ब्राउज़ ट्री लागू करने की सुविधा दी गई है. इस लाइब्रेरी में, यूआरआई में बदलने और उससे बदलने के लिए, ProgramSelector के एक्सटेंशन भी शामिल हैं. हमारा सुझाव है कि रेडियो लागू करने के लिए, ब्राउज़ ट्री बनाने के लिए इस लाइब्रेरी का इस्तेमाल करें.

मीडिया सोर्स स्विचर

मीडिया में दिखाए गए रेडियो और अन्य ऐप्लिकेशन के बीच आसानी से ट्रांज़िशन करने के लिए, car-media-common लाइब्रेरी में ऐसी क्लास शामिल हैं जिन्हें रेडियो ऐप्लिकेशन में इंटिग्रेट किया जाना चाहिए. MediaAppSelectorWidgetको रेडियो ऐप्लिकेशन के एक्सएमएल में शामिल किया जा सकता है (रेफ़रंस मीडिया और रेडियो ऐप्लिकेशन में इस्तेमाल किया गया आइकॉन और ड्रॉप-डाउन):

<com.android.car.media.common.MediaAppSelectorWidget
    android:id="@+id/app_switch_container"
    android:layout_width="@dimen/app_switch_widget_width"
    android:layout_height="wrap_content"
    android:background="@drawable/app_item_background"
    android:gravity="center" />

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

AppSelectionFragment newFragment = AppSelectionFragment.create(widget,
            packageName, fullScreen);
    newFragment.show(mActivity.getSupportFragmentManager(), null);

रेफ़रंस रेडियो ऐप्लिकेशन लागू करने के उदाहरण में, इसे लागू करने का सैंपल दिया गया है. यह उदाहरण packages/apps/Car/Radio में मौजूद है.

कंट्रोल की ज़्यादा जानकारी

MediaSession (MediaSession.Callback के ज़रिए) इंटरफ़ेस, फ़िलहाल चल रहे रेडियो प्रोग्राम को कंट्रोल करने के लिए, ये सुविधाएं देता है:

  • onPlay, onStop. रेडियो प्लेबैक को म्यूट (अन-म्यूट) करें.
  • onPause. वीडियो को कुछ समय के लिए रोकना (अगर सुविधा उपलब्ध हो).
  • onPlayFromMediaId. टॉप-लेवल फ़ोल्डर में मौजूद कोई भी कॉन्टेंट चलाएं. उदाहरण के लिए, "एफ़एम चलाओ" या "रेडियो चलाओ."
  • onPlayFromUri. कोई खास फ़्रीक्वेंसी चलाएं. उदाहरण के लिए, "88.5 एफ़एम चलाओ".
  • onSkipToNext, onSkipToPrevious. अगले या पिछले रेडियो स्टेशन पर जाएं.
  • onSetRating. पसंदीदा में जोड़ें या हटाएं.

MediaBrowser, ट्यून किए जा सकने वाले MediaItem को तीन तरह की टॉप-लेवल डायरेक्ट्री में दिखाता है:

  • (ज़रूरी नहीं है) प्रोग्राम (स्टेशन). आम तौर पर, इस मोड का इस्तेमाल ड्यूअल-ट्यूनर रेडियो में किया जाता है. इससे, उपयोगकर्ता की जगह पर मौजूद सभी रेडियो स्टेशनों के बारे में पता चलता है.
  • पसंदीदा. पसंदीदा सूची में जोड़े गए रेडियो प्रोग्राम में से कुछ, शायद उपलब्ध न हों (रेडियो सिग्नल की पहुंच से बाहर हों).
  • बैंड चैनल. मौजूदा इलाके में फ़िज़िकली उपलब्ध सभी चैनल (87.9, 88.1, 88.3, 88.5, 88.7, 88.9, 89.1 वगैरह). हर बैंड की एक अलग टॉप-लेवल डायरेक्ट्री होती है.
MediaBrowserService का ट्री स्ट्रक्चर
दूसरी इमेज. MediaBrowserService का ट्री स्ट्रक्चर

इनमें से हर फ़ोल्डर (एएम/एफ़एम/प्रोग्राम) में मौजूद हर एलिमेंट, यूआरआई वाला एक MediaItem होता है. इसका इस्तेमाल, ट्यून करने के लिए MediaSession के साथ किया जा सकता है. हर टॉप-लेवल फ़ोल्डर (एएम/एफ़एम/प्रोग्राम), एक ऐसा MediaItem होता है जिसमें mediaId होता है. इसका इस्तेमाल, प्लेबैक को ट्रिगर करने के लिए MediaSession के साथ किया जा सकता है. हालांकि, यह OEM के विवेक पर निर्भर करता है. उदाहरण के लिए, "एफ़एम चलाओ", "एएम चलाओ", और "रेडियो चलाओ", ये सभी रेडियो से जुड़ी ऐसी क्वेरी हैं जिनमें किसी खास स्टेशन का नाम नहीं दिया गया है. ये क्वेरी, OEM रेडियो ऐप्लिकेशन को भेजने के लिए मीडिया आईडी का इस्तेमाल करती हैं. यह रेडियो ऐप्लिकेशन तय करता है कि सामान्य अनुरोध और मीडिया आईडी में से क्या चलाया जाए.

MediaSession

ब्रॉडकास्ट स्ट्रीम को रोकने का कोई कॉन्सेप्ट नहीं है. इसलिए, रेडियो पर हमेशा 'चलाएं', 'रोकें', और 'बंद करें' कार्रवाइयां लागू नहीं होती हैं. रेडियो के लिए, 'रोकें' कार्रवाई का मतलब स्ट्रीम को म्यूट करना है और 'चलाएं' कार्रवाई का मतलब म्यूट हटाना है.

कुछ रेडियो ट्यूनर (या ऐप्लिकेशन), कॉन्टेंट को कैश मेमोरी में सेव करके, बाद में उसे चलाकर ब्रॉडकास्ट स्ट्रीम को रोकने की सुविधा देते हैं. ऐसे मामलों में, onPause का इस्तेमाल करें.

mediaId और यूआरआई ऐक्शन से चलाने का मकसद, MediaBrowser इंटरफ़ेस से फ़ेच किए गए किसी स्टेशन पर ट्यून करना है. mediaId, रेडियो ऐप्लिकेशन की ओर से दी गई एक मनमुताबिक स्ट्रिंग होती है. इसका इस्तेमाल, किसी स्टेशन की पहचान करने के लिए किया जाता है. यह स्ट्रिंग यूनीक (इसलिए, कोई दिया गया आईडी सिर्फ़ एक आइटम पर ले जाता है) और स्थिर (इसलिए, किसी दिए गए आइटम का आईडी पूरे सेशन में एक ही रहता है) होती है. यूआरआई, अच्छी तरह से तय किए गए स्कीमा का होगा. कम शब्दों में कहें, तो ProgramSelector का यूआरआई वाला वर्शन. इससे यूनीक आइडेंटिफ़ायर एट्रिब्यूट को सुरक्षित रखा जाता है. हालांकि, यह ज़रूरी नहीं है कि यह स्थिर रहे. स्टेशन के किसी दूसरी फ़्रीक्वेंसी पर जाने पर, यह बदल सकता है.

डिज़ाइन के हिसाब से, onPlayFromSearch का इस्तेमाल नहीं किया जाता. MediaBrowser ट्री से खोज का नतीजा चुनने की ज़िम्मेदारी क्लाइंट (साथी ऐप्लिकेशन) की है. रेडियो ऐप्लिकेशन पर यह ज़िम्मेदारी डालने से, समस्याएं बढ़ेंगी. साथ ही, स्ट्रिंग क्वेरी के दिखने के तरीके के लिए, आधिकारिक समझौतों की ज़रूरत होगी. इससे अलग-अलग हार्डवेयर प्लैटफ़ॉर्म पर, उपयोगकर्ता अनुभव में अंतर होगा.

ध्यान दें: रेडियो ऐप्लिकेशन में ऐसी कोई अतिरिक्त जानकारी नहीं होती है जो किसी ऐसे स्टेशन का नाम खोजने में मददगार हो जिसे MediaBrowser इंटरफ़ेस के ज़रिए क्लाइंट को नहीं दिखाया जाता.

अगले या पिछले स्टेशन पर जाने की सुविधा, मौजूदा कॉन्टेक्स्ट पर निर्भर करती है:

  • जब कोई ऐप्लिकेशन, पसंदीदा सूची में से किसी स्टेशन पर ट्यून होता है, तो ऐप्लिकेशन पसंदीदा सूची में से अगले स्टेशन पर जा सकता है.
  • प्रोग्राम की सूची से किसी स्टेशन को सुनने पर, चैनल नंबर के हिसाब से, अगले उपलब्ध स्टेशन पर ट्यून किया जा सकता है.
  • किसी भी चैनल को सुनने पर, अगले चैनल पर स्विच हो सकता है. ऐसा तब भी हो सकता है, जब ब्रॉडकास्ट सिग्नल न हो.

रेडियो ऐप्लिकेशन ये कार्रवाइयां करता है.

गड़बड़ी ठीक करना

TransportControls कार्रवाइयां (चलाएं, रोकें, और अगला) यह फ़ीडबैक नहीं देतीं कि कार्रवाई पूरी हुई है या नहीं. गड़बड़ी का पता लगाने का एक ही तरीका है. इसके लिए, MediaSession की स्थिति को गड़बड़ी के मैसेज के साथ STATE_ERROR पर सेट करें.

रेडियो ऐप्लिकेशन को उन कार्रवाइयों को मैनेज करना होगा और उन्हें लागू करना होगा या गड़बड़ी की स्थिति सेट करनी होगी. अगर 'चलाएं' निर्देश तुरंत लागू नहीं होता है, तो निर्देश लागू होने के दौरान, प्लेलिस्ट की स्थिति को STATE_CONNECTING (डायरेक्ट ट्यून के मामले में) या STATE_SKIPPING_TO_PREVIOUS या NEXT में बदल दिया जाना चाहिए.

क्लाइंट को PlaybackState को देखना चाहिए और पुष्टि करनी चाहिए कि सेशन ने मौजूदा प्रोग्राम को उस प्रोग्राम में बदल दिया है जिसका अनुरोध किया गया था या जिस प्रोग्राम में गड़बड़ी की स्थिति में डाला गया था. STATE_CONNECTING की अवधि 30 सेकंड से ज़्यादा नहीं होनी चाहिए. हालांकि, किसी दी गई AM/FM फ़्रीक्वेंसी पर सीधे ट्यून करने पर, यह प्रोसेस काफ़ी तेज़ी से पूरी होनी चाहिए.

पसंदीदा संपर्क जोड़ना और हटाना

MediaSession में रेटिंग की सुविधा होती है. इसका इस्तेमाल, पसंदीदा वीडियो को कंट्रोल करने के लिए किया जा सकता है. onSetRating टाइप की रेटिंग के साथ कॉल किया गया RATING_HEART फ़िलहाल ट्यून किए गए स्टेशन को पसंदीदा सूची में जोड़ता है या उससे हटाता है.

लेगसी प्रीसेट के उलट, यह मॉडल पसंदीदा प्लेलिस्ट की ऐसी सूची के बारे में बताता है जिसमें क्रम नहीं होता और जिसकी सीमा तय नहीं होती. हालांकि, सेव किए गए हर पसंदीदा प्लेलिस्ट को एक संख्या वाला स्लॉट (आम तौर पर, 1 से 6) दिया जाता है. इस वजह से, प्रीसेट पर आधारित सिस्टम, onSetRating के साथ काम नहीं करेंगे.

MediaSession API की एक सीमा यह है कि सिर्फ़ उस स्टेशन को जोड़ा या हटाया जा सकता है जिसे फ़िलहाल ट्यून किया गया है. उदाहरण के लिए, आइटम हटाने से पहले, उन्हें चुना जाना चाहिए. यह सिर्फ़ MediaBrowser क्लाइंट की एक सीमा है, जैसे कि साथी ऐप्लिकेशन. रेडियो ऐप्लिकेशन पर यह पाबंदी नहीं है. अगर कोई ऐप्लिकेशन पसंदीदा के तौर पर सेट नहीं किया जा सकता, तो यह हिस्सा ज़रूरी नहीं है.

MediaBrowser

किसी क्षेत्र के लिए कौनसी फ़्रीक्वेंसी या चैनल के नाम मान्य हैं, यह बताने के लिए हर बैंड के लिए सभी मान्य चैनल (फ़्रीक्वेंसी) की सूची दी जाती है. ऐसा तब किया जाता है, जब किसी चैनल को ट्यून करना किसी रेडियो टेक्नोलॉजी के लिए सही हो. अमेरिका में, 0.2 मेगाहर्ट्ज़ के स्पेसिंग का इस्तेमाल करके, 87.8 से लेकर 108.0 मेगाहर्ट्ज़ की रेंज में 101 एफ़एम चैनल और 10 किलोहर्ट्ज़ के स्पेसिंग का इस्तेमाल करके, 530 से लेकर 1700 किलोहर्ट्ज़ की रेंज में 117 एएम चैनल उपलब्ध हैं. एचडी रेडियो, एक ही चैनल स्पेस का इस्तेमाल करता है. इसलिए, इसे अलग से नहीं दिखाया जाता.

फ़िलहाल उपलब्ध रेडियो प्रोग्राम की सूची में, डायरेक्ट ऑडियो ब्रॉडकास्ट (डीएबी) एन्सेम्बल के हिसाब से ग्रुप करने जैसी डिसप्ले स्कीम की अनुमति नहीं है.

ऐसा हो सकता है कि पसंदीदा सूची में मौजूद एंट्री में बदलाव न किया जा सके. उदाहरण के लिए, अगर कोई प्रोग्राम तय सीमा से बाहर है. रेडियो ऐप्लिकेशन यह पता लगा सकता है कि एंट्री को पहले से ट्यून किया जा सकता है या नहीं. ऐसा होने पर, हो सकता है कि वह एंट्री को 'चलाया जा सकता है' के तौर पर मार्क न करे.

टॉप-लेवल फ़ोल्डर की पहचान करने के लिए, ब्लूटूथ की तरह ही प्रोसेस का इस्तेमाल किया जाता है. इसका मतलब है कि MediaDescription OBJECT के Extras बंडल में, ट्यूनर से जुड़ा फ़ील्ड होता है. ठीक उसी तरह जैसे EXTRA_BT_FOLDER_TYPE के लिए ब्लूटूथ होता है. ब्रॉडकास्ट रेडियो के मामले में, इससे सार्वजनिक एपीआई में ये नए फ़ील्ड तय किए जाते हैं:

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE". इनमें से कोई एक वैल्यू:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1. फ़िलहाल उपलब्ध प्रोग्राम.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2. पसंदीदा.
    • BCRADIO_FOLDER_TYPE_BAND = 3. किसी बैंड के लिए सभी फ़िज़िकल चैनल.

    रेडियो के लिए खास तौर पर बनाए गए कस्टम मेटाडेटा फ़ील्ड तय करने की ज़रूरत नहीं है, क्योंकि काम का सारा डेटा मौजूदा MediaBrowser.MediaItem स्कीम में फ़िट हो जाता है:

    • प्रोग्राम का नाम (आरडीएस पीएस, डीएबी सेवा का नाम). MediaDescription.getTitle.
    • एफ़एम फ़्रीक्वेंसी. यूआरआई (ProgramSelector देखें) या MediaDescription.getTitle (अगर कोई एंट्री BROADCASTRADIO_FOLDER_TYPE_BAND फ़ोल्डर में है).
    • रेडियो के हिसाब से आइडेंटिफ़ायर (आरडीएस पीआई, डीएबी एसआईडी). MediaDescription.getMediaUri को ProgramSelector में पार्स किया गया.

    आम तौर पर, मौजूदा प्रोग्राम या पसंदीदा सूची में किसी एंट्री के लिए, एफ़एम फ़्रीक्वेंसी फ़ेच करने की ज़रूरत नहीं होती. ऐसा इसलिए, क्योंकि क्लाइंट को मीडिया आईडी पर काम करना चाहिए. हालांकि, अगर इस तरह की ज़रूरत पड़ती है (उदाहरण के लिए, डिसप्ले के लिए), तो यह यूआरआई में मौजूद होता है और इसे ProgramSelector में पार्स किया जा सकता है. हालांकि, हमारा सुझाव है कि मौजूदा सेशन में आइटम चुनने के लिए, यूआरआई का इस्तेमाल न करें. ज़्यादा जानकारी के लिए, ProgramSelector देखें.

    परफ़ॉर्मेंस या बाइंडर से जुड़ी समस्याओं से बचने के लिए, MediaBrowser सेवा में पेजेशन की सुविधा होनी चाहिए:

    ध्यान दें: डिफ़ॉल्ट रूप से, onLoadChildren() वैरिएंट में विकल्पों को मैनेज किए बिना, पेजेशन लागू होता है.

    सभी तरह की सूचियों (रॉ चैनल, मिले हुए प्रोग्राम, और पसंदीदा) से जुड़ी एंट्री के अलग-अलग मीडिया आईडी हो सकते हैं. यह रेडियो ऐप्लिकेशन पर निर्भर करता है. सहायता लाइब्रेरी में ये अलग-अलग होंगे. ज़्यादातर मामलों में, यूआरआई (ProgramSelector फ़ॉर्म में) रॉ चैनलों और मिले हुए प्रोग्राम के बीच अलग-अलग होते हैं. हालांकि, मिले हुए प्रोग्राम और पसंदीदा प्रोग्राम के बीच ये यूआरआई ज़्यादातर एक जैसे होते हैं. उदाहरण के लिए, जब AF अपडेट किया गया हो.

    अलग-अलग तरह की सूचियों की एंट्री के लिए अलग-अलग मीडिया आईडी होने पर, उन पर अलग-अलग कार्रवाइयां की जा सकती हैं. हाल ही में चुने गए MediaItem के फ़ोल्डर के आधार पर, onSkipToNext पर पसंदीदा सूची या सभी प्रोग्राम की सूची में जाया जा सकता है. इसके लिए, MediaSession देखें.

    खास ट्यून से जुड़ी कार्रवाइयां

    प्रोग्राम की सूची की मदद से, उपयोगकर्ता किसी खास स्टेशन पर ट्यून कर सकते हैं. हालांकि, इससे उपयोगकर्ताओं को "एफ़एम पर ट्यून करें" जैसे सामान्य अनुरोध करने की अनुमति नहीं मिलती. ऐसा करने पर, एफ़एम बैंड पर हाल ही में सुने गए स्टेशन पर ट्यून किया जा सकता है.

    ऐसी कार्रवाइयों को पूरा करने के लिए, कुछ टॉप-लेवल डायरेक्ट्री में FLAG_PLAYABLE फ़्लैग सेट होता है. साथ ही, फ़ोल्डर के लिए FLAG_BROWSABLE फ़्लैग भी सेट होता है.

    कार्रवाई ट्यून इन करने के लिए जारी करने का तरीका
    रेडियो चलाएं कोई भी रेडियो चैनल startService(ACTION_PLAY_BROADCASTRADIO)

    या,

    playFromMediaId(MediaBrowser.getRoot())
    Play FM कोई भी एफ़एम चैनल FM बैंड के mediaId से चलाएं.

    यह तय करना कि किस प्रोग्राम को ट्यून करना है, यह ऐप्लिकेशन पर निर्भर करता है. आम तौर पर, यह सूची में मौजूद उस चैनल पर ट्यून होता है जिस पर हाल ही में ट्यून किया गया था. ACTION_PLAY_BROADCASTRADIO के बारे में ज़्यादा जानकारी के लिए, सामान्य तौर पर वीडियो चलाने के इंटेंट देखें.

    डिवाइस और सेवाओं की अपने-आप पहचान करना और सेवा से कनेक्ट करना

    PackageManager, ब्रॉडकास्ट रेडियो ट्रीर की सेवा देने वाली MediaBrowserService को सीधे तौर पर ढूंढ सकता है. ऐसा करने के लिए, ACTION_PLAY_BROADCASTRADIO इंटेंट (सामान्य तौर पर चलाने के इंटेंट देखें) और MATCH_SYSTEM_ONLY फ़्लैग के साथ resolveService को कॉल करें. रेडियो सेवा देने वाली सभी सेवाओं को ढूंढने के लिए (एक से ज़्यादा हो सकती हैं; उदाहरण के लिए, अलग-अलग एएम/एफ़एम और सैटलाइट), queryIntentServices का इस्तेमाल करें.

    रिज़ॉल्व की गई सेवा, android.media.browse.MediaBrowserService bind इंटेंट को भी मैनेज करती है. इसकी पुष्टि GTS की मदद से की जाती है.

    चुने गए MediaBrowserService से कनेक्ट करने के लिए, किसी सेवा कॉम्पोनेंट और connect के लिए MediaBrowser इंस्टेंस बनाएं. कनेक्शन बनाने के बाद, MediaSession का हैंडल पाने के लिए getSessionToken का इस्तेमाल किया जा सकता है.

    रेडियो ऐप्लिकेशन, अपनी सेवा के onGetRoot लागू होने पर, कनेक्ट करने की अनुमति वाले क्लाइंट पैकेज पर पाबंदी लगा सकता है. ऐप्लिकेशन को सिस्टम ऐप्लिकेशन को व्हाइटलिस्ट किए बिना कनेक्ट करने की अनुमति देनी चाहिए. व्हाइटलिस्ट करने के बारे में ज़्यादा जानने के लिए, Assistant ऐप्लिकेशन का पैकेज और हस्ताक्षर स्वीकार करना लेख पढ़ें.

    अगर सोर्स के हिसाब से बनाया गया ऐप्लिकेशन (उदाहरण के लिए, रेडियो ऐप्लिकेशन) किसी ऐसे डिवाइस पर इंस्टॉल किया गया है जिसमें सोर्स के हिसाब से काम करने की सुविधा नहीं है, तो भी वह ऐप्लिकेशन खुद को ACTION_PLAY_BROADCASTRADIO इंटेंट को मैनेज करने वाला बताएगा. हालांकि, उसके MediaBrowser ट्री में रेडियो के हिसाब से टैग नहीं होंगे. इसलिए, अगर किसी क्लाइंट को यह देखना है कि कोई दिया गया सोर्स किसी डिवाइस पर उपलब्ध है या नहीं, तो उसे:

    1. रेडियो सेवा ढूंढें (ACTION_PLAY_BROADCASTRADIO के लिए resolveService पर कॉल करें).
    2. MediaBrowser बनाएं और फिर उससे कनेक्ट करें.
    3. EXTRA_BCRADIO_FOLDER_TYPE के साथ MediaItem की मौजूदगी का पता लगाएं अतिरिक्त.

    ध्यान दें: ज़्यादातर मामलों में, क्लाइंट को किसी डिवाइस के लिए उपलब्ध सभी सोर्स का पता लगाने के लिए, सभी उपलब्ध MediaBrowser ट्री को स्कैन करना होगा.

    बैंड के नाम

    बैंड की सूची, टॉप-लेवल डायरेक्ट्री के सेट के तौर पर दिखती है. इसमें फ़ोल्डर टाइप के टैग को BCRADIO_FOLDER_TYPE_BAND पर सेट किया जाता है. उनके MediaItem के टाइटल, स्थानीय भाषा में लिखे गए बैंड के नाम हैं. ज़्यादातर मामलों में, यह अंग्रेज़ी अनुवाद के जैसा ही होगा. हालांकि, क्लाइंट इस बात पर भरोसा नहीं कर सकता.

    कुछ बैंड को खोजने के लिए एक बेहतर तरीका उपलब्ध कराने के लिए, बैंड फ़ोल्डर के लिए एक अतिरिक्त टैग, EXTRA_BCRADIO_BAND_NAME_EN जोड़ा गया है. यह बैंड का ऐसा नाम है जो स्थानीय भाषा में नहीं है. इसमें इनमें से सिर्फ़ एक वैल्यू का इस्तेमाल किया जा सकता है:

    • AM
    • FM
    • DAB

    अगर बैंड इस सूची में नहीं है, तो बैंड के नाम का टैग सेट नहीं किया जाना चाहिए. हालांकि, अगर बैंड की जानकारी सूची में मौजूद है, तो उसमें टैग सेट होना चाहिए. एचडी रेडियो, अलग-अलग बैंड की जानकारी नहीं देता, क्योंकि यह एएम/एफ़एम की तरह ही काम करता है.

    सामान्य तौर पर वीडियो चलाने के इंटेंट

    किसी सोर्स (जैसे, रेडियो या सीडी) को चलाने के लिए बने हर ऐप्लिकेशन को, सामान्य चलाएं इंटेंट को मैनेज करना होगा. इससे, कुछ कॉन्टेंट को शायद बंद स्थिति (उदाहरण के लिए, बूट करने के बाद) से चलाया जा सकता है. यह ऐप्लिकेशन पर निर्भर करता है कि कौनसा कॉन्टेंट चलाया जाए, लेकिन आम तौर पर हाल ही में चलाया गया रेडियो प्रोग्राम या सीडी ट्रैक चलाया जाता है.हर ऑडियो सोर्स के लिए, एक अलग इंटेंट तय किया गया है:

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD: CD-DA या CD-Text
    • android.car.intent.action.PLAY_DATADISC: ऑप्टिकल डेटा डिस्क, जैसे कि सीडी/डीवीडी, लेकिन सीडी-डीए (मिक्स्ड मोड सीडी हो सकती है)
    • android.car.intent.action.PLAY_AUX: ऑक्स पोर्ट के बारे में जानकारी दिए बिना
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB: यह बताए बिना कि कौनसा यूएसबी डिवाइस
    • android.car.intent.action.PLAY_LOCAL: लोकल मीडिया स्टोरेज (बिल्ट-इन फ़्लैश)

    सामान्य तौर पर संगीत चलाने के लिए, इंटेंट का इस्तेमाल इसलिए किया गया है, क्योंकि इससे एक साथ दो समस्याएं हल होती हैं: सामान्य तौर पर संगीत चलाने का निर्देश और सेवा की जानकारी. इस तरह के इंटेंट का एक और फ़ायदा यह है कि MediaBrowser सेशन खोले बिना भी, ऐसी आसान कार्रवाई की जा सकती है.

    इन इंटेंट की मदद से, सेवाओं की अपने-आप पहचान करने की समस्या को हल किया जाता है. इस तरह, सेवा खोजने की प्रोसेस आसान और साफ़ तौर पर समझने लायक होती है (डिस्कवरी और सेवा कनेक्शन देखें).

    कुछ क्लाइंट को आसानी से लागू करने के लिए, ऐसा Play निर्देश जारी करने का एक और तरीका है. इसे रेडियो ऐप्लिकेशन को भी लागू करना होगा: रूट नोड के rootId के साथ playFromMediaId जारी करना (इसे मीडिया आईडी के तौर पर इस्तेमाल किया जाता है). रूट नोड को चलाया नहीं जा सकता. हालांकि, इसका रूट आईडी एक ऐसी स्ट्रिंग होती है जिसे मीडिया आईडी के तौर पर इस्तेमाल किया जा सकता है. हालांकि, क्लाइंट को इस बारीक अंतर को समझने की ज़रूरत नहीं है.

    ProgramSelector

    MediaBrowserService से कोई चैनल चुनने के लिए mediaId का इस्तेमाल किया जा सकता है. हालांकि, यह एक सेशन के लिए ही मान्य होता है और सेवा देने वाली कंपनियों के लिए एक जैसा नहीं होता. कुछ मामलों में, क्लाइंट को सेशन और डिवाइसों के बीच इसे बनाए रखने के लिए, किसी ऐसे पॉइंटर (जैसे कि पूरी फ़्रीक्वेंसी) की ज़रूरत पड़ सकती है.

    डिजिटल रेडियो ब्रॉडकास्ट के दौर में, किसी खास स्टेशन को ट्यून करने के लिए, सिर्फ़ फ़्रीक्वेंसी का पता होना काफ़ी नहीं है. इसलिए, किसी एनालॉग या डिजिटल चैनल पर ट्यून करने के लिए, ProgramSelector का इस्तेमाल करें. ProgramSelector में दो हिस्से होते हैं:

    • प्राइमरी आइडेंटिफ़ायर. किसी रेडियो स्टेशन के लिए यूनीक और स्टेबल आइडेंटिफ़ायर, जो बदलता नहीं है. हालांकि, हो सकता है कि उस स्टेशन को ट्यून करने के लिए यह आइडेंटिफ़ायर काफ़ी न हो. उदाहरण के लिए, आरडीएस पीआई कोड, जिसे अमेरिका में कॉल साइन में बदला जा सकता है.
    • सेकंडरी आइडेंटिफ़ायर. उस स्टेशन पर ट्यून करने के लिए काम के अन्य आइडेंटिफ़ायर (उदाहरण के लिए, फ़्रीक्वेंसी). इसमें रेडियो की अन्य टेक्नोलॉजी के आइडेंटिफ़ायर भी शामिल हो सकते हैं. उदाहरण के लिए, डीएबी स्टेशन में एनालॉग ब्रॉडकास्टिंग फ़ॉलबैक हो सकता है.

    ProgramSelector को MediaBrowser या MediaSession-आधारित समाधान में फ़िट करने के लिए, इसे सीरियलाइज़ करने के लिए यूआरआई स्कीमा तय करें. स्कीमा को इस तरह परिभाषित किया गया है:

    broadcastradio://program/<primary ID type>/<primary ID>?
    <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>

    इस उदाहरण में, सवाल के निशान (?) के बाद मौजूद सेकंडरी आइडेंटिफ़ायर का हिस्सा ज़रूरी नहीं है. इसे हटाया जा सकता है, ताकि mediaId के तौर पर इस्तेमाल करने के लिए एक स्थिर आइडेंटिफ़ायर दिया जा सके. उदाहरण के लिए:

    • broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=88500&AMFM_FREQUENCY=103300
    • broadcastradio://program/AMFM_FREQUENCY/102100
    • broadcastradio://program/DAB_SID_EXT/14895264?RDS_PI=1234

    program के अथॉरिटी वाले हिस्से (जिसे हास्ट भी कहा जाता है) से, आने वाले समय में स्कीम को एक्सटेंशन देने के लिए कुछ जगह मिलती है. आइडेंटिफ़ायर टाइप की स्ट्रिंग को IdentifierType की HAL 2.x परिभाषा में उनके नाम के तौर पर सटीक तौर पर बताया गया है. साथ ही, वैल्यू का फ़ॉर्मैट दशमलव या हैक्साडेसिमल (0x प्रीफ़िक्स के साथ) नंबर है.

    वेंडर के हिसाब से सभी आइडेंटिफ़ायर, VENDOR_ प्रीफ़िक्स से दिखाए जाते हैं. उदाहरण के लिए, VENDOR_START के लिए VENDOR_0 और VENDOR_START के बाद वाले नंबर के लिए VENDOR_1. ये यूआरआई, रेडियो हार्डवेयर के हिसाब से होते हैं जिस पर इन्हें जनरेट किया गया था. इन्हें अलग-अलग ओईएम के डिवाइसों के बीच ट्रांसफ़र नहीं किया जा सकता.

    ये यूआरआई, टॉप लेवल के रेडियो फ़ोल्डर में मौजूद हर MediaItem को असाइन किए जाने चाहिए. इसके अलावा, MediaSession में playFromMediaId और playFromUri, दोनों का इस्तेमाल किया जा सकता है. हालांकि, यूआरआई का मुख्य मकसद रेडियो के मेटाडेटा (जैसे, एफ़एम फ़्रीक्वेंसी) को निकालना और उसे हमेशा के लिए सेव करना है. इस बात की कोई गारंटी नहीं है कि यूआरआई सभी मीडिया आइटम के लिए उपलब्ध होगा. उदाहरण के लिए, जब फ़्रेमवर्क में प्राइमरी आईडी टाइप काम न कर रहा हो. वहीं, मीडिया आईडी हमेशा काम करता है. हमारा सुझाव है कि क्लाइंट, मौजूदा MediaBrowser सेशन से आइटम चुनने के लिए, यूआरआई का इस्तेमाल न करें. इसके बजाय, playFromMediaId का इस्तेमाल करें. हालांकि, यह ज़रूरी है कि विज्ञापन दिखाने वाले ऐप्लिकेशन में यूआरआई मौजूद हों. यूआरआई मौजूद न होने की स्थिति में, सिर्फ़ खास मामलों में ही विज्ञापन दिखाए जा सकते हैं.

    शुरुआती डिज़ाइन में, स्कीम वाले हिस्से के बाद :// क्रम के बजाय, एक कोलन का इस्तेमाल किया गया था. हालांकि, एब्सोलूट हैरारकी वाले यूआरआई रेफ़रंस के लिए, android.net.Uri में पहला विकल्प काम नहीं करता.

    अन्य सोर्स टाइप

    अन्य ऑडियो सोर्स को भी इसी तरह हैंडल किया जा सकता है. उदाहरण के लिए, ऑक्सiliary इनपुट और ऑडियो सीडी प्लेयर.

    एक ऐप्लिकेशन में कई तरह के सोर्स हो सकते हैं. ऐसे मामलों में, हमारा सुझाव है कि आप हर तरह के सोर्स के लिए, एक अलग MediaBrowserService बनाएं. एक से ज़्यादा सोर्स/MediaBrowserServices वाले सेट-अप में भी, एक ही ऐप्लिकेशन में एक ही MediaSession का इस्तेमाल करने का ज़ोरदार सुझाव दिया जाता है.

    ऑडियो सीडी

    ऑडियो सीडी की तरह ही, ऐसी डिस्क को चलाने वाला ऐप्लिकेशन, MediaBrowser को एक ब्राउज़ की जा सकने वाली एंट्री (या अगर सिस्टम में सीडी बदलने वाला डिवाइस है, तो एक से ज़्यादा एंट्री) दिखाएगा. इसमें किसी सीडी के सभी ट्रैक शामिल होंगे. अगर सिस्टम के पास हर सीडी पर मौजूद ट्रैक के बारे में जानकारी नहीं है, तो पूरी डिस्क के लिए MediaItem सिर्फ़ PLAYABLE होगा, न कि BROWSABLE और PLAYABLE. उदाहरण के लिए, जब सभी डिस्क एक साथ एक कार्ट्रिज में डाली जाती हैं और वह सभी को नहीं पढ़ता. अगर किसी स्लॉट में कोई डिस्क नहीं है, तो आइटम PLAYABLE या BROWSABLE नहीं होगा. हालांकि, हर स्लॉट को ट्री में हमेशा मौजूद रखना ज़रूरी है.

     ऑडियो सीडी का ट्री स्ट्रक्चर
    तीसरी इमेज. ऑडियो सीडी का ट्री स्ट्रक्चर.

    इन एंट्री को उसी तरह मार्क किया जाएगा जिस तरह ब्रॉडकास्ट रेडियो फ़ोल्डर को मार्क किया जाता है. इनमें MediaDescription API में बताए गए अतिरिक्त फ़ील्ड शामिल होंगे:

    • EXTRA_CD_TRACK: ऑडियो सीडी पर मौजूद हर MediaItem के लिए, 1 पर आधारित ट्रैक नंबर.
    • EXTRA_CD_DISK: डिस्क का नंबर, जो 1 से शुरू होता है.

    CD-Text की सुविधा वाले सिस्टम और काम करने वाली डिस्क के लिए, टॉप-लेवल के MediaItem में डिस्क का टाइटल होगा. इसी तरह, ट्रैक के लिए MediaItems में ट्रैक का नाम होगा.

    सहायक इनपुट

    ऑक्सiliary इनपुट की सुविधा देने वाला ऐप्लिकेशन, MediaBrowser ट्री को दिखाता है. इसमें एक एंट्री होती है. अगर एक से ज़्यादा पोर्ट मौजूद हैं, तो एक से ज़्यादा एंट्री भी हो सकती हैं. संबंधित MediaSession, playFromMediaId अनुरोध मिलने के बाद, अपना mediaId लेता है और उस सोर्स पर स्विच करता है.

    AUX ट्री स्ट्रक्चर
    चौथी इमेज. AUX ट्री स्ट्रक्चर.

    हर AUX MediaItem एंट्री में एक अतिरिक्त फ़ील्ड होगा, EXTRA_AUX_PORT_NAME जो "AUX" फ़्रेज़ के बिना, पोर्ट के स्थानीय भाषा में न होने वाले नाम पर सेट होगा. उदाहरण के लिए, "AUX 1" को "1", "AUX front" को "front", और "AUX" को खाली स्ट्रिंग पर सेट किया जाएगा. अंग्रेज़ी के अलावा दूसरी भाषाओं में, नाम टैग वही अंग्रेज़ी स्ट्रिंग रहेगा. ऐसा नहीं है, क्योंकि EXTRA_BCRADIO_BAND_NAME_EN के लिए वैल्यू, OEM तय करता है और ये पहले से तय की गई सूची में शामिल नहीं होतीं.

    अगर हार्डवेयर, AUX पोर्ट से कनेक्ट किए गए डिवाइसों का पता लगा सकता है, तो हार्डवेयर को MediaItem को PLAYABLE के तौर पर मार्क करना चाहिए. हालांकि, ऐसा सिर्फ़ तब करना चाहिए, जब इनपुट कनेक्ट हो. अगर इस पोर्ट से कोई डिवाइस कनेक्ट नहीं है, तो भी हार्डवेयर को सूची में शामिल किया जाना चाहिए. हालांकि, उसे PLAYABLE के तौर पर शामिल नहीं किया जाना चाहिए. अगर हार्डवेयर में ऐसा कोई विकल्प नहीं है, तो MediaItem को हमेशा PLAYABLE पर सेट किया जाना चाहिए.

    अतिरिक्त फ़ील्ड

    यहां दिए गए फ़ील्ड की जानकारी दें:

    • EXTRA_CD_TRACK = "android.media.extra.CD_TRACK"
    • EXTRA_CD_DISK = "android.media.extra.CD_DISK"
    • EXTRA_AUX_PORT_NAME = "android.media.extra.AUX_PORT_NAME"

    क्लाइंट को उन एलिमेंट के लिए टॉप-लेवल MediaItems की समीक्षा करनी होगी जिनमें EXTRA_CD_DISK या EXTRA_AUX_PORT_NAME अतिरिक्त फ़ील्ड सेट है.

    ज़्यादा जानकारी वाले उदाहरण

    नीचे दिए गए उदाहरणों में, इस डिज़ाइन के हिस्से के सोर्स टाइप के लिए, MediaBrowser के ट्री स्ट्रक्चर के बारे में बताया गया है.

    ब्रॉडकास्ट रेडियो MediaBrowserService (ACTION_PLAY_BROADCASTRADIO को मैनेज करता है):

    • स्टेशन (ब्राउज़ किए जा सकते हैं)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • BBC One (चलने वाला) यूआरआई: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (चलने वाला) यूआरआई: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (चलने वाला) यूआरआई: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (चलने वाला) यूआरआई: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 एफ़एम (चलाया जा सकता है) - RDSURI के बिना एफ़एम: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 एफ़एम (चलाया जा सकने वाला) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/620
      • BBC One (चलने वाला) यूआरआई: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • पसंदीदा (ब्राउज़ किए जा सकने वाले, चलाए जा सकने वाले)EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • BBC One (चलने वाला) यूआरआई: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (चलने वाला नहीं)यूआरआई: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (ब्राउज़ किया जा सकता है, चलाया जा सकता है): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (playable) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (चलने वाला) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 AM (चलने वाला) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/550
    • एफ़एम (ब्राउज़ किया जा सकता है, चलाया जा सकता है): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 एफ़एम (चलने वाला) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 एफ़एम (चलने वाला) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 एफ़एम (चलने वाला) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/88100
    • डीएबी (चलने वाला): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    ऑडियो सीडी MediaBrowserService (ACTION_PLAY_AUDIOCD को मैनेज करती है):

    • डिस्क 1 (चलने वाली) EXTRA_CD_DISK=1
    • दूसरी डिस्क (ब्राउज़ की जा सकती है, चलाया जा सकता है) EXTRA_CD_DISK=2
      • ट्रैक 1 (चलाया जा सकता है) EXTRA_CD_TRACK=1
      • ट्रैक 2 (चलाया जा सकता है) EXTRA_CD_TRACK=2
    • मेरी संगीत सीडी (ब्राउज़ की जा सकती है, चलाया जा सकता है) EXTRA_CD_DISK=3
      • All By Myself (playable) EXTRA_CD_TRACK=1
      • Reise, Reise (playable) EXTRA_CD_TRACK=2
    • खाली स्लॉट 4 (चलाया नहीं जा सकता) EXTRA_CD_DISK=4

    AUX MediaBrowserService (ACTION_PLAY_AUX को मैनेज करती है):

    • सामने की ऑक्स सॉकेट (इससे संगीत चलाया जा सकता है) EXTRA_AUX_PORT_NAME="front"
    • पीछे की ऑक्स सॉकेट (वीडियो चलाने की सुविधा) EXTRA_AUX_PORT_NAME="rear"