रेडियो लागू करें

यह पृष्ठ बताता है कि हार्डवेयर और सॉफ्टवेयर स्तरों पर रेडियो को कैसे लागू किया जाए।

तंत्र के अंश

प्रसारण रेडियो स्टैक में निम्नलिखित घटक शामिल हैं।

प्रसारण रेडियो वास्तुकला
चित्र 1. प्रसारण रेडियो संरचना

रेडियो संदर्भ ऐप

रेडियो नियंत्रण कैसे लागू करें, इसके विवरण के लिए, रेडियो नियंत्रण कार्यान्वयन देखें।

एक नमूना जावा रेडियो ऐप ( packages/apps/Car/Radio ) एक संदर्भ कार्यान्वयन के रूप में कार्य करता है। जब ऐप सेवा शुरू होती है, तो वह रेडियो मैनेजर से एक रेडियो ट्यूनर खोलने का अनुरोध करती है। फिर, ऐप रेडियो ट्यूनर को अनुरोध भेज सकता है, जैसे किसी विशिष्ट रेडियो स्टेशन पर ट्यूनिंग, आवृत्ति, या अगले उपलब्ध रेडियो स्टेशन की तलाश करना। ऐप रेडियो में रेडियो प्रबंधक और रेडियो ट्यूनर से अपडेट प्राप्त करता है, जैसे कि वर्तमान कार्यक्रम की जानकारी, रेडियो कार्यक्रम की सूची, कॉन्फ़िगरेशन और विक्रेता-परिभाषित पैरामीटर। संदर्भ रेडियो ऐप केवल AM और FM रेडियो का समर्थन करता है। ओईएम रेडियो ऐप को इच्छानुसार संशोधित या बदल सकते हैं।

रेडियो प्रबंधक

जब ऐप रेडियो मैनेजर से एक ट्यूनर खोलने का अनुरोध करता है, तो रेडियो मैनेजर ( frameworks/base/core/java/android/hardware/radio/RadioManager.java ) ब्रॉडकास्ट रेडियो सर्विस से ट्यूनर सत्र खोलने का अनुरोध करता है और फिर सत्र को लपेटता है रेडियो ट्यूनर ( frameworks/base/core/java/android/hardware/radio/RadioTuner.java ), जो ऐप में वापस आ जाता है। रेडियो ट्यूनर एपीआई (जैसे ट्यून, स्टेप और कैंसल) को परिभाषित करता है जिसे रेडियो ऐप से कॉल किया जा सकता है और ब्रॉडकास्ट रेडियो सर्विस को अनुरोध भेजा जा सकता है। कॉलबैक विधियाँ ( RadioTuner.Callback ) रेडियो ट्यूनर में परिभाषित प्रसारण रेडियो एचएएल के बारे में अपडेट भेजती हैं, जैसे कि वर्तमान कार्यक्रम की जानकारी, कार्यक्रम की सूची और विक्रेता-परिभाषित पैरामीटर, ब्रॉडकास्ट रेडियो सेवा से ऐप्स तक।

प्रसारण रेडियो सेवा

ब्रॉडकास्ट रेडियो सर्विस ( frameworks/base/services/core/java/com/android/server/broadcastradio ) ब्रॉडकास्ट रेडियो एचएएल के लिए ग्राहक सेवा है। ब्रॉडकास्ट रेडियो सर्विस ब्रॉडकास्ट रेडियो एचएएल के साथ कई रेडियो प्रबंधकों का समन्वय करती है। ब्रॉडकास्ट रेडियो सर्विस एचएएल इंटरफेस डेफिनिशन लैंग्वेज (एचआईडीएल) और एंड्रॉइड इंटरफेस डेफिनिशन लैंग्वेज (एआईडीएल) ब्रॉडकास्ट रेडियो एचएएल को सपोर्ट करती है। प्रसारण रेडियो सेवा एआईडीएल एचएएल से जुड़ती है जब कोई एआईडीएल एचएएल सेवा मौजूद होती है; अन्यथा, सेवा एचआईडीएल एचएएल से जुड़ती है। प्रसारण रेडियो सेवा प्रत्येक उपलब्ध एचएएल उदाहरण (जैसे एएम, एफएम और डीएबी) के लिए एक रेडियो मॉड्यूल बनाती है।

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

प्रसारण रेडियो एचएएल

प्रसारण रेडियो के एचआईडीएल और एआईडीएल इंटरफेस और दोनों के बीच के अंतर के बारे में अधिक जानने के लिए, ब्रॉडकास्ट रेडियो एचएएल इंटरफ़ेस देखें।

प्रसारण रेडियो हार्डवेयर अमूर्त परत

निम्नलिखित खंड प्रसारण रेडियो को लागू करने के लिए हार्डवेयर परत के साथ काम करने का वर्णन करते हैं।

प्रसारण रेडियो एचएएल इंटरफ़ेस

ब्रॉडकास्ट रेडियो एचएएल प्रसारण रेडियो, जैसे एएम/एफएम और डीएबी रेडियो को लागू करने के लिए हार्डवेयर स्तर पर डेटा संरचनाएं और इंटरफेस प्रदान करता है।

