आईएमएस का कार्यान्वयन

एंड्रॉइड 9 आईपी मल्टीमीडिया सबसिस्टम (आईएमएस) को लागू करने में आपकी सहायता के लिए ImsService नामक एक नया SystemApi इंटरफ़ेस पेश करता है। ImsService API एंड्रॉइड प्लेटफ़ॉर्म और विक्रेता या वाहक द्वारा प्रदत्त IMS कार्यान्वयन के बीच एक अच्छी तरह से परिभाषित इंटरफ़ेस है।

आईएमएससर्विस सिंहावलोकन

चित्र 1. आईएमएससर्विस सिंहावलोकन

ImsService इंटरफ़ेस का उपयोग करके, IMS कार्यान्वयनकर्ता प्लेटफ़ॉर्म पर महत्वपूर्ण सिग्नलिंग जानकारी प्रदान कर सकता है, जैसे IMS पंजीकरण जानकारी, IMS एकीकरण पर एसएमएस, और आवाज और वीडियो कॉलिंग प्रदान करने के लिए MmTel सुविधा एकीकरण। ImsService API एक Android सिस्टम API भी है, जिसका अर्थ है कि इसे स्रोत के बजाय सीधे Android SDK के विरुद्ध बनाया जा सकता है। डिवाइस पर पहले से इंस्टॉल किए गए एक आईएमएस एप्लिकेशन को प्ले स्टोर अपडेट करने योग्य होने के लिए भी कॉन्फ़िगर किया जा सकता है।

उदाहरण और स्रोत

एंड्रॉइड AOSP पर एक एप्लिकेशन प्रदान करता है जो परीक्षण और विकास उद्देश्यों के लिए ImsService API के कुछ हिस्सों को लागू करता है। आप एप्लिकेशन को /testapps/ImsTestService पर पा सकते हैं।

आप ImsService API के लिए दस्तावेज़ ImsService में और API में अन्य कक्षाओं में पा सकते हैं।

कार्यान्वयन

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

पुराने आईएमएस कार्यान्वयन के साथ संगतता

हालाँकि Android 9 में ImsService API शामिल है, IMS के लिए पुराने कार्यान्वयन का उपयोग करने वाले डिवाइस API का समर्थन करने में सक्षम नहीं हैं। इन उपकरणों के लिए, पुराने एआईडीएल इंटरफेस और रैपर क्लास को android.telephony.ims.compat नेमस्पेस में स्थानांतरित कर दिया गया है। एंड्रॉइड 9 में अपग्रेड करते समय, पुराने उपकरणों को पुराने एपीआई का समर्थन जारी रखने के लिए निम्नलिखित कार्य करना होगा।

  • ImsService कार्यान्वयन के नामस्थान को android.telephony.ims.compat नामस्थान API से विस्तारित करने के लिए बदलें।
  • android.telephony.ims.ImsService क्रिया के बजाय android.telephony.ims.compat.ImsService इंटेंट-फ़िल्टर क्रिया का उपयोग करने के लिए AndroidManifest.xml में ImsService सेवा परिभाषा को संशोधित करें।

इसके बाद फ्रेमवर्क पुराने ImsService कार्यान्वयन के साथ काम करने के लिए Android 9 में प्रदान की गई संगतता परत का उपयोग करके ImsService से जुड़ जाएगा।

फ्रेमवर्क के साथ ImsService पंजीकरण

ImsService API को एक सेवा के रूप में कार्यान्वित किया जाता है, जिसे IMS कार्यान्वयन के साथ संचार करने के लिए Android फ़्रेमवर्क बाध्य करता है। फ्रेमवर्क के साथ ImsService लागू करने वाले एप्लिकेशन को पंजीकृत करने के लिए तीन चरण आवश्यक हैं। सबसे पहले, ImsService कार्यान्वयन को एप्लिकेशन के AndroidManifest.xml का उपयोग करके प्लेटफ़ॉर्म के साथ स्वयं को पंजीकृत करना होगा; दूसरा, इसे परिभाषित करना होगा कि कौन सा आईएमएस कार्यान्वयन समर्थन (एमएमटेल या आरसीएस) की सुविधा देता है; और तीसरा, इसे वाहक कॉन्फ़िगरेशन या डिवाइस ओवरले में विश्वसनीय आईएमएस कार्यान्वयन के रूप में सत्यापित किया जाना चाहिए।

सेवा परिभाषा

IMS एप्लिकेशन निम्नलिखित प्रारूप का उपयोग करके मैनिफ़ेस्ट में एक service प्रविष्टि जोड़कर फ्रेमवर्क के साथ एक ImsService पंजीकृत करता है:

<service
    android:name="com.egcorp.ims.EgImsService"
    android:directBootAware="true"
    Android:persistent="true"
    ...
    android:permission="android.permission.BIND_IMS_SERVICE" >
    ...
    <intent-filter>
        <action android:name="android.telephony.ims.ImsService" />
    </intent-filter>
</service>

AndroidManifest.xml में service परिभाषा निम्नलिखित विशेषताओं को परिभाषित करती है, जो सही संचालन के लिए आवश्यक हैं:

  • directBootAware="true" : उपयोगकर्ता द्वारा डिवाइस को अनलॉक करने से पहले सेवा को telephony द्वारा खोजने और चलाने की अनुमति देता है। उपयोगकर्ता द्वारा डिवाइस को अनलॉक करने से पहले सेवा डिवाइस एन्क्रिप्टेड स्टोरेज तक नहीं पहुंच सकती है। अधिक जानकारी के लिए, डायरेक्ट बूट मोड और फ़ाइल-आधारित एन्क्रिप्शन का समर्थन देखें।
  • persistent="true" : इस सेवा को लगातार चलाने की अनुमति देता है और मेमोरी को पुनः प्राप्त करने के लिए सिस्टम द्वारा इसे खत्म नहीं किया जाता है। यह विशेषता केवल तभी काम करती है जब एप्लिकेशन को सिस्टम एप्लिकेशन के रूप में बनाया गया हो।
  • permission="android.permission.BIND_IMS_SERVICE" : यह सुनिश्चित करता है कि केवल एक प्रक्रिया जिसे BIND_IMS_SERVICE अनुमति दी गई है, वह एप्लिकेशन से जुड़ सकती है। यह किसी दुष्ट ऐप को सेवा से जुड़ने से रोकता है, क्योंकि केवल सिस्टम एप्लिकेशन को ही फ्रेमवर्क द्वारा अनुमति दी जा सकती है।

सेवा को android.telephony.ims.ImsService क्रिया के साथ intent-filter तत्व भी निर्दिष्ट करना होगा। यह फ्रेमवर्क को ImsService खोजने की अनुमति देता है।

आईएमएस सुविधा विशिष्टता

AndroidManifest.xml में ImsService को Android सेवा के रूप में परिभाषित किए जाने के बाद, ImsService को यह परिभाषित करना होगा कि वह किन IMS सुविधाओं का समर्थन करता है। एंड्रॉइड वर्तमान में एमएमटेल और आरसीएस सुविधाओं का समर्थन करता है, हालांकि केवल एमएमटेल को ढांचे में एकीकृत किया गया है। हालाँकि फ्रेमवर्क में कोई RCS API एकीकृत नहीं है, फिर भी इसे ImsService की एक विशेषता के रूप में घोषित करने के फायदे हैं।

नीचे android.telephony.ims.ImsFeature में परिभाषित वैध विशेषताएं दी गई हैं जो एक ImsService प्रदान कर सकती है और एक स्पष्टीकरण और उदाहरण है कि एक IMS एप्लिकेशन इनमें से एक या सभी सुविधाओं को क्यों लागू करना चाहेगा। प्रत्येक सुविधा को परिभाषित करने के बाद, यह पृष्ठ रेखांकित करता है कि ImsService प्रत्येक सिम स्लॉट के लिए परिभाषित सुविधाओं के सेट की घोषणा कैसे करता है।

फ़ीचर_एमएमटीईएल

ImsService IMS MMTEL सुविधा को लागू करता है, जिसमें आपातकालीन कॉलिंग के लिए IMS PDN को छोड़कर सभी IMS मीडिया (IR.92 और IR.94 विनिर्देशों) के लिए समर्थन शामिल है। ImsService का कोई भी कार्यान्वयन जो MMTEL सुविधाओं का समर्थन करना चाहता है, उसे android.telephony.ims.MmTelFeature बेस क्लास का विस्तार करना चाहिए और ImsService#createMmTelFeature में एक कस्टम MmTelFeature कार्यान्वयन वापस करना चाहिए।

फ़ीचर_इमरजेंसी_एमएमटीईएल

इस सुविधा की घोषणा करने से प्लेटफ़ॉर्म को केवल यह संकेत मिलता है कि आपातकालीन सेवाओं के लिए आईएमएस पीडीएन से आपातकालीन जुड़ाव संभव है। यदि यह सुविधा आपके ImsService के लिए घोषित नहीं की गई है, तो आपातकालीन सेवाओं के लिए प्लेटफ़ॉर्म हमेशा सर्किट स्विच फ़ॉलबैक पर डिफ़ॉल्ट रहेगा। इस सुविधा को परिभाषित करने के लिए FEATURE_MMTEL सुविधा को परिभाषित किया जाना चाहिए।

