eSIM लागू करना

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

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

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

चित्र 1. सरलीकृत आरएसपी आर्किटेक्चर

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

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

EuiccManager में API को कार्य करने के लिए उचित रूप से कार्यान्वित LPA ऐप की आवश्यकता होती है और EuiccCardManager API का कॉलर LPA होना चाहिए। यह एंड्रॉइड फ्रेमवर्क द्वारा लागू किया गया है।

एंड्रॉइड 10 या उच्चतर पर चलने वाले डिवाइस एकाधिक eSIM वाले डिवाइस का समर्थन कर सकते हैं। अधिक जानकारी के लिए, एकाधिक eSIM का समर्थन करना देखें।

एक कैरियर ऐप बनाना

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

यूआईसीसी प्रबंधक

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

सार्वजनिक एपीआई का उपयोग करने के लिए, एक वाहक ऐप को पहले Context#getSystemService के माध्यम से EuiccManager का उदाहरण प्राप्त करना होगा:

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

आपको कोई भी eSIM संचालन करने से पहले यह जांचना चाहिए कि डिवाइस पर eSIM समर्थित है या नहीं। यदि android.hardware.telephony.euicc सुविधा परिभाषित है और एक LPA पैकेज मौजूद है EuiccManager#isEnabled() आम तौर पर true लौटाता है।

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

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

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

कई एपीआई, जैसे कि downloadSubscription() और switchToSubscription() , PendingIntent कॉलबैक का उपयोग करते हैं क्योंकि उन्हें पूरा होने में सेकंड या मिनट भी लग सकते हैं। PendingIntent EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_ स्पेस में एक परिणाम कोड के साथ भेजा जाता है, जो फ्रेमवर्क-परिभाषित त्रुटि कोड प्रदान करता है, साथ ही LPA से 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 API और कोड उदाहरणों की पूरी सूची के लिए, eUICC API देखें।

समाधान योग्य त्रुटियाँ

ऐसे कुछ मामले हैं जहां सिस्टम eSIM ऑपरेशन को पूरा करने में असमर्थ है लेकिन उपयोगकर्ता द्वारा त्रुटि का समाधान किया जा सकता है। उदाहरण के लिए, यदि प्रोफ़ाइल मेटाडेटा इंगित करता है कि एक वाहक पुष्टिकरण कोड की आवश्यकता है, तो downloadSubscription विफल हो सकता है। या यदि वाहक ऐप के पास गंतव्य प्रोफ़ाइल पर वाहक विशेषाधिकार हैं (अर्थात, वाहक प्रोफ़ाइल का स्वामी है) लेकिन उसके पास वर्तमान में सक्षम प्रोफ़ाइल पर वाहक विशेषाधिकार नहीं हैं, तो switchToSubscription विफल हो सकता है, और इसलिए उपयोगकर्ता की सहमति आवश्यक है।

इन मामलों के लिए, कॉल करने वाले के कॉलबैक को EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR से कॉल किया जाता है। कॉलबैक Intent में आंतरिक अतिरिक्त सुविधाएं होती हैं, जैसे कि जब कॉल करने वाला इसे EuiccManager#startResolutionActivity पर भेजता है, तो LUI के माध्यम से रिज़ॉल्यूशन का अनुरोध किया जा सकता है। उदाहरण के लिए फिर से पुष्टिकरण कोड का उपयोग करते हुए, EuiccManager#startResolutionActivity एक LUI स्क्रीन ट्रिगर करता है जो उपयोगकर्ता को एक पुष्टिकरण कोड दर्ज करने की अनुमति देता है; कोड दर्ज करने के बाद, डाउनलोड ऑपरेशन फिर से शुरू हो जाता है। यह दृष्टिकोण वाहक ऐप को यूआई दिखाए जाने पर पूर्ण नियंत्रण प्रदान करता है, लेकिन एलपीए/एलयूआई को क्लाइंट ऐप्स को बदलने की आवश्यकता के बिना भविष्य में उपयोगकर्ता-पुनर्प्राप्ति योग्य मुद्दों की नई हैंडलिंग जोड़ने के लिए एक विस्तार योग्य विधि प्रदान करता है।

एंड्रॉइड 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 के स्वामित्व वाली प्रोफ़ाइल को डाउनलोड, सक्षम या अक्षम करने में सक्षम नहीं होना चाहिए।

