eSIM लागू करना

एंबेडेड सिम (eSIM, या eUICC) तकनीक मोबाइल उपयोगकर्ताओं को एक भौतिक सिम कार्ड के बिना एक वाहक प्रोफ़ाइल डाउनलोड करने और एक वाहक की सेवा को सक्रिय करने की अनुमति देती है। यह GSMA द्वारा संचालित एक वैश्विक विनिर्देश है जो किसी भी मोबाइल डिवाइस के रिमोट सिम प्रोविजनिंग (RSP) को सक्षम बनाता है। Android 9 से शुरू होकर, Android फ्रेमवर्क eSIM तक पहुँचने और eSIM पर सब्सक्रिप्शन प्रोफाइल प्रबंधित करने के लिए मानक API प्रदान करता है। ये eUICC API तृतीय पक्षों को eSIM-सक्षम Android उपकरणों पर अपने स्वयं के वाहक एप्लिकेशन और स्थानीय प्रोफ़ाइल सहायक (LPAs) विकसित करने में सक्षम बनाते हैं।

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

सरलीकृत रिमोट सिम प्रोविजनिंग (आरएसपी) आर्किटेक्चर

चित्रा 1. सरलीकृत आरएसपी वास्तुकला

वाहक ऐप बनाने में रुचि रखने वाले मोबाइल नेटवर्क ऑपरेटरों को EuiccManager में एपीआई देखना चाहिए, जो उच्च-स्तरीय प्रोफ़ाइल प्रबंधन संचालन प्रदान करता है जैसे कि downloadSubscription() , switchToSubscription() , और deleteSubscription()

यदि आप एक उपकरण ओईएम हैं जो अपना स्वयं का एलपीए सिस्टम ऐप बनाने में रुचि रखते हैं, तो आपको अपनी एलपीए सेवाओं से कनेक्ट करने के लिए Android फ्रेमवर्क के लिए EuiccService विस्तार करना होगा। इसके अलावा, आपको EuiccCardManager में API का उपयोग करना चाहिए, जो GSMA RSP v2.0 पर आधारित ES10x फ़ंक्शन प्रदान करता है। इन कार्यों का उपयोग eUICC चिप को कमांड जारी करने के लिए किया जाता है, जैसे कि prepareDownload() , loadBoundProfilePackage() , retrieveNotificationList() , और resetMemory()

EuiccManager में API को कार्य करने के लिए ठीक से कार्यान्वित LPA ऐप की आवश्यकता होती है और EuiccCardManager API का कॉलर LPA होना चाहिए। यह Android ढांचे द्वारा लागू किया गया है।

Android 10 या बाद का संस्करण चलाने वाले डिवाइस कई eSIM वाले उपकरणों का समर्थन कर सकते हैं। अधिक जानकारी के लिए, एकाधिक eSIM का समर्थन करना देखें।

एक वाहक ऐप बनाना

एंड्रॉइड 9 में ईयूआईसीसी एपीआई मोबाइल नेटवर्क ऑपरेटरों के लिए अपने प्रोफाइल को सीधे प्रबंधित करने के लिए कैरियर-ब्रांडेड ऐप बनाना संभव बनाता है। इसमें वाहक के स्वामित्व वाली सदस्यता प्रोफ़ाइल को डाउनलोड करना और हटाना शामिल है, साथ ही वाहक के स्वामित्व वाली प्रोफ़ाइल पर स्विच करना भी शामिल है।

Euiccप्रबंधक

ऐप्स के लिए LPA के साथ सहभागिता करने के लिए EuiccManager मुख्य प्रवेश बिंदु है। इसमें वाहक ऐप्स शामिल हैं जो वाहक के स्वामित्व वाली सदस्यताओं को डाउनलोड, हटाते और उन पर स्विच करते हैं। इसमें LUI सिस्टम ऐप भी शामिल है, जो सभी एम्बेडेड सब्सक्रिप्शन के प्रबंधन के लिए एक केंद्रीय स्थान/UI प्रदान करता है, और EuiccService प्रदान करने वाले ऐप से अलग ऐप हो सकता है।

सार्वजनिक एपीआई का उपयोग करने के लिए, एक वाहक ऐप को पहले Context#getSystemService के माध्यम से EuiccManager का उदाहरण प्राप्त करना होगा:

EuiccManager mgr = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);

कोई भी eSIM ऑपरेशन करने से पहले आपको यह जांचना चाहिए कि डिवाइस पर eSIM समर्थित है या नहीं। यदि android.hardware.telephony.euicc सुविधा परिभाषित है और एक LPA पैकेज मौजूद है EuiccManager#isEnabled() आम तौर पर true होता है।

if (mgr == null || !mgr.isEnabled()) {
    return;
}

eUICC हार्डवेयर और eSIM OS संस्करण के बारे में जानकारी प्राप्त करने के लिए:

EuiccInfo info = mgr.getEuiccInfo();
String osVer = info.getOsVersion();

कई एपीआई, जैसे कि downloadSubscription() और switchToSubscription() , PendingIntent कॉलबैक का उपयोग करते हैं क्योंकि उन्हें पूरा होने में सेकंड या मिनट भी लग सकते हैं। PendingIntent EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_ स्पेस में एक परिणाम कोड के साथ भेजा जाता है, जो फ्रेमवर्क-परिभाषित त्रुटि कोड प्रदान करता है, साथ ही LPA से EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE के रूप में प्रसारित एक मनमाना विस्तृत परिणाम कोड प्रदान करता है, जिससे वाहक ऐप लॉगिंग/डीबगिंग उद्देश्यों के लिए ट्रैक कर सकता है। PendingIntent कॉलबैक BroadcastReceiver होना चाहिए।

किसी दिए गए डाउनलोड करने योग्य सदस्यता को डाउनलोड करने के लिए ( सक्रियण कोड या क्यूआर कोड से बनाया गया):

// Register receiver.
static final String ACTION_DOWNLOAD_SUBSCRIPTION = "download_subscription";
static final String LPA_DECLARED_PERMISSION
    = "com.your.company.lpa.permission.BROADCAST";
