ई-सिम लागू करना

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

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

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

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

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

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

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

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

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

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

EuiccManager

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

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

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 API देखें.

ठीक की जा सकने वाली गड़बड़ियां

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

ऐसे मामलों में, कॉल करने वाले व्यक्ति को वापस कॉल करने के लिए, EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR का इस्तेमाल किया जाता है. कॉल बैक Intent में इंटरनल एक्स्ट्रा शामिल होते हैं, ताकि कॉल करने वाला व्यक्ति इसे EuiccManager#startResolutionActivity को पास कर सके. इससे LUI के ज़रिए समस्या हल करने का अनुरोध किया जा सकता है. उदाहरण के लिए, पुष्टि करने के लिए भेजे गए कोड का फिर से इस्तेमाल करने पर, 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 प्लैटफ़ॉर्म, प्रोफ़ाइल के ऐक्सेस के नियम वाली फ़ाइल (एआरएफ़) में सेव किए गए सर्टिफ़िकेट लोड करता है. साथ ही, इन सर्टिफ़िकेट से साइन किए गए ऐप्लिकेशन को EuiccManager एपीआई को कॉल करने की अनुमति देता है. इस प्रोसेस के बारे में यहां खास जानकारी दी गई है:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

EuiccCardManager

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

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

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

प्रोफ़ाइल ऑपरेशन एपीआई के लिए, 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 एपीआई का इस्तेमाल एक ही तरीके से किया जाता है. उदाहरण के लिए, ईयूआईसीसी पर बाउंड प्रोफ़ाइल पैकेज लोड करने के लिए:

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

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

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

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

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

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

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

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

एलपीए और मोबाइल और इंटरनेट सेवा देने वाली कंपनी का ऐप्लिकेशन, दो AIDL इंटरफ़ेस के ज़रिए कम्यूनिकेट करते हैं: ICarrierEuiccProvisioningService और IGetActivationCodeCallback. कैरियर ऐप्लिकेशन को ICarrierEuiccProvisioningService इंटरफ़ेस लागू करना होगा और इसे मेनिफ़ेस्ट एलान में दिखाना होगा. एलपीए को 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 को लागू करने के लिए, एलपीए को 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 इंस्टेंस होता है. इस इंस्टेंस में, बूलियन एक्स्ट्रा android.telephony.euicc.extra.USE_QR_SCANNER को true पर सेट किया जाता है. इसके बाद, एलपीए अतिरिक्त जानकारी की जांच करता है. साथ ही, मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन के ICarrierEuiccProvisioningService को बाइंड करने के बजाय, क्यूआर स्कैनर लॉन्च करता है.
    2. अगर मोबाइल और इंटरनेट सेवा देने वाली कंपनी का ऐप्लिकेशन क्रैश हो जाता है या RESULT_CANCELED (यह डिफ़ॉल्ट जवाब कोड है) के साथ जवाब देता है, तो एलपीए, eSIM को चालू करने की प्रोसेस को रद्द कर देता है.
    3. अगर कैरियर ऐप्लिकेशन, RESULT_OK या RESULT_CANCELED के अलावा कोई और जवाब देता है, तो एलपीए इसे गड़बड़ी मानता है.

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

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

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

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

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

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

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

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

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

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

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

एक से ज़्यादा ई-सिम इस्तेमाल करने के लिए, डिवाइस में एक से ज़्यादा eUICC होने चाहिए. ये बिल्ट-इन eUICC या सिम कार्ड के ऐसे स्लॉट हो सकते हैं जिनमें हटाए जा सकने वाले eUICC डाले जा सकते हैं.

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

लागू करना

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

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

एक से ज़्यादा ई-सिम वाले डिवाइस के लिए कैरियर ऐप्लिकेशन

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

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

कार्ड आईडी, TelephonyManager में getUiccCardsInfo और getUiccSlotsInfo (सिस्टम एपीआई) से भी पाए जा सकते हैं. साथ ही, 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);

दूसरा उदाहरण: यूआईसीसी के ज़रिए दोहराएं और हटाने लायक ईयूआईसीसी के लिए 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);
}

Validation

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

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

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

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