एचआईडीएल 2.0 और एआईडीएल इंटरफेस

प्रसारण रेडियो एचएएल निम्नलिखित अनुभागों में वर्णित इंटरफेस का उपयोग करता है।

घोषणा श्रोता

IAnnouncementListener घोषणा श्रोता के लिए कॉलबैक इंटरफ़ेस है, जिसे प्रसारण रेडियो HAL पर घोषणाएँ प्राप्त करने के लिए पंजीकृत किया जा सकता है। इंटरफ़ेस में निम्नलिखित विधियाँ हैं:

IAnnouncementListener
विवरण: जब भी घोषणा सूची बदली जाती है तो कॉल किया जाता है।
एचआईडीएल 2.0 oneway onListUpdated(vec<Announcement> announcements)
एआईडीएल oneway void onListUpdated(in Announcement[] announcements)
हैंडल बंद करें

ICloseHandle एक कॉलबैक को हटाने के लिए सामान्य बंद हैंडल है जिसे सक्रिय इंटरफ़ेस की आवश्यकता नहीं होती है।

ICloseHandle
विवरण: हैंडल बंद करें।
एचआईडीएल 2.0 close()
एआईडीएल void close()

कॉलबैक इंटरफ़ेस

ITunerCallback एचएएल ग्राहक सेवा को अपडेट भेजने के लिए ब्रॉडकास्ट रेडियो एचएएल द्वारा कॉलबैक इंटरफ़ेस है।

ITunerCallback
विवरण: एचएएल द्वारा कॉल किया जाता है जब एक ट्यूनिंग ऑपरेशन (ट्यून, सीक (एआईडीएल में) या स्कैन (एचआईडीएल में) और चरण सफल होता है) एसिंक्रोनस रूप से विफल हो जाता है।
एचआईडीएल 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
एआईडीएल void onCurrentProgramInfoChanged(in ProgramInfo info)
विवरण: कॉल किया जाता है जब ट्यून, सीक (एआईडीएल में) या स्कैन (एचआईडीएल में), या चरण सफल होता है।
एचआईडीएल 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
एआईडीएल void onTuneFailed(in Result result, in ProgramSelector selector)
विवरण: कॉल किया जाता है जब ट्यून, सीक (एआईडीएल में) या स्कैन (एचआईडीएल में), या चरण सफल होता है।
एचआईडीएल 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
एआईडीएल void onCurrentProgramInfoChanged(in ProgramInfo info)
विवरण: प्रोग्राम सूची अपडेट होने पर कॉल किया जाता है; प्रत्येक चंक का आकार 500kiB तक सीमित होना चाहिए।
एचआईडीएल 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
एआईडीएल oneway onProgramListUpdated(ProgramListChunk chunk)
विवरण: ऐन्टेना कनेक्ट या डिस्कनेक्ट होने पर कॉल किया जाता है।
एचआईडीएल 2.0 oneway onAntennaStateChange(bool connected)
एआईडीएल void onCurrentProgramInfoChanged(in ProgramInfo info)
विवरण: कॉल किया जाता है जब विक्रेता-विशिष्ट पैरामीटर मान एचएएल में आंतरिक रूप से अपडेट किए जाते हैं (एचएएल क्लाइंट द्वारा setParameters को कॉल करने के बाद लागू नहीं किया जाना चाहिए)।
एचआईडीएल 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
एआईडीएल void onParametersUpdated(in VendorKeyValue[] parameters)
विवरण: एआईडीएल में नया। जब एचएएल में कॉन्फिग फ्लैग को आंतरिक रूप से अपडेट किया जाता है तो कॉल किया जाता है (एचएएल क्लाइंट द्वारा setConfigFlag को कॉल करने के बाद इसे लागू नहीं किया जाना चाहिए)।
एचआईडीएल 2.0 लागू नहीं।
एआईडीएल void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

प्राथमिक प्रसारण रेडियो एचएएल इंटरफ़ेस

IBroadcastRadio प्रसारण रेडियो एचएएल के लिए प्राथमिक इंटरफ़ेस है। HIDL 2.0 HAL में, ऑपरेशन को कॉल करने के लिए ट्यूनर के लिए ITunerSession इंटरफ़ेस का उपयोग करें। हालाँकि, अधिकतम एक ट्यूनर एक समय में सक्रिय होता है (बशर्ते प्रत्येक प्रसारण रेडियो HAL उदाहरण में केवल एक ट्यूनर चिप हो)। ITunerSession को AIDL इंटरफेस से हटा दिया गया था और इसके इंटरफेस को IBroadcastRadio में ले जाया गया।

