অ্যান্ড্রয়েড ৯-এ, প্রোফাইল ম্যানেজমেন্ট এপিআই (পাবলিক এবং @SystemApi) EuiccManager ক্লাসের মাধ্যমে পাওয়া যায়। ইইউআইসিসি কমিউনিকেশন এপিআই (শুধুমাত্র @SystemApi) EuiccCardManager ক্লাসের মাধ্যমে পাওয়া যায়।
eUICC সম্পর্কে
চিত্র ১-এ দেখানো অনুযায়ী, ক্যারিয়াররা প্রোফাইল পরিচালনা করার জন্য EuiccManager ব্যবহার করে ক্যারিয়ার অ্যাপ তৈরি করতে পারে। ক্যারিয়ার অ্যাপগুলোকে সিস্টেম অ্যাপ হতে হবে না, তবে eUICC প্রোফাইল দ্বারা প্রদত্ত ক্যারিয়ার প্রিভিলেজ থাকতে হবে। @SystemApi কল করার জন্য একটি LPA অ্যাপকে (LUI এবং LPA ব্যাকএন্ড) অবশ্যই একটি সিস্টেম অ্যাপ হতে হবে (অর্থাৎ, সিস্টেম ইমেজে অন্তর্ভুক্ত থাকতে হবে)।