यह सुनिश्चित करने के लिए कि कोई प्रोफ़ाइल केवल उसके स्वामी के लिए ही पहुंच योग्य हो, एंड्रॉइड प्रोफ़ाइल स्वामी के ऐप (अर्थात, वाहक ऐप) को विशेष विशेषाधिकार प्रदान करने के लिए एक तंत्र का उपयोग करता है। एंड्रॉइड प्लेटफ़ॉर्म प्रोफ़ाइल की एक्सेस नियम फ़ाइल (एआरएफ) में संग्रहीत प्रमाणपत्रों को लोड करता है और इन प्रमाणपत्रों द्वारा हस्ताक्षरित ऐप्स को EuiccManager API पर कॉल करने की अनुमति देता है। उच्च-स्तरीय प्रक्रिया नीचे वर्णित है:

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

    1. वाहक ऐप के सार्वजनिक-कुंजी प्रमाणपत्र के हस्ताक्षर (SHA-1 या SHA-256) (आवश्यक)
    2. वाहक ऐप का पैकेज नाम (दृढ़ता से अनुशंसित)
  3. कैरियर ऐप EuiccManager API के माध्यम से eUICC ऑपरेशन करने का प्रयास करता है।

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

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

ऐप साइनिंग के बारे में अधिक जानकारी के लिए, अपने ऐप पर हस्ताक्षर करें देखें। वाहक विशेषाधिकारों के विवरण के लिए, UICC वाहक विशेषाधिकार देखें।

एक स्थानीय प्रोफ़ाइल सहायक ऐप बनाना

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

हार्डवेयर/मॉडेम आवश्यकताएँ

eUICC चिप पर LPA और eSIM OS को कम से कम GSMA RSP (रिमोट सिम प्रोविजनिंग) v2.0 या v2.2 का समर्थन करना चाहिए। आपको एसएम-डीपी+ और एसएम-डीएस सर्वर का उपयोग करने की भी योजना बनानी चाहिए जिनका आरएसपी संस्करण मेल खाता हो। विस्तृत आरएसपी आर्किटेक्चर के लिए, जीएसएमए एसजीपी.21 आरएसपी आर्किटेक्चर विशिष्टता देखें।

इसके अलावा, एंड्रॉइड 9 में ईयूआईसीसी एपीआई के साथ एकीकृत करने के लिए, डिवाइस मॉडेम को एन्कोडेड ईयूआईसीसी क्षमताओं (स्थानीय प्रोफ़ाइल प्रबंधन और प्रोफ़ाइल डाउनलोड) के समर्थन के साथ टर्मिनल क्षमताओं को भेजना चाहिए। इसे निम्नलिखित विधियों को भी लागू करने की आवश्यकता है:

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

  • IRadioConfig HAL v1.0: getSimSlotsStatus

  • IRadioConfig AIDL v1.0: getAllowedCarriers

    Google LPA को कैरियर लॉक स्थिति जानने की आवश्यकता है ताकि वह केवल अनुमत कैरियर के लिए eSIM डाउनलोड या ट्रांसफर की अनुमति दे सके। अन्यथा उपयोगकर्ता सिम डाउनलोड और ट्रांसफर कर सकते हैं और बाद में उन्हें पता चलेगा कि डिवाइस एक अलग कैरियर पर लॉक है।

    • विक्रेताओं या OEM को IRadioSim.getAllowedCarriers()HAL API लागू करना होगा।

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

मॉडेम को डिफ़ॉल्ट बूट प्रोफ़ाइल के साथ eSIM को एक वैध सिम के रूप में पहचानना चाहिए और सिम पावर को चालू रखना चाहिए।

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

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

EuiccCardManager

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

कैरियर ऐप्स, एलपीए और यूआईसीसी एपीआई

चित्र 2. कैरियर ऐप और एलपीए दोनों यूआईसीसी एपीआई का उपयोग करते हैं

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

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

अधिकांश EuiccCardManager API का उपयोग पैटर्न समान है। उदाहरण के लिए, eUICC पर एक बाउंड प्रोफ़ाइल पैकेज लोड करने के लिए:

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

कैरियर ऐप के माध्यम से eSIM प्रोफ़ाइल सक्रिय करना

एंड्रॉइड 9 या उच्चतर चलाने वाले उपकरणों पर, आप eSIM को सक्रिय करने और प्रोफ़ाइल डाउनलोड करने के लिए एक कैरियर ऐप का उपयोग कर सकते हैं। कैरियर ऐप सीधे downloadSubscription पर कॉल करके या एलपीए को एक सक्रियण कोड प्रदान करके प्रोफाइल डाउनलोड कर सकता है।

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

