ई-सिम को लागू करें

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

एलपीए एक स्टैंडअलोन, सिस्टम ऐप्लिकेशन है. इसे Android के बिल्ड की इमेज में शामिल किया जाना चाहिए. आम तौर पर, ई-सिम पर प्रोफ़ाइलों को एलपीए मैनेज करता है. ऐसा इसलिए, क्योंकि यह SM-DP+ (डिवाइसों के लिए प्रोफ़ाइल पैकेज तैयार करने, सेव करने, और डिलीवर करने वाली रिमोट सेवा) और eUICC चिप के बीच ब्रिज के तौर पर काम करता है. एलपीए APK में एक यूआई कॉम्पोनेंट शामिल हो सकता है. इसे एलपीए यूज़र इंटरफ़ेस (यूआई) या एलयूआई कहा जाता है. इसका मकसद, असली उपयोगकर्ताओं को एक ऐसी जगह उपलब्ध कराना है जहां से वे एम्बेड की गई सदस्यताओं की सभी प्रोफ़ाइलों को मैनेज कर सकें. Android फ़्रेमवर्क, सबसे अच्छे उपलब्ध एलपीए को अपने-आप ढूंढता है और उससे कनेक्ट होता है. साथ ही, सभी eUICC ऑपरेशन को एलपीए इंस्टेंस के ज़रिए रूट करता है.

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

पहली इमेज. आसान आरएसपी आर्किटेक्चर

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

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

EuiccManager में मौजूद एपीआई के काम करने के लिए, एलपीए ऐप्लिकेशन को सही तरीके से लागू करना ज़रूरी है. साथ ही, EuiccCardManager एपीआई को कॉल करने वाला व्यक्ति, एलपीए होना चाहिए. यह Android फ़्रेमवर्क से लागू होता है.

Android 10 या इसके बाद के वर्शन पर चलने वाले डिवाइसों में, एक से ज़्यादा ई-सिम का इस्तेमाल किया जा सकता है. ज़्यादा जानकारी के लिए, एक से ज़्यादा ई-सिम का इस्तेमाल करना लेख पढ़ें.

मोबाइल और इंटरनेट सेवा देने वाली कंपनी का ऐप्लिकेशन बनाएं

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

EuiccManager

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

सार्वजनिक एपीआई का इस्तेमाल करने के लिए, कैरियर ऐप्लिकेशन को सबसे पहले Context#getSystemService के ज़रिए EuiccManager का इंस्टेंस हासिल करना होगा:

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

ई-सिम से जुड़ा कोई भी काम करने से पहले, यह देख लें कि आपके डिवाइस पर ई-सिम काम करता है या नहीं. आम तौर पर, EuiccManager#isEnabled() true दिखाता है. ऐसा तब होता है, जब android.hardware.telephony.euicc सुविधा तय की गई हो और एलपीए पैकेज मौजूद हो.

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

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

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

downloadSubscription() और switchToSubscription() जैसे कई एपीआई, PendingIntent कॉलबैक का इस्तेमाल करते हैं, क्योंकि उन्हें पूरा होने में कुछ सेकंड या मिनट लग सकते हैं. PendingIntent को EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_ स्पेस में नतीजे के कोड के साथ भेजा जाता है. यह फ़्रेमवर्क के हिसाब से तय किए गए गड़बड़ी के कोड के साथ-साथ, एलपीए से 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).setPackage(context.getPackageName());
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
mgr.downloadSubscription(sub, true /* switchAfterDownload */,
        callbackIntent);

AndroidManifest.xml में अनुमति तय करें और उसका इस्तेमाल करें:

    <permission android:protectionLevel="signature" android:name="com.your.company.lpa.permission.BROADCAST" />
    <uses-permission android:name="com.your.company.lpa.permission.BROADCAST"/>

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

// 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).setPackage(context.getPackageName());
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
mgr.switchToSubscription(1 /* subscriptionId */, callbackIntent);

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

