आईएमएस लागू करें

Android 9 में, ImsService नाम का एक SystemApi इंटरफ़ेस जोड़ा गया है. इससे आपको आईपी मल्टीमीडिया सबसिस्टम (आईएमएस) लागू करने में मदद मिलेगी. ImsService API, Android प्लैटफ़ॉर्म और वेंडर या कैरियर की ओर से उपलब्ध कराए गए IMS के बीच का एक बेहतर इंटरफ़ेस है.

ImsService के बारे में खास जानकारी

पहली इमेज. ImsService के बारे में खास जानकारी

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

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

Android, AOSP पर एक ऐप्लिकेशन उपलब्ध कराता है. यह ऐप्लिकेशन, टेस्टिंग और डेवलपमेंट के मकसद से, ImsService API के कुछ हिस्सों को लागू करता है. यह ऐप्लिकेशन, /testapps/ImsTestService पर उपलब्ध है.

ImsService API के दस्तावेज़, ImsService और एपीआई की अन्य क्लास में देखे जा सकते हैं.

लागू करना

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

पुराने IMS लागू करने के साथ काम करना

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

  • android.telephony.ims.compat नेमस्पेस एपीआई से एक्सटेंड करने के लिए, ImsService लागू करने के नेमस्पेस को बदलें.
  • android.telephony.ims.ImsService ऐक्शन के बजाय, android.telephony.ims.compat.ImsService इंटेंट-फ़िल्टर ऐक्शन का इस्तेमाल करने के लिए, AndroidManifest.xml में ImsService सेवा की परिभाषा में बदलाव करें.

इसके बाद, फ़्रेमवर्क, Android 9 में दी गई कंपैटिबिलिटी लेयर का इस्तेमाल करके, ImsService से बंध जाएगा, ताकि वह ImsService के लेगसी वर्शन के साथ काम कर सके.

फ़्रेमवर्क के साथ ImsService का रजिस्ट्रेशन

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

सेवा की परिभाषा

IMS ऐप्लिकेशन, फ़्रेमवर्क के साथ ImsService को रजिस्टर करता है. इसके लिए, वह मेनिफ़ेस्ट में इस फ़ॉर्मैट का इस्तेमाल करके service एंट्री जोड़ता है:

<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 अनुमति मिली है. इससे, किसी गलत ऐप्लिकेशन को सेवा से बंधने से रोका जा सकता है. ऐसा इसलिए, क्योंकि फ़्रेमवर्क से सिर्फ़ सिस्टम ऐप्लिकेशन को अनुमति दी जा सकती है.

सेवा को कार्रवाई के साथ intent-filter एलिमेंट की जानकारी भी देनी होगी android.telephony.ims.ImsService. इससे फ़्रेमवर्क को ImsService ढूंढने में मदद मिलती है.

आईएमएस की सुविधा के बारे में जानकारी

AndroidManifest.xml में ImsService को Android सेवा के तौर पर तय करने के बाद, ImsService को यह तय करना होगा कि वह IMS की किन सुविधाओं के साथ काम करती है. फ़िलहाल, Android पर MmTel और आरसीएस की सुविधाएं काम करती हैं. हालांकि, फ़्रेमवर्क में सिर्फ़ MmTel को इंटिग्रेट किया गया है. फ़्रेमवर्क में आरसीएस एपीआई इंटिग्रेट नहीं किए गए हैं. इसके बावजूद, इसे ImsService की सुविधा के तौर पर बताने के फ़ायदे हैं.

android.telephony.ims.ImsFeature में बताई गई मान्य सुविधाएं यहां दी गई हैं. ये सुविधाएं, ImsService उपलब्ध करा सकती है. साथ ही, यह भी बताया गया है कि IMS ऐप्लिकेशन में इनमें से एक या सभी सुविधाओं को लागू करने की ज़रूरत क्यों है. हर सुविधा के बारे में बताने के बाद, इस पेज पर बताया गया है कि ImsService, हर सिम स्लॉट के लिए सुविधाओं के सेट को कैसे तय करता है.

FEATURE_MMTEL

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

FEATURE_EMERGENCY_MMTEL

इस सुविधा का एलान करने से, प्लैटफ़ॉर्म को सिर्फ़ यह सिग्नल मिलता है कि आपातकालीन सेवाओं के लिए, IMS पीडीएन से आपातकालीन अटैचमेंट किया जा सकता है. अगर आपके ImsService के लिए यह सुविधा नहीं बताई गई है, तो आपके प्लैटफ़ॉर्म पर आपातकालीन सेवाओं के लिए, डिफ़ॉल्ट रूप से सर्किट स्विच फ़ॉलबैक का इस्तेमाल किया जाएगा. इस सुविधा को तय करने के लिए, FEATURE_MMTEL सुविधा तय होनी चाहिए.

FEATURE_RCS

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

इस्तेमाल की जा सकने वाली सुविधाओं का रजिस्ट्रेशन

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

ImsService को शुरू करना और बांधना

दूसरी इमेज. ImsService को शुरू करना और बांधना

फ़्रेमवर्क का पता लगाना और ImsService लागू करने की पुष्टि करना

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

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

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

पसंद के मुताबिक बनाएं