फ़ीचर_आरसीएस

ImsService API किसी भी IMS RCS सुविधाओं को लागू नहीं करता है, लेकिन android.telephony.ims.RcsFeature बेस क्लास अभी भी उपयोगी हो सकता है। फ्रेमवर्क स्वचालित रूप से ImsService से जुड़ जाता है और जब यह पता लगाता है कि पैकेज को RCS प्रदान करना चाहिए तो ImsService#createRcsFeature कॉल करता है। यदि आरसीएस सेवा से जुड़ा सिम कार्ड हटा दिया जाता है, तो फ्रेमवर्क स्वचालित रूप से RcsFeature#onFeatureRemoved कॉल करता है और फिर RCS सुविधा से जुड़े ImsService साफ़ करता है। यह कार्यक्षमता कुछ कस्टम डिटेक्शन/बाइंडिंग लॉजिक को हटा सकती है जो एक आरसीएस सुविधा को अन्यथा प्रदान करना होगा।

समर्थित सुविधाओं का पंजीकरण

टेलीफ़ोनी फ़्रेमवर्क सबसे पहले ImsService से जुड़कर उन सुविधाओं को क्वेरी करता है जिनका वह ImsService#querySupportedImsFeatures API का उपयोग करके समर्थन करता है। फ़्रेमवर्क यह गणना करने के बाद कि ImsService किन सुविधाओं का समर्थन करेगा, यह प्रत्येक सुविधा के लिए ImsService#create[...]Feature कॉल करेगा जिसके लिए ImsService जिम्मेदार होगा। यदि IMS एप्लिकेशन जिन सुविधाओं का समर्थन करता है उनमें परिवर्तन होता है, तो आप समर्थित सुविधाओं की पुनर्गणना करने के लिए फ्रेमवर्क को संकेत देने के लिए ImsService#onUpdateSupportedImsFeatures उपयोग कर सकते हैं। ImsService के आरंभीकरण और बाइंडिंग के बारे में अधिक जानकारी के लिए नीचे दिया गया चित्र देखें।

ImsService प्रारंभ और बाइंडिंग

चित्र 2: ImsService आरंभीकरण और बाइंडिंग

ImsService कार्यान्वयन की रूपरेखा का पता लगाना और सत्यापन करना

एक बार जब ImsService को AndroidManifest.xml में सही ढंग से परिभाषित किया गया है, तो उपयुक्त होने पर प्लेटफ़ॉर्म को ImsService से (सुरक्षित रूप से) बाइंड करने के लिए कॉन्फ़िगर किया जाना चाहिए। दो प्रकार की ImsServices हैं जिनसे फ्रेमवर्क जुड़ता है:

  1. कैरियर ImsService को "ओवरराइड" करता है: ये ImsServices डिवाइस पर पहले से लोड होती हैं लेकिन एक या अधिक सेल्युलर कैरियर से जुड़ी होती हैं और केवल तभी बाध्य होंगी जब एक मिलान सिम कार्ड डाला जाएगा। का उपयोग करके इसे कॉन्फ़िगर किया गया है
  2. डिवाइस "डिफ़ॉल्ट" ImsService: यह डिफ़ॉल्ट ImsService है जिसे OEM द्वारा डिवाइस पर लोड किया जाता है और इसे सभी स्थितियों में IMS सेवाएं प्रदान करने के लिए डिज़ाइन किया जाना चाहिए जब एक वाहक ImsService उपलब्ध नहीं है और उन स्थितियों में उपयोगी है जहां डिवाइस में कोई सिम कार्ड नहीं है डाला गया है या डाले गए सिम कार्ड के साथ कोई वाहक ImsService स्थापित नहीं है। इसे निम्नलिखित कॉन्फ़िगरेशन का उपयोग करके डिवाइस ओवरले में परिभाषित किया गया है:

एंड्रॉइड तृतीय-पक्ष डाउनलोड करने योग्य ImsService कार्यान्वयन वाले ऐप्स का समर्थन नहीं करता है, इसलिए यहां परिभाषित किसी भी ImsService कार्यान्वयन को सिस्टम एप्लिकेशन होना आवश्यक है और उचित अनुदान देने के लिए उसे /system/priv-app/ या /product/priv-app/ फ़ोल्डर में रहना होगा। अनुमतियाँ (अर्थात् फ़ोन, माइक्रोफ़ोन, स्थान, कैमरा और संपर्क अनुमतियाँ)। यह सत्यापित करके कि क्या आईएमएस कार्यान्वयन का पैकेज नाम कैरियर कॉन्फिग या ऊपर परिभाषित डिवाइस ओवरले मानों से मेल खाता है, केवल विश्वसनीय, पूर्व-स्थापित एप्लिकेशन ही बाध्य हैं।

