eUICC API

Android 9 में, प्रोफ़ाइल मैनेजमेंट एपीआई (सार्वजनिक और @SystemApi) क्लास EuiccManager के ज़रिए उपलब्ध हैं. eUICC कम्यूनिकेशन एपीआई (@SystemApi only) EuiccCardManager क्लास के ज़रिए उपलब्ध हैं.

eUICC के बारे में जानकारी

मोबाइल और इंटरनेट सेवा देने वाली कंपनियां, EuiccManager का इस्तेमाल करके कैरियर ऐप्लिकेशन बना सकती हैं. इससे वे प्रोफ़ाइलें मैनेज कर सकती हैं. इसके बारे में पहली इमेज में दिखाया गया है. कैरियर ऐप्लिकेशन का सिस्टम ऐप्लिकेशन होना ज़रूरी नहीं है. हालांकि, इनके पास eUICC प्रोफ़ाइल से मिले कैरियर के विशेषाधिकार होने चाहिए. @SystemApi को कॉल करने के लिए, एलपीए ऐप्लिकेशन (एलयूआई और एलपीए बैकएंड) को सिस्टम ऐप्लिकेशन होना चाहिए. इसका मतलब है कि इसे सिस्टम इमेज में शामिल किया जाना चाहिए.

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

पहली इमेज. मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन और ओईएम एलपीए की सुविधा वाले Android फ़ोन

EuiccCardManager को कॉल करने और eUICC से बातचीत करने के लॉजिक के अलावा, LPA ऐप्लिकेशन को ये काम करने होंगे:

  • SM-DP+ क्लाइंट, SM-DP+ सर्वर से पुष्टि करने और प्रोफ़ाइलें डाउनलोड करने के लिए कम्यूनिकेट करता है
  • [ज़रूरी नहीं] SM-DS, ताकि डाउनलोड की जा सकने वाली ज़्यादा प्रोफ़ाइलें मिल सकें
  • प्रोफ़ाइल की स्थिति को अपडेट करने के लिए, सर्वर को सूचनाएं भेजने के लिए सूचनाएं मैनेज करना
  • [ज़रूरी नहीं] सिम स्लॉट मैनेज करने की सुविधा. इसमें ई-सिम और फ़िज़िकल सिम के लॉजिक के बीच स्विच करने की सुविधा भी शामिल है. अगर फ़ोन में सिर्फ़ eSIM चिप है, तो यह जानकारी देना ज़रूरी नहीं है.
  • eSIM OTA

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

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

एलपीए एपीआई, EuiccManager (package android.telephony.euicc में) के ज़रिए सार्वजनिक तौर पर उपलब्ध हैं. कैरियर ऐप्लिकेशन, EuiccManager का इंस्टेंस पा सकता है. साथ ही, EuiccManager में मौजूद तरीकों को कॉल करके, eUICC की जानकारी पा सकता है. इसके अलावा, SubscriptionInfo इंस्टेंस के तौर पर, सदस्यताएं (GSMA RSP दस्तावेज़ों में इन्हें प्रोफ़ाइलें कहा जाता है) मैनेज कर सकता है.

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

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

एक से ज़्यादा चालू की गई प्रोफ़ाइलों के एपीआई के बारे में जानकारी पाने के लिए, एक से ज़्यादा चालू की गई प्रोफ़ाइलें लेख पढ़ें.

API

नीचे दिए गए एपीआई, EuiccManager रेफ़रंस दस्तावेज़ और EuiccManager.java में देखे जा सकते हैं.

Get instance (public)

Context#getSystemService के ज़रिए EuiccManager का इंस्टेंस मिलता है. ज़्यादा जानकारी के लिए, getSystemService देखें.

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

चालू की गई (सार्वजनिक)

यह कुकी, इस बात की जांच करती है कि एम्बेड की गई सदस्यता चालू है या नहीं. एलपीए एपीआई ऐक्सेस करने से पहले, इसकी जांच कर लेनी चाहिए. ज़्यादा जानकारी के लिए, isEnabled देखें.

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

ईआईडी (सार्वजनिक) पाना

यह eUICC हार्डवेयर की पहचान करने वाला ईआईडी हासिल करता है. अगर eUICC तैयार नहीं है, तो यह शून्य हो सकता है. कॉल करने वाले के पास, कैरियर के तौर पर काम करने का अधिकार होना चाहिए या READ_PRIVILEGED_PHONE_STATE की अनुमति होनी चाहिए. ज़्यादा जानकारी के लिए, getEid देखें.

String eid = mgr.getEid();
if (eid == null) {
  // Handle null case.
}

Get EuiccInfo (public)

eUICC के बारे में जानकारी मिलती है. इसमें ओएस का वर्शन होता है. ज़्यादा जानकारी के लिए, getEuiccInfo देखें.

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

सदस्यता (सार्वजनिक) डाउनलोड करें

यह दी गई सदस्यता को डाउनलोड करता है. GSMA RSP दस्तावेज़ों में इसे "प्रोफ़ाइल" कहा जाता है. सदस्यता, ऐक्टिवेशन कोड से बनाई जा सकती है. उदाहरण के लिए, क्यूआर कोड से ऐक्टिवेशन कोड को पार्स किया जा सकता है. सदस्यता डाउनलोड करना, एसिंक्रोनस ऑपरेशन है.

