Android 9 में, प्रोफ़ाइल मैनेजमेंट एपीआई (सार्वजनिक और @SystemApi) क्लास EuiccManager के ज़रिए उपलब्ध हैं. eUICC कम्यूनिकेशन
एपीआई (@SystemApi only) EuiccCardManager क्लास के ज़रिए उपलब्ध हैं.
eUICC के बारे में जानकारी
मोबाइल और इंटरनेट सेवा देने वाली कंपनियां, EuiccManager का इस्तेमाल करके कैरियर ऐप्लिकेशन बना सकती हैं. इससे वे प्रोफ़ाइलें मैनेज कर सकती हैं. इसके बारे में पहली इमेज में दिखाया गया है. कैरियर ऐप्लिकेशन को सिस्टम ऐप्लिकेशन होने की ज़रूरत नहीं है. हालांकि, उनके पास eUICC प्रोफ़ाइल से मिले कैरियर के खास अधिकार होने चाहिए. @SystemApi को कॉल करने के लिए, एलपीए ऐप्लिकेशन (एलपीए यूज़र इंटरफ़ेस (एलयूआई) और एलपीए बैकएंड) को सिस्टम ऐप्लिकेशन होना चाहिए. इसका मतलब है कि इसे सिस्टम इमेज में शामिल किया जाना चाहिए.
पहली इमेज. मोबाइल और इंटरनेट सेवा देने वाली कंपनी के ऐप्लिकेशन और ओईएम एलपीए की सुविधा वाले Android फ़ोन
EuiccCardManager को कॉल करने और eUICC से बातचीत करने के लॉजिक के अलावा, LPA ऐप्लिकेशन को ये काम करने होंगे:
- SM-DP+ क्लाइंट, SM-DP+ सर्वर से कम्यूनिकेट करके, प्रोफ़ाइलों की पुष्टि करता है और उन्हें डाउनलोड करता है
- [ज़रूरी नहीं] SM-DS, ताकि डाउनलोड की जा सकने वाली ज़्यादा प्रोफ़ाइलें मिल सकें
- सूचनाएं मैनेज करने की सुविधा. इससे सर्वर को सूचनाएं भेजी जाती हैं, ताकि प्रोफ़ाइल की स्थिति अपडेट की जा सके
- [ज़रूरी नहीं] सिम स्लॉट मैनेज करने की सुविधा. इसमें ई-सिम और पीएसआईएम के लॉजिक के बीच स्विच करने की सुविधा भी शामिल है. अगर फ़ोन में सिर्फ़ eSIM चिप है, तो यह जानकारी देना ज़रूरी नहीं है.
- ई-सिम ओटीए
Android फ़ोन में एक से ज़्यादा एलपीए ऐप्लिकेशन मौजूद हो सकते हैं. हालांकि, सिर्फ़ एक एलपीए को चालू एलपीए के तौर पर चुना जा सकता है. यह चुनाव, हर ऐप्लिकेशन की AndroidManifest.xml फ़ाइल में तय की गई प्राथमिकता के आधार पर किया जाता है.
EuiccManager का इस्तेमाल करना
एलपीए एपीआई, EuiccManager (पैकेज 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