BroadcastReceiver receiver =
        new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (!action.equals(intent.getAction())) {
                    return;
                }
                resultCode = getResultCode();
                detailedCode = intent.getIntExtra(
                    EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE,
                    0 /* defaultValue*/);

                // If the result code is a resolvable error, call startResolutionActivity
                if (resultCode == EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR) {
                    PendingIntent callbackIntent = PendingIntent.getBroadcast(
                        getContext(), 0 /* requestCode */, intent,
                        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
                    mgr.startResolutionActivity(
                        activity,
                        0 /* requestCode */,
                        intent,
                        callbackIntent);
                }

                resultIntent = intent;
            }
        };
context.registerReceiver(receiver,
        new IntentFilter(ACTION_DOWNLOAD_SUBSCRIPTION),
        LPA_DECLARED_PERMISSION /* broadcastPermission*/,
        null /* handler */);

// Download subscription asynchronously.
DownloadableSubscription sub = DownloadableSubscription
        .forActivationCode(code /* encodedActivationCode*/);
Intent intent = new Intent(action);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
mgr.downloadSubscription(sub, true /* switchAfterDownload */,
        callbackIntent);

सदस्यता आईडी दी गई सदस्यता पर स्विच करने के लिए:

// Register receiver.
static final String ACTION_SWITCH_TO_SUBSCRIPTION = "switch_to_subscription";
static final String LPA_DECLARED_PERMISSION
    = "com.your.company.lpa.permission.BROADCAST";
BroadcastReceiver receiver =
        new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (!action.equals(intent.getAction())) {
                    return;
                }
                resultCode = getResultCode();
                detailedCode = intent.getIntExtra(
                    EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE,
                    0 /* defaultValue*/);
                resultIntent = intent;
            }
        };
context.registerReceiver(receiver,
        new IntentFilter(ACTION_SWITCH_TO_SUBSCRIPTION),
        LPA_DECLARED_PERMISSION /* broadcastPermission*/,
        null /* handler */);

// Switch to a subscription asynchronously.
Intent intent = new Intent(action);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
mgr.switchToSubscription(1 /* subscriptionId */, callbackIntent);

EuiccManager API और कोड उदाहरणों की पूरी सूची के लिए, eUICC API देखें।

हल करने योग्य त्रुटियाँ

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

इन मामलों के लिए, कॉलर के कॉलबैक को EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR के साथ कॉल किया जाता है। कॉलबैक Intent में आंतरिक अतिरिक्त होते हैं जैसे कि जब कॉलर इसे EuiccManager#startResolutionActivity पास करता है, तो LUI के माध्यम से रिज़ॉल्यूशन का अनुरोध किया जा सकता है। उदाहरण के लिए पुन: पुष्टिकरण कोड का उपयोग करते हुए, EuiccManager#startResolutionActivity एक LUI स्क्रीन को ट्रिगर करता है जो उपयोगकर्ता को एक पुष्टिकरण कोड दर्ज करने की अनुमति देता है; कोड दर्ज करने के बाद, डाउनलोड ऑपरेशन फिर से शुरू हो जाता है। यह दृष्टिकोण यूआई दिखाए जाने पर वाहक ऐप को पूर्ण नियंत्रण प्रदान करता है, लेकिन एलपीए/एलयूआई को क्लाइंट ऐप्स को बदलने की आवश्यकता के बिना भविष्य में उपयोगकर्ता-पुनर्प्राप्ति योग्य मुद्दों के नए प्रबंधन को जोड़ने के लिए एक विस्तार योग्य विधि देता है।

Android 9 इन हल करने योग्य त्रुटियों को EuiccService में परिभाषित करता है, जिसे LUI को संभालना चाहिए:

/**
 * Alert the user that this action will result in an active SIM being
 * deactivated. To implement the LUI triggered by the system, you need to define
 * this in AndroidManifest.xml.
 */
public static final String ACTION_RESOLVE_DEACTIVATE_SIM =
        "android.service.euicc.action.RESOLVE_DEACTIVATE_SIM";
/**
 * Alert the user about a download/switch being done for an app that doesn't
 * currently have carrier privileges.
 */
public static final String ACTION_RESOLVE_NO_PRIVILEGES =
        "android.service.euicc.action.RESOLVE_NO_PRIVILEGES";

/** Ask the user to resolve all the resolvable errors. */
public static final String ACTION_RESOLVE_RESOLVABLE_ERRORS =
        "android.service.euicc.action.RESOLVE_RESOLVABLE_ERRORS";

वाहक विशेषाधिकार

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

यह सुनिश्चित करने के लिए कि कोई प्रोफ़ाइल केवल उसके स्वामी के लिए ही पहुंच योग्य है, Android प्रोफ़ाइल स्वामी के ऐप (अर्थात, वाहक ऐप) को विशेष विशेषाधिकार प्रदान करने के लिए एक तंत्र का उपयोग करता है। Android प्लेटफ़ॉर्म प्रोफ़ाइल की एक्सेस नियम फ़ाइल (ARF) में संग्रहीत प्रमाणपत्रों को लोड करता है और इन प्रमाणपत्रों द्वारा हस्ताक्षरित ऐप्स को EuiccManager APIs पर कॉल करने की अनुमति देता है। उच्च स्तरीय प्रक्रिया नीचे वर्णित है:

  1. ऑपरेटर कैरियर ऐप एपीके पर हस्ताक्षर करता है; apksigner टूल सार्वजनिक-कुंजी प्रमाणपत्र को APK से जोड़ता है।
  2. ऑपरेटर/एसएम-डीपी+ एक प्रोफ़ाइल और इसका मेटाडेटा तैयार करता है, जिसमें एक ARF शामिल होता है जिसमें शामिल होता है:

    1. वाहक ऐप के सार्वजनिक-कुंजी प्रमाणपत्र के हस्ताक्षर (SHA-1 या SHA-256) (आवश्यक)
    2. वाहक ऐप का पैकेज नाम (दृढ़ता से अनुशंसित)
  3. वाहक ऐप EuiccManager API के माध्यम से एक eUICC कार्रवाई करने का प्रयास करता है।

  4. Android प्लेटफ़ॉर्म कॉलर ऐप के प्रमाणपत्र के SHA-1 या SHA-256 हैश की पुष्टि करता है, लक्ष्य प्रोफ़ाइल के ARF से प्राप्त प्रमाणपत्र के हस्ताक्षर से मेल खाता है। यदि वाहक ऐप का पैकेज नाम ARF में शामिल है, तो उसे कॉलर ऐप के पैकेज नाम से भी मेल खाना चाहिए।

  5. हस्ताक्षर और पैकेज नाम (यदि शामिल है) सत्यापित होने के बाद, लक्ष्य प्रोफ़ाइल पर कॉलर ऐप को वाहक विशेषाधिकार प्रदान किया जाता है।