ImsService लागू करने वाले ऐप्लिकेशन सिर्फ़ उन डिवाइसों पर काम करते हैं जहां उन्हें MMTEL या आरसीएस की सुविधा के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के "ओवरराइड" ImsService या डिवाइस के "डिफ़ॉल्ट" ImsService कॉन्फ़िगरेशन के तौर पर कॉन्फ़िगर किया गया हो. ImsService की मदद से, ImsService#onUpdateSupportedImsFeatures तरीके का इस्तेमाल करके अपडेट की मदद से, IMS की उन सुविधाओं को डाइनैमिक तौर पर चालू या बंद किया जा सकता है जिन पर यह काम करता है. जैसे, MMTEL और आरसीएस. इससे फ़्रेमवर्क को फिर से यह हिसाब लगाने के लिए ट्रिगर किया जाता है कि कौनसी ImsServices बाउंड हैं और वे किन सुविधाओं के साथ काम करती हैं. अगर IMS ऐप्लिकेशन, फ़्रेमवर्क को बिना किसी सुविधा के अपडेट करता है, तो ImsService तब तक अनबाउंड रहेगी, जब तक फ़ोन को रीबूट नहीं किया जाता या IMS ऐप्लिकेशन से मैच करने वाला नया सिम कार्ड नहीं डाला जाता.

एक से ज़्यादा ImsService के लिए बाइंडिंग की प्राथमिकता

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

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

आपको अपनी ImsService के पैकेज का नाम, CarrierConfig में तय करना होगा. यह नाम, उस पैकेज का इस्तेमाल करने वाले हर कैरियर के लिए तय करना होगा. इसके अलावा, अगर आपकी ImsService डिफ़ॉल्ट है, तो नाम को डिवाइस ओवरले में तय करना होगा. इसके बारे में ऊपर बताया गया है.

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

  • मोबाइल और इंटरनेट सेवा देने वाली कंपनी A की ImsService, आरसीएस के साथ काम करती है
  • मोबाइल और इंटरनेट सेवा देने वाली कंपनी B की ImsService, आरसीएस और MMTel के साथ काम करती है
  • OEM ImsService, आरसीएस और MMTel के साथ काम करता है
सिम कार्ड डाला गया आरसीएस की सुविधा MMTel की सुविधा
मोबाइल और इंटरनेट सेवा देने वाली कंपनी A मोबाइल और इंटरनेट सेवा देने वाली कंपनी A OEM
मोबाइल और इंटरनेट सेवा देने वाली कंपनी B मोबाइल और इंटरनेट सेवा देने वाली कंपनी B मोबाइल और इंटरनेट सेवा देने वाली कंपनी B
कोई सिम कार्ड नहीं लगाया गया है OEM OEM

पुष्टि करें

IMS के लागू होने की पुष्टि करने वाले टूल शामिल नहीं किए गए हैं, क्योंकि IMS की जानकारी काफ़ी ज़्यादा है और पुष्टि करने के लिए खास उपकरणों का इस्तेमाल किया जाता है. इन जांचों से सिर्फ़ यह पुष्टि की जा सकती है कि टेलीफ़ोनी फ़्रेमवर्क, ImsService API का सही तरीके से जवाब देता है या नहीं.

IMS ऐप्लिकेशन डेवलप करना

Android टेलीफ़ोनी स्टैक के साथ इंटरफ़ेस करने वाले IMS ऐप्लिकेशन को डेवलप करते समय, हमारा सुझाव है कि आप यह बताएं कि ऐप्लिकेशन किसी खास कैरियर की सदस्यता के लिए अटैच किए गए ImsService इंस्टेंस की स्थिति को सुन सकता है या उसमें बदलाव कर सकता है.

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

  • चालू और उपलब्ध MMTEL या आरसीएस की सुविधाएं
  • IMS रजिस्ट्रेशन की स्थिति में बदलाव होने पर अपडेट होता है
  • IMS सुविधाओं के प्रोवाइज़न की स्थिति
  • IMS की वे सुविधाएं जिन्हें उपयोगकर्ता ने चालू किया है

ImsStateCallback का इस्तेमाल करना

ImsService, लगातार बाउंड रहने वाली सेवा है. हालांकि, नया सिम कार्ड या एम्बेड की गई सदस्यता चालू होने पर या मोबाइल और इंटरनेट सेवा देने वाली कंपनी के कॉन्फ़िगरेशन में बदलाव होने पर, बाउंड की गई सेवा बदल सकती है. ImsService, टेलीफ़ोन सेवा की प्रोसेस का हिस्सा नहीं है. इसलिए, अगर सदस्यता या कॉन्फ़िगरेशन में बदलाव की वजह से, ImsService अचानक क्रैश हो जाती है या अनबाउंड हो जाती है, तो IMS API को ऐक्सेस करने के दौरान ऐप्लिकेशन को अनचाहे अपवाद दिख सकते हैं.

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

अगर कोई सदस्यता IMS के साथ काम नहीं करती है, तो फ़्रेमवर्क, वजह के साथ ImsStateCallback#onUnavailable को कॉल करता है REASON_NO_IMS_SERVICE_CONFIGURED. इसका मतलब है कि सदस्यता के लिए, ImsService और IMS से जुड़े एपीआई उपलब्ध नहीं हैं.

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