চিত্র ১. ক্যারিয়ার অ্যাপ এবং OEM LPA সহ অ্যান্ড্রয়েড ফোন
EuiccCardManager কল করা এবং eUICC-এর সাথে যোগাযোগ করার লজিক ছাড়াও, LPA অ্যাপগুলিকে অবশ্যই নিম্নলিখিত বিষয়গুলি বাস্তবায়ন করতে হবে:
- প্রোফাইল প্রমাণীকরণ ও ডাউনলোড করার জন্য SM-DP+ ক্লায়েন্ট SM-DP+ সার্ভারের সাথে যোগাযোগ করছে।
- [ঐচ্ছিক] আরও সম্ভাব্য ডাউনলোডযোগ্য প্রোফাইল পেতে SM-DS ব্যবহার করুন।
- প্রোফাইলের অবস্থা আপডেট করার জন্য সার্ভারে নোটিফিকেশন পাঠানোর নোটিফিকেশন হ্যান্ডলিং।
- [ঐচ্ছিক] স্লট ব্যবস্থাপনা, যার মধ্যে ই-সিম এবং পি-সিম লজিকের মধ্যে পরিবর্তন করার সুবিধাও অন্তর্ভুক্ত। ফোনটিতে শুধুমাত্র ই-সিম চিপ থাকলে এটি ঐচ্ছিক।
- eSIM OTA
যদিও একটি অ্যান্ড্রয়েড ফোনে একাধিক এলপিএ অ্যাপ থাকতে পারে, প্রতিটি অ্যাপের AndroidManifest.xml ফাইলে নির্ধারিত অগ্রাধিকারের উপর ভিত্তি করে শুধুমাত্র একটি এলপিএ-কেই প্রকৃত কার্যকরী এলপিএ হিসেবে নির্বাচন করা যায়।
EuiccManager ব্যবহার করুন
LPA API-গুলো EuiccManager ( android.telephony.euicc প্যাকেজের অধীনে) এর মাধ্যমে সর্বজনীনভাবে উপলব্ধ। একটি ক্যারিয়ার অ্যাপ EuiccManager এর ইনস্ট্যান্স পেতে পারে এবং eUICC তথ্য পেতে ও SubscriptionInfo ইনস্ট্যান্স হিসাবে সাবস্ক্রিপশন (GSMA RSP ডকুমেন্টগুলিতে যা প্রোফাইল হিসাবে উল্লেখ করা হয়) পরিচালনা করতে EuiccManager এর মেথডগুলো কল করতে পারে।
ডাউনলোড, সুইচ এবং ডিলিট সাবস্ক্রিপশন অপারেশন সহ পাবলিক এপিআই কল করার জন্য, ক্যারিয়ার অ্যাপটির প্রয়োজনীয় প্রিভিলেজ থাকতে হবে। ক্যারিয়ার প্রিভিলেজগুলো মোবাইল ক্যারিয়ার দ্বারা প্রোফাইল মেটাডেটাতে যোগ করা হয়। eUICC এপিআই সেই অনুযায়ী ক্যারিয়ার প্রিভিলেজের নিয়মগুলো প্রয়োগ করে।
অ্যান্ড্রয়েড প্ল্যাটফর্ম প্রোফাইল পলিসি নিয়মগুলি পরিচালনা করে না। যদি প্রোফাইল মেটাডেটাতে কোনো পলিসি নিয়ম ঘোষণা করা থাকে, তবে LPA প্রোফাইল ডাউনলোড এবং ইনস্টলেশন প্রক্রিয়াটি কীভাবে পরিচালনা করবে তা বেছে নিতে পারে। উদাহরণস্বরূপ, একটি তৃতীয়-পক্ষের 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 হার্ডওয়্যার শনাক্তকারী EID পাওয়া যায়। eUICC প্রস্তুত না থাকলে এটি null হতে পারে। কলারের অবশ্যই ক্যারিয়ার প্রিভিলেজ অথবা READ_PRIVILEGED_PHONE_STATE পারমিশন থাকতে হবে। বিস্তারিত জানতে getEid দেখুন।
String eid = mgr.getEid();
if (eid == null) {
// Handle null case.
}
ইউইকইনফো (পাবলিক) পান
eUICC সম্পর্কিত তথ্য পাওয়া যায়। এতে OS সংস্করণ থাকে। বিস্তারিত জানতে getEuiccInfo দেখুন।
EuiccInfo info = mgr.getEuiccInfo();
String osVer = info.getOsVersion();
সাবস্ক্রিপশন ডাউনলোড করুন (সর্বজনীন)
প্রদত্ত সাবস্ক্রিপশনটি (GSMA RSP ডকুমেন্টগুলিতে যা 'প্রোফাইল' নামে পরিচিত) ডাউনলোড করে। একটি অ্যাক্টিভেশন কোড থেকে সাবস্ক্রিপশনটি তৈরি করা যেতে পারে। উদাহরণস্বরূপ, একটি 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);
পোর্ট (পাবলিক) দিয়ে সাবস্ক্রিপশন পরিবর্তন করুন
(অ্যান্ড্রয়েড ১৩ থেকে উপলব্ধ) নির্দিষ্ট পোর্ট ইনডেক্স সহ প্রদত্ত সাবস্ক্রিপশনটি চালু করে। কলারের অবশ্যই 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)
(অ্যান্ড্রয়েড ১৩ থেকে উপলব্ধ) প্রদত্ত পোর্ট ইনডেক্সটি উপলব্ধ আছে কিনা তা ফেরত দেয়। একটি পোর্ট উপলব্ধ থাকে যদি সেটিতে কোনো সাবস্ক্রিপশন সক্রিয় না থাকে অথবা কলিং অ্যাপটির নির্বাচিত পোর্টে ইনস্টল করা সাবস্ক্রিপশনের উপর ক্যারিয়ার প্রিভিলেজ থাকে। বিস্তারিত জানতে, 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);
সমস্ত সাবস্ক্রিপশন মুছে ফেলুন (সিস্টেম এপিআই)
একটি ডিভাইসের সমস্ত সাবস্ক্রিপশন মুছে ফেলে। অ্যান্ড্রয়েড ১১ থেকে, সমস্ত টেস্ট, অপারেশনাল, বা উভয় ধরণের সাবস্ক্রিপশন মুছে ফেলা হবে কিনা তা নির্দিষ্ট করার জন্য আপনাকে একটি 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);
ধ্রুবক
EuiccManager এর public কনস্ট্যান্টগুলোর তালিকা দেখতে, Constants দেখুন।