ऐसी गड़बड़ियां जिन्हें ठीक किया जा सकता है

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

ऐसे मामलों में, कॉलर के कॉलबैक को EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR की मदद से कॉल किया जाता है. कॉलबैक Intent में इंटरनल एक्सट्रा शामिल होते हैं, ताकि कॉलर इसे EuiccManager#startResolutionActivity को पास कर सके. इसके बाद, एलयूआई के ज़रिए समस्या हल करने का अनुरोध किया जा सकता है. उदाहरण के लिए, पुष्टि करने के लिए फिर से कोड का इस्तेमाल करने पर, EuiccManager#startResolutionActivity एक एलयूआई स्क्रीन को ट्रिगर करता है. इस स्क्रीन पर, उपयोगकर्ता को पुष्टि करने के लिए कोड डालने की सुविधा मिलती है. कोड डालने के बाद, डाउनलोड की प्रोसेस फिर से शुरू हो जाती है. इस तरीके से, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन को यूज़र इंटरफ़ेस (यूआई) दिखाने का पूरा कंट्रोल मिलता है. साथ ही, एलपीए/एलयूआई को आने वाले समय में, उपयोगकर्ता की ओर से ठीक की जा सकने वाली समस्याओं को नए तरीके से हैंडल करने का तरीका भी मिलता है. इसके लिए, क्लाइंट ऐप्लिकेशन में बदलाव करने की ज़रूरत नहीं होती.

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 को किसी डिवाइस पर प्रोफ़ाइल डाउनलोड करने के लिए कॉल करते हैं, तो आपकी प्रोफ़ाइल के मेटाडेटा में, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के खास नियम शामिल होने चाहिए. ऐसा इसलिए है, क्योंकि किसी डिवाइस के eUICC में, अलग-अलग कैरियर की सदस्यता प्रोफ़ाइलें एक साथ मौजूद हो सकती हैं. साथ ही, हर कैरियर ऐप्लिकेशन को सिर्फ़ उस कैरियर की प्रोफ़ाइलों को ऐक्सेस करने की अनुमति होनी चाहिए. उदाहरण के लिए, कैरियर A को ऐसी प्रोफ़ाइल को डाउनलोड करने, चालू या बंद करने की अनुमति नहीं होनी चाहिए जिसका मालिकाना हक कैरियर B के पास हो.

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

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

    1. कैरियर ऐप्लिकेशन के सार्वजनिक पासकोड सर्टिफ़िकेट का सिग्नेचर (SHA-1 या SHA-256) (ज़रूरी है)
    2. मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन का पैकेज नाम (हमारा सुझाव है कि)
  3. मोबाइल और इंटरनेट सेवा देने वाली कंपनी का ऐप्लिकेशन, EuiccManager एपीआई की मदद से eUICC कार्रवाई करने की कोशिश करता है.

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

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

प्रोफ़ाइल का मेटाडेटा, प्रोफ़ाइल के बाहर भी उपलब्ध हो सकता है. इससे, एलपीए प्रोफ़ाइल के डाउनलोड होने से पहले ही, 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
    }
}

ऐप्लिकेशन साइन करने के बारे में ज़्यादा जानने के लिए, अपने ऐप्लिकेशन को साइन करें लेख पढ़ें. मोबाइल और इंटरनेट सेवा देने वाली कंपनी के लिए उपलब्ध खास सुविधाओं के बारे में जानने के लिए, यूआईसीसी के लिए मोबाइल और इंटरनेट सेवा देने वाली कंपनी के लिए उपलब्ध खास सुविधाएं लेख पढ़ें.

लोकल प्रोफ़ाइल असिस्टेंट ऐप्लिकेशन बनाना

डिवाइस बनाने वाली कंपनियां, अपनी लोकल प्रोफ़ाइल असिस्टेंट (एलपीए) को लागू कर सकती हैं. इसे Android Euicc APIs से जोड़ना ज़रूरी है. नीचे दिए गए सेक्शन, एलपीए ऐप्लिकेशन बनाने और उसे Android सिस्टम के साथ इंटिग्रेट करने के बारे में खास जानकारी देते हैं.