कॉल करने वाले के पास, टारगेट की गई सदस्यता के लिए WRITE_EMBEDDED_SUBSCRIPTIONS की अनुमति होनी चाहिए या उसके पास कैरियर के खास अधिकार होने चाहिए. ज़्यादा जानकारी के लिए, downloadSubscription देखें.

// Register receiver.
String action = "download_subscription";
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),
        "example.broadcast.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);
mgr.downloadSubscription(sub, true /* switchAfterDownload */, callbackIntent);

सदस्यता स्विच करें (सार्वजनिक)

यह कुकी, दी गई सदस्यता पर स्विच करती है (चालू करती है). कॉल करने वाले व्यक्ति के पास, WRITE_EMBEDDED_SUBSCRIPTIONS की सदस्यता होनी चाहिए या उसके पास, चालू सदस्यता और टारगेट सदस्यता के लिए कैरियर के विशेषाधिकार होने चाहिए. ज़्यादा जानकारी के लिए, switchToSubscription देखें.

// Register receiver.
String action = "switch_to_subscription";
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),
        "example.broadcast.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);
mgr.switchToSubscription(1 /* subscriptionId */, callbackIntent);

पोर्ट (सार्वजनिक) करके सदस्यता बदलना

(Android 13 और इसके बाद के वर्शन पर उपलब्ध) इससे, पोर्ट इंडेक्स के साथ दी गई सदस्यता पर स्विच किया जाता है (चालू किया जाता है). कॉल करने वाले व्यक्ति के पास, चालू की गई मौजूदा सदस्यता और टारगेट सदस्यता के लिए, WRITE_EMBEDDED_SUBSCRIPTIONS या कैरियर के विशेषाधिकार होने चाहिए. ज़्यादा जानकारी के लिए, switchToSubscription देखें.

// Register receiver.
String action = "switch_to_subscription";
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),
        "example.broadcast.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);
mgr.switchToSubscription(1 /* subscriptionId */, 0 /*portIndex*/, callbackIntent);

क्या सिम पोर्ट करने की सुविधा उपलब्ध है (सार्वजनिक)

public boolean isSimPortAvailable(int portIndex)

(Android 13 और इसके बाद के वर्शन पर उपलब्ध) इससे यह पता चलता है कि पासिंग पोर्ट इंडेक्स उपलब्ध है या नहीं. किसी पोर्ट का इस्तेमाल तब किया जा सकता है, जब उस पर कोई सदस्यता चालू न हो या कॉल करने वाले ऐप्लिकेशन के पास, चुने गए पोर्ट पर इंस्टॉल की गई सदस्यता के लिए कैरियर के विशेषाधिकार हों. ज़्यादा जानकारी के लिए, isSimPortAvailable देखें.

सदस्यता मिटाएं (सार्वजनिक)

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

// Register receiver.
String action = "delete_subscription";
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),
        "example.broadcast.permission" /* broadcastPermission*/,
        null /* handler */);

// Delete a subscription asynchronously.
Intent intent = new Intent(action);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.deleteSubscription(1 /* subscriptionId */, callbackIntent);

सभी सदस्यताएं मिटाएं (सिस्टम एपीआई)

यह कुकी, किसी डिवाइस पर मौजूद सभी सदस्यताओं को मिटा देती है. Android 11 से, आपको EuiccCardManager#ResetOption enum वैल्यू देनी होगी. इससे यह तय किया जा सकेगा कि टेस्ट, ऑपरेशनल या दोनों तरह की सदस्यताएं मिटानी हैं या नहीं. कॉल करने वाले व्यक्ति के पास WRITE_EMBEDDED_SUBSCRIPTIONS की अनुमति होनी चाहिए.

// Register receiver.
String action = "delete_subscription";
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),
        "example.broadcast.permission" /* broadcastPermission*/,
        null /* handler */);

// Erase all operational subscriptions asynchronously.
Intent intent = new Intent(action);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.eraseSubscriptions(
        EuiccCardManager.RESET_OPTION_DELETE_OPERATIONAL_PROFILES, callbackIntent);

समस्या हल करने की गतिविधि शुरू करें (सार्वजनिक)

यह कुकी, उपयोगकर्ता की ओर से ठीक की जा सकने वाली गड़बड़ी को ठीक करने के लिए गतिविधि शुरू करती है. अगर किसी ऑपरेशन से EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR मिलता है, तो इस तरीके को कॉल किया जा सकता है, ताकि उपयोगकर्ता को समस्या हल करने के लिए कहा जा सके. इस तरीके को किसी गड़बड़ी के लिए सिर्फ़ एक बार कॉल किया जा सकता है.

...
mgr.startResolutionActivity(getActivity(), 0 /* requestCode */, resultIntent, callbackIntent);

कॉन्स्टेंट

public में मौजूद public कॉन्स्टेंट की सूची देखने के लिए, कॉन्सटेंट देखें.EuiccManager