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

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

तंत्र के अंश

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

प्रसारण रेडियो वास्तुकला
चित्र 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 ) ब्रॉडकास्ट रेडियो HAL के लिए क्लाइंट सेवा है। ब्रॉडकास्ट रेडियो सेवा ब्रॉडकास्ट रेडियो एचएएल के साथ कई रेडियो प्रबंधकों का समन्वय करती है। ब्रॉडकास्ट रेडियो सेवा एचएएल इंटरफ़ेस डेफिनिशन लैंग्वेज (एचआईडीएल) और एंड्रॉइड इंटरफ़ेस डेफिनिशन लैंग्वेज (एआईडीएल) प्रसारण रेडियो एचएएल का समर्थन करती है। जब कोई AIDL HAL सेवा मौजूद होती है तो प्रसारण रेडियो सेवा AIDL HAL से जुड़ जाती है; अन्यथा, सेवा HIDL HAL से लिंक होती है। ब्रॉडकास्ट रेडियो सेवा प्रत्येक उपलब्ध एचएएल उदाहरण (जैसे एएम, एफएम और डीएबी) के लिए एक रेडियो मॉड्यूल बनाती है।

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

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

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

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

निम्नलिखित अनुभाग वर्णन करते हैं कि प्रसारण रेडियो को लागू करने के लिए हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) के साथ कैसे काम किया जाए।

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

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

एचआईडीएल 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 एचएएल क्लाइंट सेवा को अपडेट भेजने के लिए प्रसारण रेडियो एचएएल द्वारा कॉलबैक इंटरफ़ेस है।

आईट्यूनरकॉलबैक
विवरण: एचएएल द्वारा तब कॉल किया जाता है जब ट्यूनिंग ऑपरेशन (ट्यून, सीक (एआईडीएल में) या स्कैन (एचआईडीएल में) और चरण सफल होता है) अतुल्यकालिक रूप से विफल हो जाता है।
एचआईडीएल 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)
विवरण: एआईडीएल में नया। जब कॉन्फ़िगरेशन फ़्लैग को HAL में आंतरिक रूप से अपडेट किया जाता है तो कॉल किया जाता है (HAL क्लाइंट द्वारा setConfigFlag कॉल करने के बाद इसे लागू नहीं किया जाना चाहिए)।
एचआईडीएल 2.0 लागू नहीं।
एआईडीएल void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

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

IBroadcastRadio प्रसारण रेडियो HAL के लिए प्राथमिक इंटरफ़ेस है। HIDL 2.0 HAL में, कॉल ऑपरेशन के लिए ट्यूनर में ITunerSession इंटरफ़ेस का उपयोग करें। हालाँकि, एक समय में अधिकतम एक ट्यूनर सक्रिय होता है (बशर्ते प्रत्येक प्रसारण रेडियो एचएएल इंस्टेंस में केवल एक ट्यूनर चिप हो)। ITunerSession AIDL इंटरफेस से हटा दिया गया और इसके इंटरफेस को 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)
विवरण:
  • HIDL HAL: जब एक नया ट्यूनर सत्र खोला जाता है, तो पुराने सत्र को समाप्त करना होगा।
  • एआईडीएल एचएएल: चूंकि कोई ट्यूनर सत्र उपलब्ध नहीं है, केवल ट्यूनर कॉलबैक सेट करने की आवश्यकता है। यदि यह मौजूद है, तो पुराना कॉलबैक अनसेट होना चाहिए।
एचआईडीएल 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)
विवरण: ऑन एयर अगले वैध कार्यक्रम की तलाश है। एआईडीएल में भ्रम से बचने के लिए 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 (HIDL में) या status (AIDL में) लौटाएं। यदि Result या status OK है, तो ट्यूनिंग कार्य विफल होने पर (उदाहरण के लिए, टाइमआउट के कारण) या पूरा होने पर ट्यूनर कॉलबैक tuneFailed या currentProgramInfoChanged को कॉल किया जाना चाहिए।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

रेडियो और मीडिया में प्रदर्शित अन्य ऐप्स के बीच एक निर्बाध संक्रमण प्रदान करने के लिए, कार-मीडिया-कॉमन लाइब्रेरी में कक्षाएं शामिल हैं जिन्हें रेडियो ऐप में एकीकृत किया जाना चाहिए। 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 लॉन्च करता है, जो उन मीडिया स्रोतों की एक सूची प्रदर्शित करता है जिन पर स्विच किया जा सकता है। यदि प्रदान किए गए के अलावा कोई यूआई वांछित है, तो आप स्विचर प्रदर्शित होने पर 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 वृक्ष संरचना
चित्र 2. MediaBrowserService वृक्ष संरचना

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