IBroadcastRadio
विवरण: एक मॉड्यूल और उसकी क्षमताओं का विवरण प्राप्त करें।
एचआईडीएल 2.0 getProperties() generates (Properties properties)
एआईडीएल Properties getProperties()
विवरण: वर्तमान या संभावित AM/FM क्षेत्र कॉन्फ़िगरेशन प्राप्त करता है।
एचआईडीएल 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
एआईडीएल AmFmRegionConfig getAmFmRegionConfig(bool full)
विवरण: वर्तमान डीएबी क्षेत्र विन्यास प्राप्त करता है।
एचआईडीएल 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
एआईडीएल DabTableEntry[] getDabRegionConfig()
विवरण: रेडियो मॉड्यूल कैश से एक छवि प्राप्त करता है। एआईडीएल में, बाइंडर ट्रांजेक्शन बफर पर हार्ड लिमिट के कारण छवि का आकार 1 एमबी से कम होना चाहिए।
एचआईडीएल 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
एआईडीएल byte[] getImage(in int id)
विवरण: घोषणा श्रोता को पंजीकृत करता है।
एचआईडीएल 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
एआईडीएल ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
विवरण:
  • एचआईडीएल एचएएल: जब एक नया ट्यूनर सत्र खोला जाता है, तो पुराने सत्र को समाप्त किया जाना चाहिए।
  • एआईडीएल एचएएल: चूंकि कोई ट्यूनर सत्र उपलब्ध नहीं है, केवल ट्यूनर कॉलबैक सेट करने की आवश्यकता है। यदि यह मौजूद है, तो पुराना कॉलबैक अनसेट होना चाहिए।
एचआईडीएल 2.0 openSession(ITunerCallback callback) उत्पन्न करता है (Result result, ITunerSession session)
एआईडीएल void setTunerCallback(in ITunerCallback callback)
विवरण:
  • एचआईडीएल एचएएल: एक ट्यूनर सत्र को बंद करना विफल नहीं होना चाहिए और केवल एक बार जारी किया जाना चाहिए।
  • एआईडीएल एचएएल: कोई ट्यूनर नहीं है और केवल ट्यूनर कॉलबैक को अनसेट करने की आवश्यकता है।
एचआईडीएल 2.0 close()
एआईडीएल unsetTunerCallback()
विवरण: एक निर्दिष्ट कार्यक्रम के लिए धुन।
एचआईडीएल 2.0 tune(ProgramSelector program) generates (Result result)
एआईडीएल void tune(in ProgramSelector program)
विवरण: प्रसारित होने वाले अगले मान्य कार्यक्रम की तलाश करता है। AIDL में भ्रम से बचने के लिए, scan का नाम बदलकर seek कर दिया गया है।
एचआईडीएल 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
एआईडीएल void seek(in boolean directionUp, in boolean skipSubChannel)
विवरण: सन्निकट चैनल के चरण, जो किसी भी कार्यक्रम द्वारा कब्जा नहीं किया जा सकता है।
एचआईडीएल 2.0 step(bool directionUp) generates (Result result)
एआईडीएल void step(in boolean directionUp)
विवरण: लंबित ट्यून को रद्द करता है, स्कैन (एचआईडीएल में) या सीक (एआईडीएल में), या स्टेप ऑपरेशंस।
एचआईडीएल 2.0 cancel()
एआईडीएल void cancel()
विवरण: प्रोग्राम सूची में फ़िल्टर लागू करता है और onProgramListUpdated कॉलबैक पर प्रोग्राम सूची अपडेट भेजना प्रारंभ करता है।
एचआईडीएल 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
एआईडीएल void startProgramListUpdates(in ProgramFilter filter)
विवरण: प्रोग्राम सूची अपडेट भेजना बंद करता है।
एचआईडीएल 2.0 stopProgramListUpdates()
एआईडीएल void stopProgramListUpdates()
विवरण: किसी दिए गए कॉन्फ़िगरेशन फ़्लैग की वर्तमान सेटिंग प्राप्त करता है।
एचआईडीएल 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
एआईडीएल boolean isConfigFlagSet(in ConfigFlag flag)
विवरण: दिए गए कॉन्फ़िगरेशन फ़्लैग को सेट करता है।
एचआईडीएल 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
एआईडीएल void setConfigFlag(in ConfigFlag flag, boolean value)
विवरण: विक्रेता-विशिष्ट पैरामीटर मान सेट करता है।
एचआईडीएल 2.0 setParameters(vec<VendorKeyValue> parameters)

उत्पन्न करता है ,

(vec<VendorKeyValue> results)
एआईडीएल VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
विवरण: विक्रेता-विशिष्ट पैरामीटर मान प्राप्त करता है।
एचआईडीएल 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
एआईडीएल VendorKeyValue[] getParameters(in String[] keys)

इंटरफ़ेस स्पष्टीकरण

अतुल्यकालिक व्यवहार