हार्डवेयर/मोडेम से जुड़ी ज़रूरी शर्तें

eUICC चिप पर मौजूद एलपीए और ई-सिम ओएस, कम से कम GSMA आरएसपी (रिमोट सिम प्रोविज़निंग) v2.0 या v2.2 के साथ काम करना चाहिए. आपको SM-DP+ और SM-DS ऐसेर्वर का भी इस्तेमाल करना चाहिए जिनका आरएसपी वर्शन मेल खाता हो. आरएसपी के आर्किटेक्चर के बारे में ज़्यादा जानने के लिए, GSMA SGP.21 आरएसपी आर्किटेक्चर स्पेसिफ़िकेशन देखें.

इसके अलावा, Android 9 में eUICC API के साथ इंटिग्रेट करने के लिए, डिवाइस के मॉडेम को eUICC की सुविधाओं को कोड में बदलकर (लोकल प्रोफ़ाइल मैनेजमेंट और प्रोफ़ाइल डाउनलोड) भेजना चाहिए. इसके लिए, इन तरीकों को भी लागू करना ज़रूरी है:

  • IRadio HAL v1.1: setSimPower
  • IRadio HAL v1.2: getIccCardStatus

  • IRadioConfig HAL v1.0: getSimSlotsStatus

  • IRadioConfig AIDL v1.0: getAllowedCarriers

    Google एलपीए को मोबाइल और इंटरनेट सेवा देने वाली कंपनी के लॉक का स्टेटस पता होना चाहिए, ताकि वह सिर्फ़ अनुमति वाली मोबाइल और इंटरनेट सेवा देने वाली कंपनी के लिए ई-सिम डाउनलोड करने या ट्रांसफ़र करने की अनुमति दे सके. ऐसा न करने पर, हो सकता है कि उपयोगकर्ता सिम डाउनलोड करके उसे ट्रांसफ़र कर दें और बाद में उन्हें पता चले कि डिवाइस किसी दूसरी मोबाइल और इंटरनेट सेवा देने वाली कंपनी के लिए लॉक है.

    • वेंडर या OEM को IRadioSim.getAllowedCarriers()HAL API लागू करना होगा.

    • वेंडर आरआईएल / मॉडम, IRadioSimResponse.getAllowedCarriersResponse()HAL API के हिस्से के तौर पर, उस मोबाइल और इंटरनेट सेवा देने वाली कंपनी के लॉक स्टेटस और कैरियर आईडी को पॉप्युलेट करेगा जिस पर डिवाइस लॉक है.

डिफ़ॉल्ट बूट प्रोफ़ाइल चालू होने पर, मॉडेम को मान्य सिम के तौर पर ई-सिम की पहचान करनी चाहिए और सिम की पावर चालू रखनी चाहिए.

Android 10 वर्शन वाले डिवाइसों के लिए, ऐसा eUICC स्लॉट आईडी कलेक्शन तय करना ज़रूरी है जिसे हटाया नहीं जा सकता. उदाहरण के लिए, 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

एलपीए में दो अलग-अलग कॉम्पोनेंट होते हैं. ये दोनों एक ही APK में लागू किए जा सकते हैं: एलपीए बैकएंड और एलपीए यूज़र इंटरफ़ेस (यूआई) या एलयूआई.

एलपीए बैकएंड लागू करने के लिए, आपको 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>

Android फ़्रेमवर्क, अंदरूनी तौर पर चालू एलपीए का पता लगाता है और Android eUICC API के साथ ज़रूरत के हिसाब से इंटरैक्ट करता है. PackageManager से android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS अनुमति वाले सभी ऐप्लिकेशन के लिए क्वेरी की जाती है. इससे android.service.euicc.EuiccService कार्रवाई के लिए सेवा के बारे में पता चलता है. सबसे ज़्यादा प्राथमिकता वाली सेवा चुनी जाती है. अगर कोई सेवा नहीं मिलती है, तो एलपीए के लिए सहायता बंद हो जाती है.

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

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

