eUICC एपीआई

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

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

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

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

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

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

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

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

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

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

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

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

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

API

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

इंस्टेंस पाएं (सार्वजनिक)

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 (सार्वजनिक)

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

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

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

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

कॉल करने वाले के पास 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 सूची वाली वैल्यू देनी होगी. इससे यह तय किया जा सकेगा कि सभी टेस्ट, ऑपरेशनल या दोनों तरह की सदस्यताओं को मिटाना है या नहीं. कॉल करने वाले के पास 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);

स्थिरांक

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