नीचे दिया गया अनुभाग एक सक्रियण कोड का उपयोग करके एक वाहक ऐप के माध्यम से एक eSIM को सक्रिय करने का वर्णन करता है।

सक्रियण कोड का उपयोग करके eSIM सक्रिय करना

eSIM प्रोफ़ाइल को सक्रिय करने के लिए सक्रियण कोड का उपयोग करते समय, LPA वाहक ऐप से एक सक्रियण कोड प्राप्त करता है और प्रोफ़ाइल डाउनलोड करता है। यह प्रवाह एलपीए द्वारा शुरू किया जा सकता है और एलपीए संपूर्ण यूआई प्रवाह को नियंत्रित कर सकता है, जिसका अर्थ है कि कोई वाहक ऐप यूआई नहीं दिखाया गया है। यह दृष्टिकोण BF76 टैग जांच को बायपास करता है, और नेटवर्क ऑपरेटरों को eSIM प्रोफ़ाइल डाउनलोड करने और त्रुटि प्रबंधन सहित संपूर्ण eSIM सक्रियण UI प्रवाह को लागू करने की आवश्यकता नहीं होती है।

वाहक ईयूआईसीसी प्रावधान सेवा को परिभाषित करना

एलपीए और कैरियर ऐप दो एआईडीएल इंटरफेस के माध्यम से संचार करते हैं: ICarrierEuiccProvisioningService और IGetActivationCodeCallback । कैरियर ऐप को ICarrierEuiccProvisioningService इंटरफ़ेस लागू करना होगा और इसे अपनी प्रकट घोषणा में प्रदर्शित करना होगा। LPA को 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 कार्यान्वयन से जुड़ने के लिए, LPA को आपके प्रोजेक्ट में ICarrierEuiccProvisioningService.aidl और IGetActivationCodeCallback.aidl दोनों को कॉपी करना होगा और ServiceConnection लागू करना होगा।

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

कैरियर ऐप के ICarrierEuiccProvisioningService कार्यान्वयन के लिए बाध्य होने के बाद, LPA IGetActivationCodeCallback स्टब क्लास के कार्यान्वयन को पास करके कैरियर ऐप से सक्रियण कोड प्राप्त करने के लिए या तो getActivationCode या getActivationCodeForEid को कॉल करता है।

getActivationCode और getActivationCodeForEid के बीच अंतर यह है कि getActivationCodeForEid एक वाहक को डाउनलोड प्रक्रिया शुरू होने से पहले डिवाइस के EID पर एक प्रोफ़ाइल को प्री-बाइंड करने की अनुमति देता है।

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

कैरियर ऐप के लिए उदाहरण कार्यान्वयन

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

एआईडीएल कैरियर ऐप सेवा को लागू करने के लिए, एक सेवा बनाएं, 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);
              }
          }
    }
    

एलपीए सक्रियण प्रवाह में कैरियर ऐप यूआई शुरू करना

एंड्रॉइड 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. कैरियर ऐप अपने स्वयं के यूआई का उपयोग करके अपना काम करता है। उदाहरण के लिए, उपयोगकर्ता को लॉग इन करना या वाहक के बैकएंड पर HTTP अनुरोध भेजना।

  3. कैरियर ऐप setResult(int, Intent) और finish() पर कॉल करके LPA पर प्रतिक्रिया करता है।

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

    सुरक्षा कारणों से, एलपीए को परिणाम में दिए गए सक्रियण कोड को सीधे स्वीकार नहीं करना चाहिए ताकि यह सुनिश्चित किया जा सके कि गैर-एलपीए कॉल करने वालों को वाहक ऐप से सक्रियण कोड नहीं मिल सके।

कैरियर ऐप में एलपीए सक्रियण प्रवाह लॉन्च करना