इसका मतलब है कि इन स्क्रीन को लागू करने वाला यूज़र इंटरफ़ेस (यूआई), EuiccService को लागू करने वाले यूज़र इंटरफ़ेस (यूआई) से अलग APK से आ सकता है. डिज़ाइन के हिसाब से यह तय किया जा सकता है कि एक APK हो या एक से ज़्यादा APK. उदाहरण के लिए, एक ऐसा APK जो EuiccService लागू करता हो और एक ऐसा APK जो LUI ऐक्टिविटी उपलब्ध कराता हो.

EuiccCardManager

EuiccCardManager, eSIM चिप के साथ इंटरैक्ट करने के लिए इंटरफ़ेस है. यह एएसएन.1 पार्सिंग के साथ-साथ, कम-लेवल एपीडीयू अनुरोध/जवाब वाले निर्देशों को मैनेज करता है. साथ ही, यह जीएसएमए आरएसपी स्पेसिफ़िकेशन में बताए गए ES10 फ़ंक्शन भी उपलब्ध कराता है. EuiccCardManager एक सिस्टम एपीआई है और इसे सिर्फ़ सिस्टम के ऐक्सेस वाले ऐप्लिकेशन कॉल कर सकते हैं.

कैरियर के ऐप्लिकेशन, एलपीए, और Euicc एपीआई

दूसरी इमेज. मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन और एलपीए, दोनों में Euicc एपीआई इस्तेमाल किए जाते हैं

EuiccCardManager के ज़रिए प्रोफ़ाइल ऑपरेशन एपीआई के लिए, कॉलर को एलपीए होना ज़रूरी है. यह Android फ़्रेमवर्क से लागू होता है. इसका मतलब है कि कॉल करने वाले (कॉलर) को EuiccService की समयसीमा बढ़ानी होगी और इसका एलान आपकी मेनिफ़ेस्ट फ़ाइल में करना होगा. इसके बारे में पिछले सेक्शन में बताया गया है.

EuiccManager की तरह ही, EuiccCardManager एपीआई का इस्तेमाल करने के लिए, आपके एलपीए को पहले Context#getSystemService के ज़रिए EuiccCardManager का इंस्टेंस पाना होगा:

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

इसके बाद, eUICC पर सभी प्रोफ़ाइलें पाने के लिए:

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 किसी एआईडीएल इंटरफ़ेस के ज़रिए EuiccCardController (जो फ़ोन प्रोसेस में चलता है) से बंधा होता है. साथ ही, हर EuiccCardManager तरीके को फ़ोन प्रोसेस से, किसी अलग और खास एआईडीएल इंटरफ़ेस के ज़रिए कॉलबैक मिलता है. EuiccCardManager एपीआई का इस्तेमाल करते समय, कॉलर (एलपीए) को एक Executor ऑब्जेक्ट देना होगा, ताकि कॉलबैक शुरू किया जा सके. यह Executor ऑब्जेक्ट, किसी एक थ्रेड या आपकी पसंद के थ्रेड पूल पर चल सकता है.

ज़्यादातर EuiccCardManager एपीआई का इस्तेमाल करने का पैटर्न एक जैसा होता है. उदाहरण के लिए, eUICC पर बाउंड प्रोफ़ाइल पैकेज लोड करने के लिए:

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

किसी दिए गए आईसीसीआईडी वाली किसी दूसरी प्रोफ़ाइल पर स्विच करने के लिए:

...
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);

मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन की मदद से, ई-सिम प्रोफ़ाइल चालू करना

Android 9 या इसके बाद के वर्शन वाले डिवाइसों पर, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन का इस्तेमाल करके, ई-सिम को चालू किया जा सकता है और प्रोफ़ाइलें डाउनलोड की जा सकती हैं. कैरियर ऐप्लिकेशन, downloadSubscription को सीधे कॉल करके या एलपीए को चालू करने का कोड देकर, प्रोफ़ाइलें डाउनलोड कर सकता है.

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