मीडियासत्र

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

शीर्ष-स्तरीय फ़ोल्डरों की पहचान करने के लिए, ब्लूटूथ द्वारा प्रयुक्त समान तंत्र लागू किया जाता है। यानी, 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 फ़ोल्डर में है)।
    • रेडियो-विशिष्ट पहचानकर्ता (आरडीएस पीआई, डीएबी एसआईडी)। MediaDescription.getMediaUri को प्रोग्राम चयनकर्ता में पार्स किया गया।

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

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

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

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

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

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

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

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

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

    या

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

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

    खोज और सेवा कनेक्शन

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

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

    चयनित MediaBrowserService से कनेक्ट करने के लिए, किसी दिए गए सेवा घटक के लिए MediaBrowser इंस्टेंस बनाएं और connect । कनेक्शन स्थापित करने के बाद, 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

    यदि बैंड इस सूची में नहीं है, तो बैंड नाम टैग सेट नहीं किया जाना चाहिए। हालाँकि, यदि बैंड सूची में है, तो उसके पास एक टैग सेट होना चाहिए। एचडी रेडियो अलग-अलग बैंडों की गणना नहीं करता है क्योंकि यह AM/FM के समान अंतर्निहित माध्यम का उपयोग करता है।

    सामान्य खेल के इरादे

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

    • 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 में दो भाग होते हैं:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    सहायक इनपुट

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

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

    प्रत्येक AUX MediaItem प्रविष्टि में "AUX" वाक्यांश के बिना पोर्ट के गैर-स्थानीयकृत नाम पर एक अतिरिक्त फ़ील्ड EXTRA_AUX_PORT_NAME सेट होगा। उदाहरण के लिए, "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"

    क्लाइंट को EXTRA_CD_DISK या EXTRA_AUX_PORT_NAME अतिरिक्त फ़ील्ड सेट वाले तत्वों के लिए शीर्ष-स्तरीय मीडियाआइटम की समीक्षा करने की आवश्यकता है।

    विस्तृत उदाहरण

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

    प्रसारण रेडियो MediaBrowserService ( ACTION_PLAY_BROADCASTRADIO संभालती है):

    • स्टेशन (ब्राउज़ करने योग्य) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • बीबीसी वन (बजाने योग्य) यूआरआई: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • एबीसी 88.1 (बजाने योग्य) यूआरआई: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • एबीसी 88.1 एचडी1 (बजाने योग्य) यूआरआई: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • एबीसी 88.1 एचडी2 (बजाने योग्य) यूआरआई: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 एफएम (बजाने योग्य) - आरडीएसयूआरआई के बिना एफएम: broadcastradio://program/AMFM_FREQUENCY/90500
      • सुबह 620 बजे (बजाने योग्य) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/620
      • बीबीसी वन (बजाने योग्य) यूआरआई: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • पसंदीदा (ब्राउज़ करने योग्य, खेलने योग्य) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • बीबीसी वन (बजाने योग्य) यूआरआई: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • बीबीसी टू (बजाने योग्य नहीं)यूआरआई: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • AM (ब्राउज़ करने योग्य, चलाने योग्य): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 पूर्वाह्न (बजाने योग्य) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 पूर्वाह्न (बजाने योग्य) यूआरआई: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 पूर्वाह्न (बजाने योग्य) यूआरआई: 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
    • डिस्क 2 (ब्राउज़ करने योग्य, चलाने योग्य) EXTRA_CD_DISK=2
      • ट्रैक 1 (बजाने योग्य) EXTRA_CD_TRACK=1
      • ट्रैक 2 (बजाने योग्य) EXTRA_CD_TRACK=2
    • मेरी संगीत सीडी (ब्राउज़ करने योग्य, बजाने योग्य) EXTRA_CD_DISK=3
      • ऑल बाय माईसेल्फ (बजाने योग्य) EXTRA_CD_TRACK=1
      • रीइज़, रीइज़ (बजाने योग्य) EXTRA_CD_TRACK=2
    • खाली स्लॉट 4 (खेलने योग्य नहीं) EXTRA_CD_DISK=4

    AUX MediaBrowserService ( ACTION_PLAY_AUX संभालती है):

    • AUX सामने (बजाने योग्य) EXTRA_AUX_PORT_NAME="front"
    • AUX रियर (बजाने योग्य) EXTRA_AUX_PORT_NAME="rear"