अनुकूलन

ImsService को कार्यान्वित करने वाले एप्लिकेशन केवल उन डिवाइसों पर बाध्य होते हैं जहां उन्हें MMTEL या RCS कार्यक्षमता के लिए वाहक "ओवरराइड" ImsService या डिवाइस "डिफ़ॉल्ट" ImsService कॉन्फ़िगरेशन के रूप में कॉन्फ़िगर किया गया है। ImsService उन IMS सुविधाओं को भी अनुमति देता है जिनका वह समर्थन करता है (MMTEL और RCS) जिन्हें ImsService#onUpdateSupportedImsFeatures विधि का उपयोग करके अपडेट के माध्यम से गतिशील रूप से सक्षम या अक्षम किया जा सकता है। यह ढांचे को पुनर्गणना करने के लिए ट्रिगर करता है कि कौन सी ImsServices बाध्य हैं और वे किन सुविधाओं का समर्थन करते हैं। यदि आईएमएस एप्लिकेशन समर्थित सुविधाओं के बिना फ्रेमवर्क को अपडेट करता है, तो आईएमएस सर्विस तब तक अनबाउंड रहेगी जब तक कि फोन रीबूट न ​​हो जाए या आईएमएस एप्लिकेशन से मेल खाने वाला नया सिम कार्ड न डाला जाए।

एकाधिक ImsService के लिए बाध्यकारी प्राथमिकता

फ़्रेमवर्क डिवाइस पर पहले से लोड की गई सभी संभावित ImsServices को बाइंडिंग का समर्थन नहीं कर सकता है और प्रति-फ़ीचर के आधार पर निम्नलिखित क्रम में प्रति सिम स्लॉट (प्रत्येक सुविधा के लिए एक ImsService) तक दो ImsServices से बाइंड होगा:

  1. जब सिम कार्ड डाला जाता है तो ImsService पैकेज का नाम CarrierConfig मान config_ims_[mmtel/rcs]_package_override_string द्वारा परिभाषित होता है।
  2. ImsService पैकेज का नाम config_ims_[mmtel/rcs]_package के लिए डिवाइस ओवरले मान में परिभाषित किया गया है, जिसमें वह मामला भी शामिल है जहां कोई सिम कार्ड नहीं डाला गया है। इस ImsService को आपातकालीन MmTel सुविधा का समर्थन करना चाहिए।

आपके पास या तो आपके ImsService का पैकेज नाम प्रत्येक वाहक के लिए CarrierConfig में परिभाषित होना चाहिए जो उस पैकेज का उपयोग करेगा या डिवाइस ओवरले में यदि आपका ImsService डिफ़ॉल्ट होगा, जैसा कि ऊपर परिभाषित किया गया है।

आइए प्रत्येक सुविधा के लिए इसे तोड़ें। एकल सिम कार्ड वाले डिवाइस (एकल या मल्टी-सिम) के लिए, दो IMS सुविधाएँ संभव हैं: MMTel और RCS। फ़्रेमवर्क प्रत्येक सुविधा के लिए ऊपर परिभाषित क्रम में बाइंड करने का प्रयास करेगा और यदि कैरियर कॉन्फ़िगरेशन ओवरराइड में परिभाषित ImsService के लिए सुविधा उपलब्ध नहीं है, तो फ़्रेमवर्क आपके डिफ़ॉल्ट ImsService पर वापस आ जाएगा। इसलिए, उदाहरण के लिए, नीचे दी गई तालिका बताती है कि फ्रेमवर्क किस आईएमएस सुविधा का उपयोग निम्नलिखित सुविधाओं के साथ सिस्टम पर स्थापित आईएमएससर्विसेज को लागू करने वाले तीन आईएमएस अनुप्रयोगों का उपयोग करेगा:

  • कैरियर ए आईएमएससर्विस आरसीएस का समर्थन करता है
  • कैरियर बी आईएमएससर्विस आरसीएस और एमएमटेल का समर्थन करता है
  • OEM ImsService RCS और MMTel का समर्थन करता है
सिम कार्ड डाला गया आरसीएस फ़ीचर एमएमटेल फ़ीचर
वाहक ए वाहक ए OEM
वाहक बी वाहक बी वाहक बी
कोई सिम नहीं OEM OEM