क्योंकि प्रोफ़ाइल मेटाडेटा प्रोफ़ाइल के बाहर ही उपलब्ध हो सकता है (ताकि LPA प्रोफ़ाइल के डाउनलोड होने से पहले SM-DP+ से या प्रोफ़ाइल के अक्षम होने पर ISD-R से प्रोफ़ाइल मेटाडेटा को पुनः प्राप्त कर सके), इसमें समान वाहक विशेषाधिकार नियम होने चाहिए जैसा कि प्रोफाइल में है।

eUICC OS और SM-DP+ को प्रोफ़ाइल मेटाडेटा में मालिकाना टैग BF76 का समर्थन करना चाहिए। टैग सामग्री समान वाहक विशेषाधिकार नियम होने चाहिए जैसा कि यूआईसीसी कैरियर विशेषाधिकार में परिभाषित एक्सेस नियम एप्लेट (एआरए) द्वारा लौटाया गया है:

RefArDo ::= [PRIVATE 2] SEQUENCE {  -- Tag E2
    refDo [PRIVATE 1] SEQUENCE {  -- Tag E1
        deviceAppIdRefDo [PRIVATE 1] OCTET STRING (SIZE(20|32)),  -- Tag C1
        pkgRefDo [PRIVATE 10] OCTET STRING (SIZE(0..127)) OPTIONAL  -- Tag CA
    },
    arDo [PRIVATE 3] SEQUENCE {  -- Tag E3
        permArDo [PRIVATE 27] OCTET STRING (SIZE(8))  -- Tag DB
    }
}

ऐप साइनिंग के बारे में अधिक जानकारी के लिए, अपने ऐप पर साइन इन करें देखें। वाहक विशेषाधिकारों के विवरण के लिए, UICC वाहक विशेषाधिकार देखें।

एक स्थानीय प्रोफ़ाइल सहायक ऐप बनाना

आप अपने स्वयं के स्थानीय प्रोफ़ाइल सहायक (LPA) को लागू कर सकते हैं, जिसे Android Euicc API से जोड़ा जाना चाहिए। निम्नलिखित खंड एलपीए ऐप बनाने और इसे एंड्रॉइड सिस्टम के साथ एकीकृत करने का संक्षिप्त विवरण देते हैं।

हार्डवेयर / मॉडेम आवश्यकताएं

eUICC चिप पर LPA और eSIM OS को कम से कम GSMA RSP (रिमोट सिम प्रोविजनिंग) v2.0 या v2.2 का समर्थन करना चाहिए। आपको ऐसे SM-DP+ और SM-DS सर्वरों का उपयोग करने की भी योजना बनानी चाहिए जिनका मेल खाने वाला RSP संस्करण हो। विस्तृत आरएसपी आर्किटेक्चर के लिए, जीएसएमए एसजीपी.21 आरएसपी आर्किटेक्चर विशिष्टता देखें।

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

  • इराडियो एचएएल v1.1: setSimPower
  • IRadio HAL v1.2: getIccCardStatus

  • IRadioConfig HAL v1.0: getSimSlotsStatus

मॉडेम को डिफ़ॉल्ट बूट प्रोफ़ाइल के साथ eSIM को मान्य सिम के रूप में पहचानना चाहिए और सिम पावर को चालू रखना चाहिए।

एंड्रॉइड 10 चलाने वाले उपकरणों के लिए, एक गैर-हटाने योग्य ईयूआईसीसी स्लॉट आईडी सरणी को परिभाषित किया जाना चाहिए। उदाहरण के लिए, arrays.xml देखें।

<resources>
   <!-- Device-specific array of SIM slot indexes which are are embedded eUICCs.
        e.g. If a device has two physical slots with indexes 0, 1, and slot 1 is an
        eUICC, then the value of this array should be:
            <integer-array name="non_removable_euicc_slots">
                <item>1</item>
            </integer-array>
        If a device has three physical slots and slot 1 and 2 are eUICCs, then the value of
        this array should be:
            <integer-array name="non_removable_euicc_slots">
               <item>1</item>
               <item>2</item>
            </integer-array>
        This is used to differentiate between removable eUICCs and built in eUICCs, and should
        be set by OEMs for devices which use eUICCs. -->

   <integer-array name="non_removable_euicc_slots">
       <item>1</item>
   </integer-array>
</resources>

मॉडेम आवश्यकताओं की पूरी सूची के लिए, eSIM समर्थन के लिए मॉडेम आवश्यकताएँ देखें।

EuiccService

एक एलपीए में दो अलग-अलग घटक होते हैं (दोनों को एक ही एपीके में लागू किया जा सकता है): एलपीए बैकएंड और एलपीए यूआई या एलयूआई।

LPA बैकएंड को लागू करने के लिए, आपको EuiccService विस्तार करना होगा और इस सेवा को अपनी मेनिफेस्ट फ़ाइल में घोषित करना होगा। सेवा को यह सुनिश्चित करने के लिए android.permission.BIND_EUICC_SERVICE सिस्टम अनुमति की आवश्यकता होनी चाहिए कि केवल सिस्टम ही इससे आबद्ध हो सकता है। सेवा में android.service.euicc.EuiccService क्रिया के साथ एक आशय फ़िल्टर भी शामिल होना चाहिए। डिवाइस पर कई कार्यान्वयन मौजूद होने की स्थिति में आशय फ़िल्टर की प्राथमिकता को गैर-शून्य मान पर सेट किया जाना चाहिए। उदाहरण के लिए:

<service
    android:name=".EuiccServiceImpl"
    android:permission="android.permission.BIND_EUICC_SERVICE">
    <intent-filter android:priority="100">
        <action android:name="android.service.euicc.EuiccService" />
    </intent-filter>
</service>

आंतरिक रूप से, एंड्रॉइड फ्रेमवर्क सक्रिय एलपीए निर्धारित करता है और एंड्रॉइड ईयूआईसीसी एपीआई का समर्थन करने के लिए आवश्यकतानुसार इसके साथ इंटरैक्ट करता है। PackageManager android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS अनुमति वाले सभी ऐप्स के लिए पूछताछ की जाती है, जो android.service.euicc.EuiccService कार्रवाई के लिए एक सेवा निर्दिष्ट करता है। सर्वोच्च प्राथमिकता वाली सेवा का चयन किया जाता है। यदि कोई सेवा नहीं मिलती है, तो LPA समर्थन अक्षम कर दिया जाता है।

एलयूआई को लागू करने के लिए, आपको निम्नलिखित कार्यों के लिए एक गतिविधि प्रदान करनी होगी:

  • android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS
  • android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION

जैसा कि सेवा के साथ होता है, प्रत्येक गतिविधि के लिए android.permission.BIND_EUICC_SERVICE सिस्टम अनुमति की आवश्यकता होती है। प्रत्येक के पास उपयुक्त कार्रवाई, android.service.euicc.category.EUICC_UI श्रेणी, और गैर-शून्य प्राथमिकता वाला एक इंटेंट फ़िल्टर होना चाहिए। इन गतिविधियों के कार्यान्वयन को चुनने के लिए इसी तरह के तर्क का उपयोग किया जाता है जैसे कि EuiccService के कार्यान्वयन को चुनने के साथ। उदाहरण के लिए:

<activity android:name=".MyLuiActivity"
          android:exported="true"
          android:permission="android.permission.BIND_EUICC_SERVICE">
    <intent-filter android:priority="100">
        <action android:name="android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS" />
        <action android:name="android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.service.euicc.category.EUICC_UI" />
    </intent-filter>
</activity>

इसका तात्पर्य यह है कि इन स्क्रीन को लागू करने वाला UI EuiccService को लागू करने वाले APK से भिन्न APK से आ सकता है। चाहे एक एपीके हो या एक से अधिक एपीके (उदाहरण के लिए, एक जो EuiccService लागू करता है और एक जो LUI गतिविधियाँ प्रदान करता है) एक डिज़ाइन विकल्प है।

EuiccCardManager

EuiccCardManager eSIM चिप के साथ संचार करने के लिए इंटरफ़ेस है। यह ES10 फ़ंक्शन प्रदान करता है (जैसा कि GSMA RSP कल्पना में वर्णित है) और निम्न-स्तरीय APDU अनुरोध/प्रतिक्रिया आदेशों के साथ-साथ ASN.1 पार्सिंग को भी संभालता है। EuiccCardManager एक सिस्टम API है और इसे केवल सिस्टम-विशेषाधिकार प्राप्त ऐप्स द्वारा ही कॉल किया जा सकता है।

कैरियर ऐप्स, LPA और Euicc APIs

चित्र 2. वाहक ऐप और LPA दोनों ही Euicc API का उपयोग करते हैं

EuiccCardManager के माध्यम से प्रोफ़ाइल ऑपरेशन API के लिए कॉलर को LPA होना आवश्यक है। यह Android ढांचे द्वारा लागू किया गया है। इसका अर्थ है कि कॉलर को EuiccService विस्तार करना चाहिए और आपकी मेनिफेस्ट फ़ाइल में घोषित किया जाना चाहिए, जैसा कि पिछले अनुभागों में बताया गया है।

EuiccManager के समान, EuiccCardManager APIs का उपयोग करने के लिए, आपके LPA को पहले Context#getSystemService के माध्यम से EuiccCardManager का उदाहरण प्राप्त करना होगा:

EuiccCardManager cardMgr = (EuiccCardManager) context.getSystemService(Context.EUICC_CARD_SERVICE);

फिर, ईयूआईसीसी पर सभी प्रोफाइल प्राप्त करने के लिए:

ResultCallback<EuiccProfileInfo[]> callback =
       new ResultCallback<EuiccProfileInfo[]>() {
           @Override
           public void onComplete(int resultCode,
                   EuiccProfileInfo[] result) {
               if (resultCode == EuiccCardManagerReflector.RESULT_OK) {
                   // handle result
               } else {
                   // handle error
               }
           }
       };

cardMgr.requestAllProfiles(eid, AsyncTask.THREAD_POOL_EXECUTOR, callback);

आंतरिक रूप से, EuiccCardManager एक AIDL इंटरफ़ेस के माध्यम से EuiccCardController (जो फोन प्रक्रिया में चलता है) से जुड़ता है, और प्रत्येक EuiccCardManager विधि एक अलग, समर्पित AIDL इंटरफ़ेस के माध्यम से फ़ोन प्रक्रिया से अपना कॉलबैक प्राप्त करती है। EuiccCardManager API का उपयोग करते समय, कॉल करने वाले (LPA) को एक Executor ऑब्जेक्ट प्रदान करना होगा जिसके माध्यम से कॉलबैक लागू किया जाता है। यह Executor ऑब्जेक्ट एक थ्रेड या आपकी पसंद के थ्रेड पूल पर चल सकता है।

अधिकांश EuiccCardManager API का उपयोग पैटर्न समान है। उदाहरण के लिए, eUICC पर एक बाउंड प्रोफ़ाइल पैकेज लोड करने के लिए:

...
cardMgr.loadBoundProfilePackage(eid, boundProfilePackage,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

किसी दिए गए ICCID के साथ किसी भिन्न प्रोफ़ाइल पर स्विच करने के लिए:

...
cardMgr.switchToProfile(eid, iccid, true /* refresh */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

eUICC चिप से डिफ़ॉल्ट SM-DP+ पता प्राप्त करने के लिए:

...
cardMgr.requestDefaultSmdpAddress(eid, AsyncTask.THREAD_POOL_EXECUTOR,
        callback);

दिए गए अधिसूचना ईवेंट की अधिसूचनाओं की सूची पुनर्प्राप्त करने के लिए:

...
cardMgr.listNotifications(eid,
        EuiccNotification.Event.INSTALL
              | EuiccNotification.Event.DELETE /* events */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

एक वाहक ऐप के माध्यम से एक eSIM प्रोफ़ाइल को सक्रिय करना

Android 9 या उसके बाद वाले वर्शन चलाने वाले डिवाइस पर, आप eSIM को सक्रिय करने और प्रोफ़ाइल डाउनलोड करने के लिए कैरियर ऐप का उपयोग कर सकते हैं। कैरियर ऐप सीधे downloadSubscription पर कॉल करके या एलपीए को एक एक्टिवेशन कोड प्रदान करके प्रोफाइल डाउनलोड कर सकता है।

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

नीचे दिए गए अनुभाग में एक सक्रियण कोड का उपयोग करके वाहक ऐप के माध्यम से एक eSIM को सक्रिय करने का वर्णन किया गया है।

एक सक्रियण कोड का उपयोग करके eSIM को सक्रिय किया जा रहा है

किसी eSIM प्रोफ़ाइल को सक्रिय करने के लिए सक्रियण कोड का उपयोग करते समय, LPA कैरियर ऐप से एक सक्रियण कोड प्राप्त करता है और प्रोफ़ाइल को डाउनलोड करता है। यह प्रवाह एलपीए द्वारा शुरू किया जा सकता है और एलपीए पूरे यूआई प्रवाह को नियंत्रित कर सकता है, जिसका अर्थ है कि कोई वाहक ऐप यूआई नहीं दिखाया गया है। यह दृष्टिकोण BF76 टैग चेक को बायपास करता है, और नेटवर्क ऑपरेटरों को एक eSIM प्रोफ़ाइल डाउनलोड करने और त्रुटि प्रबंधन सहित पूरे eSIM सक्रियण UI प्रवाह को लागू करने की आवश्यकता नहीं है।

वाहक eUICC प्रावधान सेवा को परिभाषित करना

LPA और कैरियर ऐप दो AIDL इंटरफेस के माध्यम से संचार करते हैं: ICarrierEuiccProvisioningService और IGetActivationCodeCallback । कैरियर ऐप को एक ICarrierEuiccProvisioningService इंटरफ़ेस लागू करना होगा और इसे अपनी प्रकट घोषणा में प्रदर्शित करना होगा। LPA को ICarrierEuiccProvisioningService से जुड़ना चाहिए और IGetActivationCodeCallback लागू करना चाहिए। एआईडीएल इंटरफेस को लागू करने और उजागर करने के तरीके के बारे में अधिक जानकारी के लिए, परिभाषित और एआईडीएल इंटरफेस देखें।

एआईडीएल इंटरफेस को परिभाषित करने के लिए, एलपीए और कैरियर ऐप दोनों के लिए निम्नलिखित एआईडीएल फाइलें बनाएं।

  • ICarrierEuiccProvisioningService.aidl

    package android.service.euicc;
    
    import android.service.euicc.IGetActivationCodeCallback;
    
    oneway interface ICarrierEuiccProvisioningService {
        // The method to get the activation code from the carrier app. The caller needs to pass in
        // the implementation of IGetActivationCodeCallback as the parameter.
        void getActivationCode(in IGetActivationCodeCallback callback);
    
        // The method to get the activation code from the carrier app. The caller needs to pass in
        // the activation code string as the first parameter and the implementation of
        // IGetActivationCodeCallback as the second parameter. This method provides the carrier
        // app the device EID which allows a carrier to pre-bind a profile to the device's EID before
        // the download process begins.
        void getActivationCodeForEid(in String eid, in IGetActivationCodeCallback callback);
    }
    
    
  • IGetActivationCodeCallback.aidl

    package android.service.euicc;
    
    oneway interface IGetActivationCodeCallback {
        // The call back method needs to be called when the carrier app gets the activation
        // code successfully. The caller needs to pass in the activation code string as the
        // parameter.
        void onSuccess(String activationCode);
    
        // The call back method needs to be called when the carrier app failed to get the
        // activation code.
        void onFailure();
    }
    

उदाहरण एलपीए कार्यान्वयन

वाहक ऐप के ICarrierEuiccProvisioningService कार्यान्वयन से आबद्ध होने के लिए, LPA को ICarrierEuiccProvisioningService.aidl और IGetActivationCodeCallback.aidl दोनों को आपके प्रोजेक्ट में कॉपी करना होगा और ServiceConnection लागू करना होगा।

@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
    mCarrierProvisioningService = ICarrierEuiccProvisioningService.Stub.asInterface(iBinder);
}

कैरियर ऐप के ICarrierEuiccProvisioningService कार्यान्वयन के लिए बाध्य होने के बाद, IGetActivationCodeCallback स्टब क्लास के कार्यान्वयन को पारित करके वाहक ऐप से सक्रियण कोड प्राप्त करने के लिए LPA getActivationCode या getActivationCodeForEid को कॉल करता है।

getActivationCode और getActivationCodeForEid के बीच का अंतर यह है कि getActivationCodeForEid वाहक को डाउनलोड प्रक्रिया शुरू होने से पहले डिवाइस के EID के लिए प्रोफ़ाइल को प्री-बाइंड करने की अनुमति देता है।

void getActivationCodeFromCarrierApp() {
    IGetActivationCodeCallback.Stub callback =
            new IGetActivationCodeCallback.Stub() {
                @Override
                public void onSuccess(String activationCode) throws RemoteException {
                    // Handle the case LPA success to get activation code from a carrier app.
                }

                @Override
                public void onFailure() throws RemoteException {
                    // Handle the case LPA failed to get activation code from a carrier app.
                }
            };
    
    try {
        mCarrierProvisioningService.getActivationCode(callback);
    } catch (RemoteException e) {
        // Handle Remote Exception
    }
}

वाहक ऐप के लिए उदाहरण कार्यान्वयन

LPA के लिए कैरियर ऐप से जुड़ने के लिए, कैरियर ऐप को ICarrierEuiccProvisioningService.aidl और IGetActivationCodeCallback.aidl दोनों को आपके प्रोजेक्ट में कॉपी करना होगा और AndroidManifest.xml फ़ाइल में ICarrierEuiccProvisioningService सेवा की घोषणा करनी होगी। सेवा को यह सुनिश्चित करने के लिए android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS सिस्टम अनुमति की आवश्यकता होनी चाहिए कि केवल LPA, एक सिस्टम-विशेषाधिकार प्राप्त ऐप, इससे आबद्ध हो सकता है। सेवा में android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE क्रिया के साथ एक आशय फ़िल्टर भी शामिल होना चाहिए।

  • AndroidManifest.xml

    <application>
      ...
      <service
          android:name=".CarrierEuiccProvisioningService"
          android:exported="true"
          android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS">
        <intent-filter>
          <action android:name="android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE"/>
        </intent-filter>
      </service>
      ...
    </application>
    

एआईडीएल वाहक ऐप सेवा को लागू करने के लिए, एक सेवा बनाएं, Stub क्लास का विस्तार करें और getActivationCode और getActivationCodeForEid विधियों को लागू करें। LPA तब प्रोफ़ाइल सक्रियण कोड प्राप्त करने के लिए किसी भी विधि को कॉल कर सकता है। वाहक ऐप को IGetActivationCodeCallback#onSuccess को सक्रियण कोड के साथ कॉल करके जवाब देना चाहिए यदि कोड वाहक के सर्वर से सफलतापूर्वक प्राप्त किया गया था। असफल होने पर, वाहक ऐप को IGetActivationCodeCallback#onFailure के साथ जवाब देना चाहिए।

  • CarrierEuiccProvisioningService.java

    import android.service.euicc.ICarrierEuiccProvisioningService;
    import android.service.euicc.ICarrierEuiccProvisioningService.Stub;
    import android.service.euicc.IGetActivationCodeCallback;
    
    public class CarrierEuiccProvisioningService extends Service {
        private final ICarrierEuiccProvisioningService.Stub binder =
            new Stub() {
              @Override
              public void getActivationCode(IGetActivationCodeCallback callback) throws RemoteException {
                String activationCode = // do whatever work necessary to get an activation code (HTTP requests to carrier server, fetch from storage, etc.)
                callback.onSuccess(activationCode);
              }
    
              @Override
              public void getActivationCodeForEid(String eid, IGetActivationCodeCallback callback) throws RemoteException {
                String activationCode = // do whatever work necessary (HTTP requests, fetch from storage, etc.)
                callback.onSuccess(activationCode);
              }
          }
    }
    

एलपीए सक्रियण प्रवाह में कैरियर ऐप यूआई शुरू करना

Android 11 और उसके बाद वाले वर्शन चलाने वाले डिवाइस पर, LPA कैरियर ऐप का UI शुरू कर सकता है। यह उपयोगी है क्योंकि एक वाहक ऐप को एलपीए को एक सक्रियण कोड की आपूर्ति करने से पहले उपयोगकर्ता से अतिरिक्त जानकारी की आवश्यकता हो सकती है। उदाहरण के लिए, वाहकों को अपने फोन नंबरों को सक्रिय करने या अन्य पोर्टिंग सेवाओं को निष्पादित करने के लिए उपयोगकर्ताओं को लॉग इन करने की आवश्यकता हो सकती है।

एलपीए में कैरियर ऐप के यूआई को शुरू करने की यह प्रक्रिया है:

  1. LPA ने वाहक ऐप पैकेज को android.service.euicc.action.START_CARRIER_ACTIVATION इंटेंट भेजकर वाहक ऐप के सक्रियण प्रवाह को लॉन्च किया जिसमें कार्रवाई शामिल है। (गैर-एलपीए ऐप से इंटेंट प्राप्त करने से बचने के लिए कैरियर ऐप रिसीवर को android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" के साथ मेनिफेस्ट डिक्लेरेशन में सुरक्षित होना चाहिए।)

    String packageName = // The carrier app's package name
    
    Intent carrierAppIntent =
        new Intent(“android.service.euicc.action.START_CARRIER_ACTIVATION”)
            .setPackage(packageName);
    
    ResolveInfo activity =
        context.getPackageManager().resolveActivity(carrierAppIntent, 0);
    
    carrierAppIntent
        .setClassName(activity.activityInfo.packageName, activity.activityInfo.name);
    
    startActivityForResult(carrierAppIntent, requestCode);
    
  2. वाहक ऐप अपने स्वयं के UI का उपयोग करके अपना कार्य करता है। उदाहरण के लिए, उपयोगकर्ता में लॉग इन करना या कैरियर के बैकएंड को HTTP अनुरोध भेजना।

  3. कैरियर ऐप LPA को setResult(int, Intent) और finish() कॉल करके जवाब देता है।

    1. यदि वाहक ऐप RESULT_OK के साथ प्रतिक्रिया करता है, तो LPA सक्रियण प्रवाह जारी रखता है। यदि वाहक ऐप यह निर्धारित करता है कि उपयोगकर्ता को LPA को वाहक ऐप की सेवा को बाध्य करने देने के बजाय QR कोड को स्कैन करना चाहिए, तो वाहक ऐप RESULT_OK के साथ setResult(int, Intent) का उपयोग करके LPA का जवाब देता है और बूलियन अतिरिक्त android.telephony.euicc.extra.USE_QR_SCANNER युक्त एक Intent उदाहरण। android.telephony.euicc.extra.USE_QR_SCANNER true पर सेट है। LPA तब अतिरिक्त की जाँच करता है और वाहक ऐप के ICarrierEuiccProvisioningService कार्यान्वयन को बाध्य करने के बजाय QR स्कैनर लॉन्च करता है।
    2. यदि कैरियर ऐप क्रैश हो जाता है या RESULT_CANCELED के साथ प्रतिक्रिया करता है (यह डिफ़ॉल्ट प्रतिक्रिया कोड है), तो LPA eSIM सक्रियण प्रवाह को रद्द कर देता है।
    3. यदि वाहक ऐप RESULT_OK या RESULT_CANCELED के अलावा किसी अन्य चीज़ के साथ प्रतिक्रिया करता है, तो LPA इसे एक त्रुटि के रूप में मानता है।

    सुरक्षा कारणों से, एलपीए को यह सुनिश्चित करने के लिए कि गैर-एलपीए कॉल करने वालों को कैरियर ऐप से एक्टिवेशन कोड नहीं मिल सकता है, परिणाम इंटेंट में आपूर्ति किए गए एक्टिवेशन कोड को सीधे स्वीकार नहीं करना चाहिए

किसी कैरियर ऐप में LPA एक्टिवेशन फ़्लो लॉन्च करना

Android 11 से शुरू होकर, वाहक ऐप्स eUICC API का उपयोग eSIM सक्रियण के लिए LUI प्रारंभ करने के लिए कर सकते हैं। यह विधि eSIM प्रोफ़ाइल को सक्रिय करने के लिए LPA के eSIM सक्रियण फ़्लो UI को सरफेस करती है। एलपीए तब एक प्रसारण भेजता है जब eSIM प्रोफ़ाइल सक्रियण समाप्त हो जाता है।

  1. LPA को android.service.euicc.action.START_EUICC_ACTIVATION क्रिया के साथ इंटेंट फ़िल्टर सहित गतिविधि की घोषणा करनी चाहिए। डिवाइस पर कई कार्यान्वयन मौजूद होने की स्थिति में आशय फ़िल्टर की प्राथमिकता को गैर-शून्य मान पर सेट किया जाना चाहिए। उदाहरण के लिए:

    <application>
      ...
    <activity
        android:name=".CarrierAppInitActivity"
        android:exported="true">
    
        <intent-filter android:priority="100">
            <action android:name="android.service.euicc.action.START_EUICC_ACTIVATION" />
        </intent-filter>
    </activity>
      ...
    </application>
    
  2. वाहक ऐप अपने स्वयं के UI का उपयोग करके अपना कार्य करता है। उदाहरण के लिए, उपयोगकर्ता में लॉग इन करना या कैरियर के बैकएंड को HTTP अनुरोध भेजना।

  3. इस बिंदु पर, वाहक ऐप अपने ICarrierEuiccProvisioningService कार्यान्वयन के माध्यम से एक सक्रियण कोड की आपूर्ति करने के लिए तैयार होना चाहिए। वाहक ऐप android.telephony.euicc.action.START_EUICC_ACTIVATION क्रिया के साथ startActivityForResult(Intent, int) कॉल करके LPA लॉन्च करता है। LPA बूलियन अतिरिक्त android.telephony.euicc.extra.USE_QR_SCANNER की भी जाँच करता है। यदि मान true है, तो LPA उपयोगकर्ता को प्रोफ़ाइल QR कोड स्कैन करने देने के लिए QR स्कैनर लॉन्च करता है।

  4. LPA की ओर से, LPA वाहक ऐप के ICarrierEuiccProvisioningService कार्यान्वयन से सक्रियण कोड प्राप्त करने और संबंधित प्रोफ़ाइल डाउनलोड करने के लिए आबद्ध होता है। LPA डाउनलोड के दौरान सभी आवश्यक UI तत्वों को प्रदर्शित करता है, जैसे लोडिंग स्क्रीन।

  5. जब LPA सक्रियण प्रवाह पूरा हो जाता है, तो LPA एक परिणाम कोड के साथ कैरियर ऐप पर प्रतिक्रिया करता है, जिसे कैरियर ऐप onActivityResult(int, int, Intent) में हैंडल करता है।

    1. यदि LPA नई eSIM प्रोफ़ाइल डाउनलोड करने में सफल हो जाता है, तो यह RESULT_OK के साथ प्रतिक्रिया करता है।
    2. यदि उपयोगकर्ता LPA में eSIM प्रोफ़ाइल सक्रियण को रद्द कर देता है, तो वह RESULT_CANCELED के साथ प्रतिक्रिया करता है।
    3. यदि LPA RESULT_OK या RESULT_CANCELED के अलावा किसी अन्य चीज़ के साथ प्रतिक्रिया करता है, तो कैरियर ऐप इसे एक त्रुटि के रूप में मानता है।

    सुरक्षा कारणों से, एलपीए आपूर्ति किए गए इरादे में सीधे सक्रियण कोड को स्वीकार नहीं करता है ताकि यह सुनिश्चित किया जा सके कि गैर-एलपीए कॉल करने वालों को वाहक ऐप से सक्रियण कोड नहीं मिल सकता है।

एकाधिक eSIM का समर्थन करना

Android 10 या उसके बाद के संस्करण चलाने वाले उपकरणों के लिए, EuiccManager वर्ग कई eSIM वाले उपकरणों का समर्थन करता है। एकल eSIM वाले उपकरण जो Android 10 में अपग्रेड हो रहे हैं, उन्हें LPA कार्यान्वयन में किसी भी संशोधन की आवश्यकता नहीं है क्योंकि प्लेटफ़ॉर्म स्वचालित रूप से EuiccManager उदाहरण को डिफ़ॉल्ट eUICC के साथ जोड़ता है। डिफ़ॉल्ट eUICC रेडियो HAL संस्करण 1.2 या उच्चतर वाले उपकरणों के लिए प्लेटफॉर्म द्वारा और 1.2 से कम रेडियो HAL संस्करण वाले उपकरणों के लिए LPA द्वारा निर्धारित किया जाता है।

आवश्यकताएं

एकाधिक eSIM का समर्थन करने के लिए, डिवाइस में एक से अधिक eUICC होना चाहिए, जो या तो एक अंतर्निहित eUICC या एक भौतिक सिम स्लॉट हो सकता है जहाँ हटाने योग्य eUICC डाले जा सकते हैं।

एकाधिक eSIM का समर्थन करने के लिए रेडियो HAL संस्करण 1.2 या उच्चतर आवश्यक है। Radio HAL संस्करण 1.4 और RadioConfig HAL संस्करण 1.2 की अनुशंसा की जाती है।

कार्यान्वयन

एकाधिक eSIM (हटाने योग्य eUICCs या प्रोग्राम करने योग्य सिम सहित) का समर्थन करने के लिए, LPA को EuiccService को लागू करना चाहिए, जो कॉलर द्वारा प्रदान की गई कार्ड आईडी के अनुरूप स्लॉट आईडी प्राप्त करता है।

arrays.xml में निर्दिष्ट non_removable_euicc_slots संसाधन पूर्णांकों की एक सरणी है जो डिवाइस के अंतर्निर्मित eUICCs के स्लॉट आईडी का प्रतिनिधित्व करता है। प्लेटफ़ॉर्म को यह निर्धारित करने की अनुमति देने के लिए आपको इस संसाधन को निर्दिष्ट करना होगा कि डाला गया eUICC हटाने योग्य है या नहीं।

कई eSIM वाले डिवाइस के लिए कैरियर ऐप

एकाधिक eSIM वाले डिवाइस के लिए कैरियर ऐप बनाते समय, EuiccManager में createForCardId विधि का उपयोग करके एक EuiccManager ऑब्जेक्ट बनाएं जो किसी दिए गए कार्ड आईडी पर पिन किया गया हो। कार्ड आईडी एक पूर्णांक मान है जो विशिष्ट रूप से डिवाइस पर यूआईसीसी या ईयूआईसीसी की पहचान करता है।

डिवाइस के डिफ़ॉल्ट eUICC के लिए कार्ड आईडी प्राप्त करने के लिए, TelephonyManager में getCardIdForDefaultEuicc विधि का उपयोग करें। यदि रेडियो HAL संस्करण 1.2 से कम है तो यह विधि UNSUPPORTED_CARD_ID लौटाती है और यदि डिवाइस ने eUICC को नहीं पढ़ा है तो UNINITIALIZED_CARD_ID लौटाती है।

आप TelephonyManager में getUiccCardsInfo और getUiccSlotsInfo (system API) से और SubscriptionInfo में getCardId से कार्ड आईडी भी प्राप्त कर सकते हैं।

जब एक EuiccManager ऑब्जेक्ट को एक विशिष्ट कार्ड आईडी के साथ तत्काल किया जाता है, तो सभी ऑपरेशन उस कार्ड आईडी के साथ eUICC को निर्देशित किए जाते हैं। यदि eUICC अगम्य हो जाता है (उदाहरण के लिए, जब इसे बंद कर दिया जाता है या हटा दिया जाता है) EuiccManager अब काम नहीं करता है।

कैरियर ऐप बनाने के लिए आप निम्न कोड नमूने का उपयोग कर सकते हैं।

उदाहरण 1: सक्रिय सदस्यता प्राप्त करें और EuiccManager तत्काल करें

// Get the active subscription and instantiate an EuiccManager for the eUICC which holds
// that subscription
SubscriptionManager subMan = (SubscriptionManager)
        mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
int cardId = subMan.getActiveSubscriptionInfo().getCardId();
EuiccManager euiccMan = (EuiccManager) mContext.getSystemService(Context.EUICC_SERVICE)
            .createForCardId(cardId);

उदाहरण 2: UICCs के माध्यम से पुनरावृति करें और हटाने योग्य eUICC के लिए EuiccManager इंस्टेंट करें

// On a device with a built-in eUICC and a removable eUICC, iterate through the UICC cards
// to instantiate an EuiccManager associated with a removable eUICC
TelephonyManager telMan = (TelephonyManager)
        mContext.getSystemService(Context.TELEPHONY_SERVICE);
List<UiccCardInfo> infos = telMan.getUiccCardsInfo();
int removableCardId = -1; // valid cardIds are 0 or greater
for (UiccCardInfo info : infos) {
    if (info.isRemovable()) {
        removableCardId = info.getCardId();
        break;
    }
}
if (removableCardId != -1) {
    EuiccManager euiccMan = (EuiccManager) mContext.getSystemService(Context.EUICC_SERVICE)
            .createForCardId(removableCardId);
}

मान्यकरण

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

आपको यह सुनिश्चित करना चाहिए कि बिल्ड निम्नलिखित सीटीएस परीक्षण मामलों (सार्वजनिक एपीआई के लिए) पास करते हैं: /प्लेटफ़ॉर्म/सीटीएस/परीक्षण/परीक्षण/टेलीफोनी/वर्तमान/src/एंड्रॉइड/टेलीफोनी/ईयूआईसीसी/सीटीएस।

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

यदि आप अपना स्वयं का एलपीए बना रहे हैं, तो आपको और अधिक कठिन परीक्षण से गुजरना होगा। आपको अपने मॉडेम वेंडर, eUICC चिप या eSIM OS वेंडर, SM-DP+ वेंडर, और कैरियर्स के साथ काम करना चाहिए ताकि मुद्दों को हल किया जा सके और RSP आर्किटेक्चर के भीतर आपके LPA की इंटरऑपरेबिलिटी सुनिश्चित की जा सके। मैन्युअल परीक्षण की एक अच्छी मात्रा अपरिहार्य है। सर्वोत्तम परीक्षण कवरेज के लिए, आपको GSMA SGP.23 RSP परीक्षण योजना का पालन करना चाहिए।