অ্যান্ড্রয়েড 9-এ, প্রোফাইল ম্যানেজমেন্ট API (সর্বজনীন এবং @SystemApi) ক্লাস EuiccManager
মাধ্যমে উপলব্ধ। eUICC কমিউনিকেশন এপিআই (@SystemApi শুধুমাত্র) ক্লাস EuiccCardManager
মাধ্যমে উপলব্ধ।
eUICC সম্পর্কে
বাহকগণ প্রোফাইল পরিচালনা করতে EuiccManager ব্যবহার করে ক্যারিয়ার অ্যাপ তৈরি করতে পারে, যেমন চিত্র 1-এ দেখানো হয়েছে। ক্যারিয়ার অ্যাপগুলিকে সিস্টেম অ্যাপ হতে হবে না কিন্তু ইইউআইসিসি প্রোফাইল দ্বারা প্রদত্ত ক্যারিয়ারের বিশেষাধিকার থাকতে হবে। @SystemApi কল করার জন্য একটি LPA অ্যাপ (LUI এবং LPA ব্যাকএন্ড) একটি সিস্টেম অ্যাপ (অর্থাৎ, সিস্টেম ইমেজে অন্তর্ভুক্ত) হওয়া প্রয়োজন।
চিত্র 1. ক্যারিয়ার অ্যাপ এবং OEM LPA সহ অ্যান্ড্রয়েড ফোন
EuiccCardManager
কল করার এবং eUICC এর সাথে কথা বলার যুক্তি ছাড়াও, LPA অ্যাপগুলিকে অবশ্যই নিম্নলিখিতগুলি প্রয়োগ করতে হবে:
- SM-DP+ ক্লায়েন্ট SM-DP+ সার্ভারের সাথে কথা বলছে প্রোফাইল প্রমাণীকরণ এবং ডাউনলোড করতে
- [ঐচ্ছিক] আরও সম্ভাব্য ডাউনলোডযোগ্য প্রোফাইল পেতে SM-DS
- প্রোফাইল অবস্থা আপডেট করতে সার্ভারে বিজ্ঞপ্তি পাঠাতে বিজ্ঞপ্তি হ্যান্ডলিং
- [ঐচ্ছিক] eSIM এবং pSIM লজিকের মধ্যে স্যুইচিং সহ স্লট পরিচালনা। ফোনে শুধুমাত্র একটি eSIM চিপ থাকলে এটি ঐচ্ছিক।
- eSIM OTA
যদিও একটি অ্যান্ড্রয়েড ফোনে একাধিক এলপিএ অ্যাপ থাকতে পারে, তবে প্রতিটি অ্যাপের AndroidManifest.xml
ফাইলে সংজ্ঞায়িত অগ্রাধিকারের উপর ভিত্তি করে প্রকৃত কার্যকারী LPA হওয়ার জন্য শুধুমাত্র একটি LPA নির্বাচন করা যেতে পারে।
EuiccManager ব্যবহার করুন
LPA APIগুলি EuiccManager
মাধ্যমে সর্বজনীন ( android.telephony.euicc
প্যাকেজের অধীনে)। একটি ক্যারিয়ার অ্যাপ EuiccManager
এর উদাহরণ পেতে পারে এবং EUICC তথ্য পেতে এবং সাবস্ক্রিপশন ইনফো দৃষ্টান্ত হিসাবে সাবস্ক্রিপশনগুলি (GSMA RSP নথিতে প্রোফাইল হিসাবে উল্লেখ করা হয়েছে) পরিচালনা করতে EuiccManager
এর পদ্ধতিগুলিকে কল করতে পারে৷
ডাউনলোড, স্যুইচ, এবং সাবস্ক্রিপশন ক্রিয়াকলাপগুলি মুছে ফেলা সহ সর্বজনীন API-কে কল করতে, ক্যারিয়ার অ্যাপের অবশ্যই প্রয়োজনীয় বিশেষাধিকার থাকতে হবে৷ ক্যারিয়ারের সুবিধাগুলি মোবাইল ক্যারিয়ার দ্বারা প্রোফাইল মেটাডেটাতে যোগ করা হয়। eUICC API সেই অনুযায়ী ক্যারিয়ারের বিশেষাধিকার বিধি প্রয়োগ করে৷
অ্যান্ড্রয়েড প্ল্যাটফর্ম প্রোফাইল নীতির নিয়মগুলি পরিচালনা করে না। প্রোফাইল মেটাডেটাতে যদি নীতির নিয়ম ঘোষণা করা হয়, তাহলে LPA প্রোফাইল ডাউনলোড এবং ইনস্টলেশন পদ্ধতি কীভাবে পরিচালনা করতে হবে তা বেছে নিতে পারে। উদাহরণস্বরূপ, তৃতীয় পক্ষের OEM LPA-এর পক্ষে একটি বিশেষ ত্রুটি কোড ব্যবহার করে নীতির নিয়মগুলি পরিচালনা করা সম্ভব (ত্রুটির কোডটি OEM LPA থেকে প্ল্যাটফর্মে পাস করা হয়, তারপর প্ল্যাটফর্মটি কোডটি OEM LUI-তে পাস করে)।
একাধিক সক্রিয় প্রোফাইল 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;
}
EID পান (সর্বজনীন)
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();
সাবস্ক্রিপশন ডাউনলোড করুন (সর্বজনীন)
প্রদত্ত সাবস্ক্রিপশন ডাউনলোড করে (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);
পোর্টের সাথে সদস্যতা পরিবর্তন করুন (সর্বজনীন)
(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);
সমস্ত সদস্যতা মুছুন (সিস্টেম API)
একটি ডিভাইসে সমস্ত সদস্যতা মুছে দেয়। অ্যান্ড্রয়েড 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);
ধ্রুবক
EuiccManager
এ public
ধ্রুবকগুলির একটি তালিকা দেখতে, ধ্রুবক দেখুন।