चूंकि प्रत्येक ट्यूनिंग ऑपरेशन (उदाहरण के लिए, ट्यून, स्कैन (HIDL में) या सीक (AIDL में), और स्टेप) समय लेने वाला हो सकता है और थ्रेड को लंबे समय तक ब्लॉक नहीं किया जाना चाहिए, ऑपरेशन को समय लेने वाले ऑपरेशन शेड्यूल करना चाहिए बाद में होने के लिए और जल्दी से एक स्थिति या परिणाम लौटाएं। विस्तार से, प्रत्येक ऑपरेशन को चाहिए:

  • सभी लंबित ट्यूनिंग कार्यों को रद्द करें।
  • जांचें कि क्या ऑपरेशन को विधि इनपुट और ट्यूनर की स्थिति के आधार पर संसाधित किया जा सकता है।
  • ट्यूनिंग कार्य शेड्यूल करें और फिर Result (एचआईडीएल में) या status (एआईडीएल में) तुरंत लौटाएं। यदि Result या status OK है, तो ट्यूनर कॉलबैक tuneFailed या currentProgramInfoChanged चेंज को ट्यूनिंग कार्य विफल होने पर (उदाहरण के लिए, टाइमआउट के कारण) या पूर्ण होने पर कॉल किया जाना चाहिए।

इसी तरह, startProgramListUpdates प्रोग्राम सूची को बाद में होने के लिए अपडेट करने और किसी स्थिति या परिणाम को तुरंत वापस करने के समय लेने वाले कार्य को भी शेड्यूल करता है। विधि पहले लंबित अद्यतन अनुरोधों को रद्द करती है और फिर अद्यतन कार्य को शेड्यूल करती है और जल्दी से परिणाम लौटाती है।

दौड़ की स्थिति

ट्यूनिंग संचालन के अतुल्यकालिक व्यवहार के कारण (उदाहरण के लिए, ट्यून, स्कैन (HIDL में) या सीक (AIDL में), और स्टेप), ऑपरेशन को रद्द करने और ट्यूनिंग ऑपरेशन के बीच दौड़ की स्थिति मौजूद है। यदि एचएएल द्वारा एक ट्यूनिंग ऑपरेशन पूरा करने के बाद और कॉलबैक पूरा होने से पहले cancel किया जाता है, तो रद्द को अनदेखा किया जा सकता है और कॉलबैक पूरा होना चाहिए और एचएएल क्लाइंट द्वारा प्राप्त किया जाना चाहिए।

इसी तरह, अगर HAL द्वारा प्रोग्राम लिस्ट अपडेट पूरा करने के बाद और stopProgramListUpdates कॉलबैक पूरा होने से पहले onCurrentProgramInfoChanged को कॉल किया जाता है, तो stopProgramListUpdates को अनदेखा किया जा सकता है और कॉलबैक पूरा होना चाहिए।

डेटा आकार सीमा

चूंकि बाइंडर लेन-देन बफर पर एक कठिन सीमा है, संभावित बड़े आकार के डेटा पास करने वाले कुछ इंटरफ़ेस विधियों के लिए डेटा सीमा एआईडीएल एचएएल में स्पष्ट की गई है।

  • getImage के लिए 1 एमबी से कम की छवि की आवश्यकता होती है।
  • onProgramListUpdate के लिए आवश्यक है कि प्रत्येक chunk 500kiB से कम हो। बड़ी कार्यक्रम सूचियों को एचएएल कार्यान्वयन द्वारा कई हिस्सों में विभाजित किया जाना चाहिए और कई कॉलबैक के माध्यम से भेजा जाना चाहिए।

एआईडीएल एचएएल डेटा संरचनाओं में परिवर्तन

इंटरफेस में बदलाव के अलावा, इन बदलावों को प्रसारण रेडियो एआईडीएल एचएएल में परिभाषित डेटा संरचनाओं पर लागू किया गया है, जो एआईडीएल का लाभ उठाता है।

  • एआईडीएल में Constant एनम को हटा दिया गया है और IBroadcastRadio में कॉन्स्टेंट इंट के रूप में परिभाषित किया गया है। इस बीच, ANTENNA_DISCONNECTED_TIMEOUT_MS का नाम बदलकर ANTENNA_STATE_CHANGE_TIMEOUT_MS कर दिया गया है। एक नया TUNER_TIMEOUT_MS जोड़ा गया है। इस समय के भीतर सभी ट्यून, सीक और स्टेप ऑपरेशंस को पूरा किया जाना चाहिए।
  • Enum RDS और Deemphasis को AIDL में हटा दिया गया है और AmFmRegionConfig में const int के रूप में परिभाषित किया गया है। इसके विपरीत, ProgramInfo में fmDeemphasis और fmRds दोनों को int के रूप में घोषित किया जाता है, संबंधित झंडे का एक सा गणना परिणाम। इस बीच, D50 और D75 का नाम बदलकर क्रमश: DEEMPHASIS_D50 और DEEMPHASIS_D75 कर दिया गया है।
  • Enum ProgramInfoFlags को AIDL में हटा दिया गया है और ProgramInfo में const int के रूप में परिभाषित किया गया है जिसमें एक उपसर्ग FLAG_ जोड़ा गया है। इसके विपरीत, ProgramInfo में infoFlags को int के रूप में घोषित किया जाता है, झंडे का एक सा संगणना परिणाम। TUNED का नाम बदलकर FLAG_TUNABLE कर दिया गया है, ताकि इसकी परिभाषा का बेहतर वर्णन किया जा सके कि स्टेशन को ट्यून किया जा सकता है।
  • AmFmBandRange में, scanSpacing का नाम बदलकर seekSpacing कर दिया गया है, क्योंकि एआईडीएल में scan का नाम बदलकर seek कर दिया गया है।
  • चूंकि एआईडीएल में संघ की अवधारणा पेश की गई है, इसलिए एचआईडीएल एचएएल में परिभाषित MetadataKey और Metadata का अब उपयोग नहीं किया जाता है। AIDL HAL में एक AIDL यूनियन Metadata परिभाषित किया गया है। MetadataKey Metadata एक फ़ील्ड है जिसमें उनकी परिभाषाओं के आधार पर स्ट्रिंग या इंट का प्रकार है।