मान्यकरण

आईएमएस कार्यान्वयन को सत्यापित करने के लिए उपकरण स्वयं शामिल नहीं हैं क्योंकि आईएमएस विनिर्देश बहुत बड़े हैं और विशेष सत्यापन उपकरण का उपयोग करते हैं। परीक्षण केवल यह सत्यापित कर सकते हैं कि टेलीफोनी ढांचा ImsService API पर ठीक से प्रतिक्रिया करता है।

एक आईएमएस ऐप विकसित करें

एक आईएमएस ऐप विकसित करते समय जो एंड्रॉइड टेलीफोनी स्टैक के साथ इंटरफेस करता है, हम यह निर्दिष्ट करने की सलाह देते हैं कि ऐप एक विशिष्ट वाहक सदस्यता के लिए संलग्न ImsService उदाहरण की स्थिति को सुन या संशोधित कर सकता है।

MMTEL और RCS सुविधाओं के लिए ImsService की स्थिति को सुनने या संशोधित करने के लिए, ImsMmTelManager , ImsRcsManager , या IMS-विशिष्ट ProvisioningManager वर्ग का उदाहरण प्राप्त करने के लिए ImsManager वर्ग का उपयोग करें। इसके बाद ऐप आईएमएस-विशिष्ट सेवा और प्रावधान स्थितियों को सुन सकता है जैसे:

  • एमएमटीईएल या आरसीएस सुविधाएं जो सक्षम और उपलब्ध हैं
  • आईएमएस पंजीकरण स्थिति बदलने पर अपडेट होता है
  • आईएमएस सुविधाओं की प्रावधान स्थिति
  • उपयोगकर्ता द्वारा सक्षम की गई IMS सुविधाएँ

ImsStateCallback का उपयोग करें

हालाँकि ImsService एक लगातार बाध्य सेवा है, लेकिन जब एक नया सिम कार्ड या एम्बेडेड सदस्यता सक्रिय हो जाती है या जब एक वाहक कॉन्फ़िगरेशन बदलता है तो बाध्य सेवा बदल सकती है। क्योंकि ImsService टेलीफोनी प्रक्रिया का हिस्सा नहीं है, यदि ImsService सदस्यता या कॉन्फ़िगरेशन परिवर्तन के कारण अदृश्य रूप से क्रैश हो जाता है या अनबाउंड हो जाता है, तो IMS API तक पहुंचने का प्रयास करते समय एक ऐप को अप्रत्याशित अपवादों का अनुभव हो सकता है।

एंड्रॉइड 13 या उच्चतर चलाने वाले उपकरणों पर, यह निगरानी करने के लिए कि संबंधित सदस्यता के लिए ImsService उदाहरण उपलब्ध है या अनुपलब्ध है, एक ऐप ImsStateCallback क्लास का उपयोग कर सकता है। ImsMmTelManager या ImsRcsManager का उदाहरण प्राप्त करते समय, हम अनुशंसा करते हैं कि ऐप पहले ImsMmTelManager#registerImsStateCallback या ImsRcsManager#registerImsStateCallback का उपयोग करके IMS राज्य कॉलबैक के लिए पंजीकृत हो। ImsService फिर से उपलब्ध होने पर विशिष्ट सदस्यता के लिए कॉलबैक अपडेट प्राप्त करना जारी रखने के लिए, ऐप को ImsMmTelManager , ImsRcsManager , या ProvisioningManager के माध्यम से पंजीकृत मौजूदा कॉलबैक को अपंजीकृत या त्यागना होगा; और नए कॉलबैक पंजीकृत करें।

यदि कोई सदस्यता है जो आईएमएस का समर्थन नहीं करती है, तो फ्रेमवर्क REASON_NO_IMS_SERVICE_CONFIGURED कारण के साथ ImsStateCallback#onUnavailable को कॉल करता है। इसका मतलब यह है कि ImsService और IMS-संबंधित API सदस्यता के लिए उपलब्ध नहीं हैं।

टेलीफोनी प्रक्रिया क्रैश होने की अप्रत्याशित स्थिति में, ऐप को ImsStateCallback#onError प्राप्त होता है और अब पंजीकृत ImsStateCallback इंस्टेंस पर अपडेट प्राप्त नहीं होता है। इस स्थिति से उबरने के लिए, ImsMmTelManager#registerImsStateCallback या ImsRcsManager#registerImsStateCallback पर कॉल करके संबंधित सदस्यता के लिए ImsStateCallback इंस्टेंस को फिर से पंजीकृत करें।