ईयूआईसीसी एपीआई

एंड्रॉइड 9 में, प्रोफ़ाइल प्रबंधन एपीआई (सार्वजनिक और @SystemApi) क्लास EuiccManager के माध्यम से उपलब्ध हैं। eUICC संचार एपीआई (@SystemApi केवल) वर्ग EuiccCardManager के माध्यम से उपलब्ध हैं।

ईयूआईसीसी के बारे में

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

कैरियर ऐप और ओईएम एलपीए के साथ एंड्रॉइड फोन

चित्र 1. कैरियर ऐप और ओईएम एलपीए वाले एंड्रॉइड फोन

EuiccCardManager कॉल करने और eUICC से बात करने के तर्क के अलावा, LPA ऐप्स को निम्नलिखित को लागू करना होगा:

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

हालाँकि एंड्रॉइड फोन में एक से अधिक एलपीए ऐप मौजूद हो सकते हैं, प्रत्येक ऐप की AndroidManifest.xml फ़ाइल में परिभाषित प्राथमिकता के आधार पर केवल एक एलपीए को वास्तविक कार्यशील एलपीए के रूप में चुना जा सकता है।

EuiccManager का उपयोग करना

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

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

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

एकाधिक सक्षम प्रोफ़ाइल 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 हार्डवेयर की पहचान करने वाली EID प्राप्त करता है। यदि eUICC तैयार नहीं है तो यह शून्य हो सकता है। कॉल करने वाले के पास वाहक विशेषाधिकार या READ_PRIVILEGED_PHONE_STATE अनुमति होनी चाहिए। विवरण के लिए, getEid देखें।

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

EuiccInfo प्राप्त करें (सार्वजनिक)

eUICC के बारे में जानकारी प्राप्त करता है। इसमें OS संस्करण शामिल है. विवरण के लिए, getEuiccInfo देखें।

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

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

दी गई सदस्यता को डाउनलोड करता है (जीएसएमए आरएसपी दस्तावेज़ों में "प्रोफ़ाइल" के रूप में संदर्भित)। सदस्यता एक सक्रियण कोड से बनाई जा सकती है। उदाहरण के लिए, एक सक्रियण कोड को QR कोड से पार्स किया जा सकता है। सदस्यता डाउनलोड करना एक अतुल्यकालिक ऑपरेशन है।

कॉल करने वाले के पास या तो 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);

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

(एंड्रॉइड 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)

(एंड्रॉइड 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);

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

किसी डिवाइस पर सभी सदस्यताएँ मिटा देता है। एंड्रॉइड 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 स्थिरांक की सूची देखने के लिए, स्थिरांक देखें।