eUICC API

অ্যান্ড্রয়েড 9-এ, প্রোফাইল ম্যানেজমেন্ট API (সর্বজনীন এবং @SystemApi) ক্লাস EuiccManager এর মাধ্যমে উপলব্ধ। eUICC কমিউনিকেশন এপিআই (@SystemApi শুধুমাত্র) ক্লাস EuiccCardManager এর মাধ্যমে উপলব্ধ।

eUICC সম্পর্কে

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

ক্যারিয়ার অ্যাপ এবং OEM LPA সহ Android ফোন

চিত্র 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);

ধ্রুবক

EuiccManagerpublic ধ্রুবকগুলির একটি তালিকা দেখতে, ধ্রুবক দেখুন।