रेडियो नियंत्रण कार्यान्वयन

रेडियो नियंत्रण कार्यान्वयन MediaSession और MediaBrowse पर आधारित है, जो मीडिया और ध्वनि सहायक ऐप्स को रेडियो नियंत्रित करने में सक्षम बनाता है। अधिक जानकारी के लिए, Developer.android.com पर कारों के लिए मीडिया ऐप्स बनाएं देखें।

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

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

मीडिया में प्रदर्शित रेडियो और अन्य ऐप्स के बीच एक सहज संक्रमण प्रदान करने के लिए, कार-मीडिया-कॉमन लाइब्रेरी में ऐसी कक्षाएं होती हैं जिन्हें रेडियो ऐप में एकीकृत किया जाना चाहिए। MediaAppSelectorWidget को रेडियो ऐप के लिए XML में शामिल किया जा सकता है (संदर्भ मीडिया और रेडियो ऐप में इस्तेमाल होने वाला आइकन और ड्रॉप-डाउन):

<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 लॉन्च करता है, जो उन मीडिया स्रोतों की सूची प्रदर्शित करता है जिन्हें स्विच किया जा सकता है। यदि प्रदान किए गए UI के अलावा कोई अन्य वांछित है, तो आप स्विचर प्रदर्शित होने पर 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 FM चलाओ।"
  • onSkipToNext , onSkipToPrevious । अगले या पिछले स्टेशन पर ट्यून करें।
  • onSetRating । पसंदीदा में जोड़ें या हटाएं।

MediaBrowser तीन प्रकार की शीर्ष-स्तरीय निर्देशिकाओं पर एक ट्यून करने योग्य MediaItem को उजागर करता है:

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

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

MediaSession

यह देखते हुए कि प्रसारण स्ट्रीम को रोकने की कोई अवधारणा नहीं है, प्ले, पॉज़ और स्टॉप क्रियाएं हमेशा रेडियो पर लागू नहीं होती हैं। रेडियो के साथ, स्टॉप एक्शन स्ट्रीम को म्यूट करने से जुड़ा है जबकि प्ले म्यूट को हटाने से जुड़ा है।

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

MediaId और URI क्रियाओं से चलाने का उद्देश्य MediaBrowser इंटरफ़ेस से प्राप्त स्टेशन को ट्यून करना है। MediaId एक मनमाना स्ट्रिंग है जो रेडियो ऐप द्वारा एक अद्वितीय (इसलिए दी गई आईडी केवल एक आइटम को इंगित करता है) और स्थिर (इसलिए किसी दिए गए आइटम में पूरे सत्र के दौरान एक ही आईडी है) मूल्य लगाने के लिए प्रदान किया जाता है जिसके साथ किसी दिए गए स्टेशन की पहचान की जाती है . यूआरआई एक अच्छी तरह से परिभाषित स्कीमा का होगा। संक्षेप में, ProgramSelector का एक URI-ized रूप। जबकि यह विशिष्टता विशेषता को संरक्षित करता है, इसे स्थिर होने की आवश्यकता नहीं है, हालांकि यह तब बदल सकता है जब स्टेशन एक अलग आवृत्ति पर चलता है।

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

नोट: रेडियो ऐप में अतिरिक्त जानकारी नहीं है जो मीडियाब्राउज़र इंटरफ़ेस के माध्यम से क्लाइंट के सामने न आने वाले स्टेशन नाम की खोज के लिए उपयोगी होगी।

अगले या पिछले स्टेशन पर जाना वर्तमान संदर्भ पर निर्भर करता है:

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

रेडियो ऐप इन क्रियाओं को संभालता है।

त्रुटि प्रबंधन

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

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

क्लाइंट को PlaybackState देखना चाहिए और यह सत्यापित करना चाहिए कि सत्र ने वर्तमान प्रोग्राम को अनुरोधित या त्रुटि स्थिति में दर्ज करने के लिए बदल दिया है। STATE_CONNECTING 30s से अधिक नहीं होनी चाहिए। हालांकि, किसी दिए गए एएम/एफएम फ्रीक्वेंसी के लिए सीधी ट्यून को बहुत तेजी से प्रदर्शन करना चाहिए।

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

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

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

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

मीडियाब्राउज़र

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

वर्तमान में उपलब्ध रेडियो कार्यक्रमों की सूची इस लिहाज से सपाट है कि यह प्रत्यक्ष ऑडियो प्रसारण (डीएबी) पहनावा द्वारा समूहीकरण जैसी प्रदर्शन योजनाओं की अनुमति नहीं देता है।