नीचे दिए गए सेक्शन में, ऐक्टिवेशन कोड का इस्तेमाल करके, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन से ई-सिम को चालू करने का तरीका बताया गया है.

ऐक्टिवेशन कोड का इस्तेमाल करके, ई-सिम को चालू करें

ई-सिम प्रोफ़ाइल को चालू करने के लिए ऐक्टिवेशन कोड का इस्तेमाल करने पर, एलपीए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन से ऐक्टिवेशन कोड फ़ेच करता है और प्रोफ़ाइल डाउनलोड करता है. इस फ़्लो को एलपीए शुरू कर सकता है और एलपीए पूरे यूज़र इंटरफ़ेस (यूआई) फ़्लो को कंट्रोल कर सकता है. इसका मतलब है कि मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) नहीं दिखाया जाता. इस तरीके से, BF76 टैग की जांच से बचा जा सकता है. इसके बाद, नेटवर्क ऑपरेटर को ई-सिम को चालू करने के यूज़र इंटरफ़ेस (यूआई) के पूरे फ़्लो को लागू करने की ज़रूरत नहीं होती. इसमें ई-सिम प्रोफ़ाइल डाउनलोड करना और गड़बड़ियों को ठीक करना भी शामिल है.

मोबाइल और इंटरनेट सेवा देने वाली कंपनी की eUICC प्रोविज़निंग सेवा तय करना

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

AIDL इंटरफ़ेस तय करने के लिए, एलपीए और कैरियर ऐप्लिकेशन, दोनों के लिए ये AIDL फ़ाइलें बनाएं.

  • 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 को लागू करने के लिए, एलपीए को ICarrierEuiccProvisioningService.aidl और IGetActivationCodeCallback.aidl, दोनों को आपके प्रोजेक्ट में कॉपी करके ServiceConnection लागू करना होगा.

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

कैरियर ऐप्लिकेशन के ICarrierEuiccProvisioningService लागू करने के लिए बाइंड करने के बाद, एलपीए getActivationCode या getActivationCodeForEid को कॉल करता है. इससे, कैरियर ऐप्लिकेशन से ऐक्टिवेशन कोड पाने के लिए, IGetActivationCodeCallback स्टब क्लास को लागू किया जाता है.

getActivationCode और getActivationCodeForEid के बीच का अंतर यह है कि getActivationCodeForEid, मोबाइल और इंटरनेट सेवा देने वाली कंपनी को, डाउनलोड की प्रोसेस शुरू होने से पहले ही डिवाइस के ईआईडी से प्रोफ़ाइल को बाइंड करने की अनुमति देता है.

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
    }
}

मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन के लिए, लागू करने का उदाहरण

एलपीए को कैरियर ऐप्लिकेशन से जोड़ने के लिए, कैरियर ऐप्लिकेशन को आपके प्रोजेक्ट में ICarrierEuiccProvisioningService.aidl और IGetActivationCodeCallback.aidl, दोनों को कॉपी करना होगा. साथ ही, AndroidManifest.xml फ़ाइल में ICarrierEuiccProvisioningService सेवा का एलान करना होगा. इस सेवा को android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS के सिस्टम की अनुमति की ज़रूरत इसलिए होनी चाहिए, ताकि यह पक्का किया जा सके कि सिर्फ़ सिस्टम के अधिकार वाला ऐप्लिकेशन एलपीए ही इससे जुड़ सके. सेवा में, 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>
    

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

एलपीए में मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) शुरू करने की प्रोसेस यहां दी गई है:

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

  3. मोबाइल या इंटरनेट सेवा देने वाली कंपनी का ऐप्लिकेशन, setResult(int, Intent) और finish() को कॉल करके एलपीए को जवाब देता है.

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

    सुरक्षा की वजहों से, एलपीए को नतीजे के इंटेंट में दिए गए ऐक्टिवेशन कोड को सीधे तौर पर स्वीकार नहीं करना चाहिए. इससे यह पक्का किया जा सकता है कि एलपीए से बाहर के कॉलर को मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन से ऐक्टिवेशन कोड न मिल सके.

मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन में, एलपीए चालू करने की प्रक्रिया लॉन्च करना

Android 11 से, कैरियर ऐप्लिकेशन, eSIM चालू करने के लिए एलयूआई शुरू करने के लिए, eUICC API का इस्तेमाल कर सकते हैं. इस तरीके से, ई-सिम प्रोफ़ाइल को चालू करने के लिए, एलपीए के ई-सिम ऐक्टिवेशन फ़्लो के यूज़र इंटरफ़ेस (यूआई) को दिखाया जाता है. इसके बाद, ई-सिम प्रोफ़ाइल चालू होने पर एलपीए एक ब्रॉडकास्ट भेजता है.

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

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

  4. एलपीए की ओर से, एलपीए मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन के ICarrierEuiccProvisioningService लागू करने के लिए बाइंड होता है, ताकि ऐक्टिवेशन कोड फ़ेच किया जा सके और उससे जुड़ी प्रोफ़ाइल डाउनलोड की जा सके. एलपीए, डाउनलोड के दौरान ज़रूरी यूज़र इंटरफ़ेस (यूआई) एलिमेंट दिखाता है. जैसे, लोडिंग स्क्रीन.

  5. एलपीए चालू होने के बाद, एलपीए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन के लिए नतीजे के कोड के साथ जवाब देता है. इस कोड को मोबाइल और इंटरनेट सेवा देने वाली कंपनी, onActivityResult(int, int, Intent) में मैनेज करती है.

    1. अगर एलपीए नई ई-सिम प्रोफ़ाइल डाउनलोड हो जाता है, तो वह RESULT_OK को जवाब देता है.
    2. अगर उपयोगकर्ता एलपीए में ई-सिम प्रोफ़ाइल के ऐक्टिवेशन को रद्द करता है, तो RESULT_CANCELED के साथ जवाब दिया जाता है.
    3. अगर एलपीए, RESULT_OK या RESULT_CANCELED के अलावा किसी और वैल्यू के साथ जवाब देता है, तो कैरियर ऐप्लिकेशन इसे गड़बड़ी के तौर पर लेता है.

    सुरक्षा से जुड़ी वजहों से, एलपीए सीधे तौर पर दिए गए इंटेंट में ऐक्टिवेशन कोड स्वीकार नहीं करता. इससे यह पक्का होता है कि एलपीए के अलावा अन्य कॉलर, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन से ऐक्टिवेशन कोड न पा सकें.

एक से ज़्यादा ई-सिम का इस्तेमाल करने की सुविधा

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

ज़रूरी शर्तें

एक से ज़्यादा ई-सिम का इस्तेमाल करने के लिए, डिवाइस में एक से ज़्यादा ईयूआईसीसी होने चाहिए. ये ईयूआईसीसी, डिवाइस में पहले से मौजूद हो सकते हैं या फिर सिम कार्ड स्लॉट में डाले जा सकने वाले ईयूआईसीसी हो सकते हैं.

एक से ज़्यादा ई-सिम का इस्तेमाल करने के लिए, Radio HAL का वर्शन 1.2 या इसके बाद का वर्शन होना ज़रूरी है. हमारा सुझाव है कि Radio HAL के वर्शन 1.4 और RadioConfig HAL के वर्शन 1.2 का इस्तेमाल करें.

लागू करना

एक से ज़्यादा ई-सिम (इनमें हटाए जा सकने वाले ईयूआईसीसी या प्रोग्राम किए जा सकने वाले सिम शामिल हैं) के साथ काम करने के लिए, एलपीए को EuiccService लागू करना होगा. इससे, कॉल करने वाले व्यक्ति के दिए गए कार्ड आईडी से जुड़ा स्लॉट आईडी मिलता है.