एंड्रॉइड 11 से शुरू होकर, वाहक ऐप्स eSIM सक्रियण के लिए LUI शुरू करने के लिए eUICC API का उपयोग कर सकते हैं। यह विधि eSIM प्रोफ़ाइल को सक्रिय करने के लिए LPA के eSIM सक्रियण प्रवाह UI को सामने लाती है। eSIM प्रोफ़ाइल सक्रियण समाप्त होने पर LPA एक प्रसारण भेजता है।

  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. कैरियर ऐप अपने स्वयं के यूआई का उपयोग करके अपना काम करता है। उदाहरण के लिए, उपयोगकर्ता को लॉग इन करना या वाहक के बैकएंड पर HTTP अनुरोध भेजना।

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

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

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

    1. यदि LPA नई eSIM प्रोफ़ाइल डाउनलोड करने में सफल हो जाता है, तो यह RESULT_OK के साथ प्रतिक्रिया देता है।
    2. यदि उपयोगकर्ता LPA में eSIM प्रोफ़ाइल सक्रियण रद्द करता है, तो यह RESULT_CANCELED के साथ प्रतिक्रिया करता है।
    3. यदि LPA RESULT_OK या RESULT_CANCELED के अलावा किसी अन्य चीज़ के साथ प्रतिक्रिया करता है, तो वाहक ऐप इसे एक त्रुटि मानता है।

    सुरक्षा कारणों से, एलपीए सीधे आपूर्ति किए गए सक्रियण कोड को स्वीकार नहीं करता है ताकि यह सुनिश्चित किया जा सके कि गैर-एलपीए कॉल करने वालों को वाहक ऐप से सक्रियण कोड नहीं मिल सके।

एकाधिक eSIM का समर्थन करना

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

आवश्यकताएं

एकाधिक eSIM का समर्थन करने के लिए, डिवाइस में एक से अधिक eUICC होना चाहिए, जो या तो एक अंतर्निहित eUICC या एक भौतिक सिम स्लॉट हो सकता है जहां हटाने योग्य eUICC डाला जा सकता है।

एकाधिक eSIM का समर्थन करने के लिए रेडियो HAL संस्करण 1.2 या उच्चतर आवश्यक है। रेडियो एचएएल संस्करण 1.4 और रेडियोकॉन्फिग एचएएल संस्करण 1.2 अनुशंसित हैं।

कार्यान्वयन

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

arrays.xml में निर्दिष्ट non_removable_euicc_slots संसाधन पूर्णांकों की एक सरणी है जो डिवाइस के अंतर्निहित eUICCs की स्लॉट आईडी का प्रतिनिधित्व करता है। प्लेटफ़ॉर्म को यह निर्धारित करने की अनुमति देने के लिए आपको इस संसाधन को निर्दिष्ट करना होगा कि डाला गया ईयूआईसीसी हटाने योग्य है या नहीं।

एकाधिक eSIM वाले डिवाइस के लिए कैरियर ऐप

एकाधिक eSIM वाले डिवाइस के लिए एक कैरियर ऐप बनाते समय, एक EuiccManager ऑब्जेक्ट बनाने के लिए EuiccManager में createForCardId विधि का उपयोग करें जो किसी दिए गए कार्ड आईडी पर पिन किया गया हो। कार्ड आईडी एक पूर्णांक मान है जो डिवाइस पर विशिष्ट रूप से यूआईसीसी या ईयूआईसीसी की पहचान करता है।

डिवाइस के डिफ़ॉल्ट eUICC के लिए कार्ड आईडी प्राप्त करने के लिए, TelephonyManager में getCardIdForDefaultEuicc विधि का उपयोग करें। यदि रेडियो HAL संस्करण 1.2 से कम है तो यह विधि UNSUPPORTED_CARD_ID लौटाती है और यदि डिवाइस ने eUICC नहीं पढ़ा है तो UNINITIALIZED_CARD_ID लौटाती है।

आप TelephonyManager में getUiccCardsInfo और getUiccSlotsInfo (सिस्टम API) से और 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);

उदाहरण 2: यूआईसीसी के माध्यम से पुनरावृति करें और हटाने योग्य ईयूआईसीसी के लिए 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);
}

मान्यकरण

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

आपको यह सुनिश्चित करना चाहिए कि बिल्ड निम्नलिखित सीटीएस परीक्षण मामलों (सार्वजनिक एपीआई के लिए) पास करते हैं: /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts ।

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

यदि आप अपना स्वयं का एलपीए बना रहे हैं, तो आपको अधिक कठोर परीक्षण से गुजरना चाहिए। आपको मुद्दों को हल करने और आरएसपी आर्किटेक्चर के भीतर अपने एलपीए की इंटरऑपरेबिलिटी सुनिश्चित करने के लिए अपने मॉडेम विक्रेता, ईयूआईसीसी चिप या ईएसआईएम ओएस विक्रेता, एसएम-डीपी + विक्रेताओं और वाहक के साथ काम करना चाहिए। अच्छी मात्रा में मैन्युअल परीक्षण अपरिहार्य है। सर्वोत्तम परीक्षण कवरेज के लिए, आपको GSMA SGP.23 RSP परीक्षण योजना का पालन करना चाहिए।