पसंदीदा सूची में प्रविष्टियाँ ट्यून करने योग्य नहीं हो सकती हैं। उदाहरण के लिए यदि कोई दिया गया प्रोग्राम सीमा से बाहर है। रेडियो ऐप यह पता लगा सकता है या नहीं भी लगा सकता है कि प्रविष्टि को पहले से ट्यून किया जा सकता है या नहीं। यदि ऐसा है, तो हो सकता है कि यह प्रविष्टि को चलाए जाने योग्य के रूप में चिह्नित न करे।

शीर्ष-स्तरीय फ़ोल्डरों की पहचान करने के लिए, ब्लूटूथ द्वारा उपयोग की जाने वाली समान तंत्र लागू होती है। यानी, MediaDescription ऑब्जेक्ट के अतिरिक्त बंडल में एक ट्यूनर-विशिष्ट फ़ील्ड होता है, जैसे ब्लूटूथ 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
    • एफएम आवृत्ति। URI (देखें MediaDescription.getTitle ( यदि कोई प्रविष्टि BROADCASTRADIO_FOLDER_TYPE_BAND फ़ोल्डर में है)।
    • रेडियो-विशिष्ट पहचानकर्ता (RDS PI, DAB SId)। MediaDescription.getMediaUri को ProgramSelector में पार्स किया गया।

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

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

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

    सभी प्रकार की सूचियों से संबंधित प्रविष्टियाँ (कच्चे चैनल, प्रोग्राम पाए गए और पसंदीदा) में अलग-अलग मीडिया आईडी हो सकते हैं (यह रेडियो ऐप पर निर्भर है; समर्थन लाइब्रेरी में वे अलग होंगे)। यूआरआई (प्रोग्राम सेलेक्टर फॉर्म में) ज्यादातर मामलों में पाए जाने वाले कच्चे चैनलों और कार्यक्रमों के बीच भिन्न होते हैं (आरडीएस के बिना एफएम को छोड़कर), लेकिन अधिकतर कार्यक्रमों और पसंदीदा के बीच समान होते हैं (उदाहरण के लिए, जब एएफ अपडेट किया गया था)।

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

    विशेष धुन क्रियाएं

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

    ऐसी कार्रवाइयों का समर्थन करने के लिए, कुछ शीर्ष-स्तरीय निर्देशिकाओं में FLAG_PLAYABLE फ़्लैग सेट होता है (फ़ोल्डर के लिए FLAG_BROWSABLE के साथ)।

    गतिविधि के लिए धुन कैसे जारी करें
    रेडियो चलाओ कोई भी रेडियो चैनल startService(ACTION_PLAY_BROADCASTRADIO)

    या,

    playFromMediaId(MediaBrowser. getRoot() )
    एफएम चलाओ कोई भी एफएम चैनल FM बैंड के mediaId से प्ले करें।

    किस प्रोग्राम को ट्यून करना है इसका निर्धारण ऐप पर निर्भर है। यह आमतौर पर दी गई सूची से चैनल के लिए सबसे हाल ही में ट्यून किया गया है। ACTION_PLAY_BROADCASTRADIO पर विवरण के लिए, सामान्य प्ले इंटेंट देखें।

    डिस्कवरी और सेवा कनेक्शन

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

    हल की गई सेवा android.media.browse.MediaBrowserService बाइंड इंटेंट को भी हैंडल करती है। यह जीटीएस के साथ सत्यापित है।

    चयनित MediaBrowserService से कनेक्ट करने के लिए, दिए गए सेवा घटक के लिए MediaBrowser इंस्टेंस बनाएं और connect । कनेक्शन स्थापित करने के बाद, MediaSession का हैंडल getSessionToken के माध्यम से प्राप्त किया जा सकता है।

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

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

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

    नोट: ज्यादातर मामलों में, क्लाइंट को किसी दिए गए डिवाइस के लिए सभी उपलब्ध स्रोतों का पता लगाने के लिए सभी उपलब्ध 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 : सीडी-डीए या सीडी-पाठ
    • android.car.intent.action.PLAY_DATADISC : सीडी/डीवीडी जैसी ऑप्टिकल डेटा डिस्क, लेकिन सीडी-डीए नहीं (मिश्रित मोड सीडी हो सकती है)
    • android.car.intent.action.PLAY_AUX : कौन सा AUX पोर्ट निर्दिष्ट किए बिना
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB : कौन सा यूएसबी डिवाइस निर्दिष्ट किए बिना
    • android.car.intent.action.PLAY_LOCAL : लोकल मीडिया स्टोरेज (बिल्ट-इन फ्लैश)

    इंटेंट को सामान्य प्ले कमांड के लिए इस्तेमाल करने के लिए चुना गया था, क्योंकि वे एक ही बार में दो समस्याओं को हल करते हैं: सामान्य प्ले कमांड और सर्विस डिस्कवरी। इस तरह के इरादे रखने का अतिरिक्त लाभ MediaBrowser सत्र खोले बिना इस तरह की सरल क्रिया को निष्पादित करने की संभावना होगी।

    सेवा की खोज वास्तव में इन उद्देश्यों से हल की जाने वाली अधिक महत्वपूर्ण समस्या है। सेवा की खोज की प्रक्रिया इस तरह आसान और स्पष्ट है ( खोज और सेवा कनेक्शन देखें)।

    कुछ ग्राहक कार्यान्वयन को आसान बनाने के लिए, इस तरह के प्ले कमांड जारी करने का एक वैकल्पिक तरीका है (जिसे रेडियो ऐप द्वारा भी कार्यान्वित किया जाना है): रूट नोड के रूटआईड (मीडियाआईड के रूप में उपयोग किया जाता है) के साथ playFromMediaId जारी करना। जबकि रूट नोड खेलने योग्य नहीं है, इसकी रूटआईड एक मनमाना स्ट्रिंग है जिसे मीडियाआईड के रूप में उपभोज्य बनाया जा सकता है। हालाँकि, ग्राहकों को इस बारीकियों को समझने की आवश्यकता नहीं है।

    कार्यक्रम चयनकर्ता

    जबकि mediaId MediaBrowserService से एक चैनल का चयन करने के लिए पर्याप्त है, यह एक सत्र के लिए बाध्य हो जाता है और प्रदाताओं के बीच संगत नहीं होता है। कुछ मामलों में क्लाइंट को सत्रों और उपकरणों के बीच इसे बनाए रखने के लिए एक पूर्ण सूचक (जैसे पूर्ण आवृत्ति) की आवश्यकता हो सकती है।

    डिजिटल रेडियो प्रसारण के युग में, एक विशिष्ट स्टेशन को ट्यून करने के लिए एक नंगे आवृत्ति पर्याप्त नहीं है। इसलिए, एनालॉग या डिजिटल चैनल को ट्यून करने के लिए ProgramSelector का उपयोग करें। ProgramSelector में दो भाग होते हैं:

    • प्राथमिक पहचानकर्ता। किसी दिए गए रेडियो स्टेशन के लिए एक अद्वितीय और स्थिर पहचानकर्ता जो बदलता नहीं है लेकिन उस स्टेशन को ट्यून करने के लिए पर्याप्त नहीं हो सकता है। उदाहरण के लिए, आरडीएस पीआई कोड, जिसे यूएस में कॉल साइन में अनुवादित किया जा सकता है।
    • माध्यमिक पहचानकर्ता। उस स्टेशन पर ट्यूनिंग के लिए उपयोगी अतिरिक्त पहचानकर्ता (उदाहरण के लिए, आवृत्ति), संभवतः अन्य रेडियो प्रौद्योगिकियों के पहचानकर्ताओं सहित। उदाहरण के लिए, एक डीएबी स्टेशन में एनालॉग ब्रॉडकास्टिंग फॉलबैक हो सकता है।

    MediaBrowser - या ProgramSelector MediaSession समाधान में फ़िट होने के लिए ProgramSelector को सक्षम करने के लिए, इसे क्रमबद्ध करने के लिए एक URI स्कीमा परिभाषित करें। स्कीमा को निम्नानुसार परिभाषित किया गया है:

    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 का प्राधिकरण हिस्सा (उर्फ होस्ट) भविष्य में योजना के विस्तार के लिए कुछ जगह प्रदान करता है। आइडेंटिफ़ायर टाइप स्ट्रिंग्स को एचएएल 2.x डेफिनिशन ऑफ़ IdentifierType टाइप में उनके नाम के रूप में सटीक रूप से निर्दिष्ट किया गया है और मान प्रारूप एक दशमलव या हेक्साडेसिमल ( 0x उपसर्ग के साथ) संख्या है।

    सभी विक्रेता-विशिष्ट पहचानकर्ताओं को VENDOR_ उपसर्ग द्वारा दर्शाया जाता है। उदाहरण के लिए, VENDOR_0 के लिए VENDOR_START और VENDOR_1 प्लस 1 के लिए VENDOR_START । ऐसे यूआरआई रेडियो हार्डवेयर के लिए विशिष्ट हैं, जिस पर वे उत्पन्न हुए थे और विभिन्न ओईएम द्वारा बनाए गए उपकरणों के बीच स्थानांतरित नहीं किए जा सकते।

    इन URI को प्रत्येक MediaItem को शीर्ष-स्तरीय रेडियो फ़ोल्डर के अंतर्गत निर्दिष्ट किया जाना चाहिए। इसके अलावा, MediaSession को playFromMediaId और playFromUri दोनों का समर्थन करना चाहिए। हालाँकि, URI मुख्य रूप से रेडियो मेटाडेटा निष्कर्षण (जैसे FM आवृत्ति) और लगातार भंडारण के लिए अभिप्रेत है। इस बात की कोई गारंटी नहीं है कि यूआरआई सभी मीडिया आइटम्स के लिए उपलब्ध होगा (उदाहरण के लिए, जब प्राथमिक आईडी प्रकार अभी तक फ्रेमवर्क द्वारा समर्थित नहीं है)। दूसरी ओर, मीडिया आईडी हमेशा काम करती है। यह अनुशंसा नहीं की जाती है कि क्लाइंट वर्तमान MediaBrowser सत्र से आइटम चुनने के लिए URI का उपयोग करें। इसके बजाय, playFromMediaId का उपयोग करें। उस ने कहा, यह सेवा देने वाले ऐप के लिए वैकल्पिक नहीं है और लापता यूआरआई अच्छी तरह से न्यायोचित मामलों के लिए आरक्षित हैं।

    योजना के भाग के बाद प्रारंभिक डिजाइन में :// अनुक्रम के बजाय एक एकल कोलन का उपयोग किया गया था। हालांकि, पूर्ण श्रेणीबद्ध URI संदर्भों के लिए पूर्व android.net.Uri द्वारा समर्थित नहीं है।

    अन्य स्रोत प्रकार

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

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

    सुनने वाली सी डी

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

    ऑडियो सीडी ट्री संरचना
    चित्र 3. ऑडियो सीडी ट्री संरचना

    इन प्रविष्टियों को उसी तरह चिह्नित किया जाएगा जिस तरह से प्रसारण रेडियो फ़ोल्डर हैं; उनमें MediaDescription API में परिभाषित अतिरिक्त अतिरिक्त फ़ील्ड शामिल होंगे:

    • EXTRA_CD_TRACK : ऑडियो सीडी पर प्रत्येक MediaItem के लिए, 1-आधारित ट्रैक नंबर।
    • EXTRA_CD_DISK : 1-आधारित डिस्क संख्या।

    सीडी-टेक्स्ट सक्षम सिस्टम और संगत डिस्क के लिए, शीर्ष-स्तर MediaItem में डिस्क का शीर्षक होगा। इसी तरह, ट्रैक के लिए MediaItems में ट्रैक का शीर्षक होगा।

    सहायक इनपुट

    ऐप जो सहायक इनपुट प्रदान करता है, पोर्ट में AUX का प्रतिनिधित्व करने वाली एकल प्रविष्टि (या अधिक, जब कई पोर्ट मौजूद होते हैं) के साथ MediaBrowser ट्री को उजागर करता है। संबंधित MediaSession अपना MediaId लेता है और playFromMediaId अनुरोध प्राप्त करने के बाद उस स्रोत पर स्विच करता है।

    औक्स वृक्ष संरचना
    चित्र 4. औक्स वृक्ष संरचना

    प्रत्येक AUX MediaItem प्रविष्टि में एक अतिरिक्त फ़ील्ड EXTRA_AUX_PORT_NAME होगी जो "AUX" वाक्यांश के बिना पोर्ट के गैर-स्थानीयकृत नाम पर सेट होगी। For example, "AUX 1" would have be set to "1", "AUX front" to "front" and "AUX" to an empty string. In non-English locales, the name tag would remain the same English string. Unlikely as for EXTRA_BCRADIO_BAND_NAME_EN , the values are OEM-defined and not constrained to a predefined list.

    If the hardware can detect devices connected to the AUX port, the hardware should mark the MediaItem as PLAYABLE , only if input is connected. The hardware should still be enumerated (but not PLAYABLE ) if nothing was connected to this port. If the hardware has no such capability, the MediaItem must always be set to PLAYABLE .

    Extra fields

    Define the following fields:

    • 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"

    Client needs to review the top-level MediaItems for elements having the EXTRA_CD_DISK or EXTRA_AUX_PORT_NAME extra field set.

    Detailed examples

    The following examples address the MediaBrowser tree structure for source types that are part of this design.

    Broadcast radio MediaBrowserService (handles ACTION_PLAY_BROADCASTRADIO ):

    • Stations (browsable) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • BBC One (playable) URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (playable) URI: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (playable) URI: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (playable) URI: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (playable) – FM without RDSURI: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 AM (playable) URI: broadcastradio://program/AMFM_FREQUENCY/620
      • BBC One (playable) URI: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • Favorites (browsable, playable) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • BBC One (playable) URI: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • BBC Two (not playable)URI: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (browsable, playable): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (playable) URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (playable) URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 AM (playable) URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (browsable, playable): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 FM (playable) URI: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 FM (playable) URI: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 FM (playable) URI: broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (playable): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    Audio CD MediaBrowserService (handles ACTION_PLAY_AUDIOCD ):

    • Disc 1 (playable) EXTRA_CD_DISK=1
    • Disc 2 (browsable, playable) EXTRA_CD_DISK=2
      • Track 1 (playable) EXTRA_CD_TRACK=1
      • Track 2 (playable) EXTRA_CD_TRACK=2
    • My music CD (browsable, playable) EXTRA_CD_DISK=3
      • All By Myself (playable) EXTRA_CD_TRACK=1
      • Reise, Reise (playable) EXTRA_CD_TRACK=2
    • Empty slot 4 (not playable) EXTRA_CD_DISK=4

    AUX MediaBrowserService (handles ACTION_PLAY_AUX ):

    • AUX front (playable) EXTRA_AUX_PORT_NAME="front"
    • AUX rear (playable) EXTRA_AUX_PORT_NAME="rear"