arrays.xml में बताया गया non_removable_euicc_slots संसाधन, पूर्णांकों का एक कलेक्शन है. यह डिवाइस में पहले से मौजूद eUICC के स्लॉट आईडी दिखाता है. आपको इस संसाधन के बारे में बताना होगा, ताकि प्लैटफ़ॉर्म को यह तय करने में मदद मिल सके कि शामिल किया गया eUICC हटाया जा सकता है या नहीं.

एक से ज़्यादा ई-सिम वाले डिवाइस के लिए, मोबाइल नेटवर्क सेवा देने वाली कंपनी का ऐप्लिकेशन

एक से ज़्यादा ई-सिम वाले डिवाइस के लिए मोबाइल और इंटरनेट सेवा देने वाली कंपनी का ऐप्लिकेशन बनाते समय, EuiccManager में createForCardId के तरीके का इस्तेमाल करके, EuiccManager ऑब्जेक्ट बनाएं. यह ऑब्जेक्ट, किसी दिए गए कार्ड आईडी से पिन किया गया होना चाहिए. कार्ड आईडी एक पूर्णांक वैल्यू है, जो डिवाइस पर मौजूद UICC या eUICC की पहचान करता है.

डिवाइस के डिफ़ॉल्ट ईयूआईसीसी का कार्ड आईडी पाने के लिए, TelephonyManager में getCardIdForDefaultEuicc तरीका इस्तेमाल करें. अगर रेडियो एचएएल का वर्शन 1.2 से कम है, तो यह तरीका UNSUPPORTED_CARD_ID दिखाता है. अगर डिवाइस ने eUICC को नहीं पढ़ा है, तो यह तरीका UNINITIALIZED_CARD_ID दिखाता है.

TelephonyManager में getUiccCardsInfo और getUiccSlotsInfo (सिस्टम एपीआई) और SubscriptionInfo में getCardId से भी कार्ड आईडी पाए जा सकते हैं.

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

कैरियर ऐप्लिकेशन बनाने के लिए, यहां दिए गए कोड सैंपल का इस्तेमाल किया जा सकता है.

पहला उदाहरण: चालू सदस्यता पाना और 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);

दूसरा उदाहरण: यूआईसीसी के ज़रिए बार-बार दोहराएं और हटाया जा सकने वाले 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 में एलपीए लागू नहीं होता. साथ ही, यह ज़रूरी नहीं है कि आपके पास सभी Android बिल्ड पर एलपीए उपलब्ध हो. ऐसा इसलिए है, क्योंकि हर फ़ोन पर ई-सिम काम नहीं करता. इस वजह से, एंड-टू-एंड सीटीएस टेस्ट के लिए कोई केस उपलब्ध नहीं है. हालांकि, AOSP में बुनियादी टेस्ट केस उपलब्ध हैं. इससे यह पक्का किया जा सकता है कि एक्सपोज़ किए गए eUICC API, Android बिल्ड में मान्य हैं.

आपको यह पक्का करना चाहिए कि बिल्ड, इन सीटीएस टेस्ट केस (सार्वजनिक एपीआई के लिए) में पास हों: /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts.

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

अगर आपको खुद एलपीए बनाना है, तो आपको ज़्यादा सख्त जांच से गुज़रना होगा. समस्याओं को हल करने और आरएसपी आर्किटेक्चर में एलपीए के इंटरऑपरेबिलिटी (दूसरे सिस्टम के साथ काम करना) को पक्का करने के लिए, आपको मॉडम वेंडर, eUICC चिप या ई-सिम ओएस वेंडर, SM-DP+ वेंडर, और मोबाइल और इंटरनेट सेवा देने वाली कंपनियों की मदद लेनी चाहिए. बड़ी संख्या में मैन्युअल तौर पर जांच करना ज़रूरी है. टेस्ट के सबसे अच्छे कवरेज के लिए, आपको GSMA SGP.23 RSP टेस्ट प्लान को फ़ॉलो करना चाहिए.