eUICC API

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

eUICC সম্পর্কে

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

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

ছবি ১. পরিষেবা প্রদানকারীর অ্যাপ ও OEM LPA সহ Android ফোন

EuiccCardManager কল করা ও eUICC-এর সাথে কথা বলার লজিক ছাড়াও, LPA অ্যাপকে নিচে উল্লেখ করা বিষয়গুলি প্রয়োগ করতে হবে:

  • SM-DP+ ক্লায়েন্ট, প্রোফাইল যাচাই ও ডাউনলোড করার জন্য SM-DP+ সার্ভারের সাথে কথা বলছে
  • [ঐচ্ছিক] আরও সম্ভাব্য ডাউনলোডযোগ্য প্রোফাইল পেতে SM-DS
  • প্রোফাইল স্টেট আপডেট করার জন্য সার্ভারে বিজ্ঞপ্তি পাঠানোর জন্য বিজ্ঞপ্তি ম্যানেজ করা
  • [ঐচ্ছিক] স্লট ম্যানেজমেন্ট, যার মধ্যে ই-সিম ও pSIM লজিক পরিবর্তন করা অন্তর্ভুক্ত। ফোনে শুধু ই-সিম চিপ থাকলে এটি ঐচ্ছিক।
  • ই-সিম OTA

যদিও Android ফোনে একাধিক LPA অ্যাপ থাকতে পারে, তবে প্রতিটি অ্যাপের AndroidManifest.xmlফাইলে সংজ্ঞায়িত অগ্রাধিকারের ভিত্তিতে শুধুমাত্র একটি LPA বেছে নেওয়া যেতে পারে যা প্রকৃত কার্যকরী LPA হিসেবে কাজ করবে।

EuiccManager ব্যবহার করুন

LPA API EuiccManager-এর মাধ্যমে সর্বজনীন (প্যাকেজের মধ্যে android.telephony.euicc)। কোনও ক্যারিয়ার অ্যাপ EuiccManager-এর ইনস্ট্যান্স পেতে পারে, এবং eUICC তথ্য পেতে ও সাবস্ক্রিপশন (GSMA RSP ডকুমেন্টে প্রোফাইল হিসেবে উল্লেখ করা হয়েছে) ম্যানেজ করতে EuiccManager-এর মধ্যে মেথড কল করতে পারে।

ডাউনলোড, পরিবর্তন ও সাবস্ক্রিপশন মুছে দেওয়া সহ সর্বজনীন API কল করার জন্য, ক্যারিয়ার অ্যাপের প্রয়োজনীয় বিশেষ অধিকার থাকতে হবে। প্রোফাইল মেটাডেটায় মোবাইল পরিষেবা প্রদানকারী সংস্থা বিশেষ সুবিধা যোগ করে। eUICC API সেই অনুযায়ী পরিষেবা প্রদানকারীর বিশেষ সুবিধা সংক্রান্ত নিয়ম প্রয়োগ করে।

Android প্ল্যাটফর্ম প্রোফাইল নীতি সংক্রান্ত নিয়ম ম্যানেজ করে না। প্রোফাইল মেটাডেটাতে কোনও নীতি সংক্রান্ত নিয়ম ঘোষণা করা হলে, প্রোফাইল ডাউনলোড ও ইনস্টলেশন পদ্ধতি কীভাবে ম্যানেজ করা হবে তা LPA বেছে নিতে পারে। যেমন, কোনও থার্ড-পার্টি OEM LPA-এর পক্ষে বিশেষ এরর কোড (এরর কোডটি OEM LPA থেকে প্ল্যাটফর্মে পাস করা হয়, তারপরে প্ল্যাটফর্মটি কোডটি OEM LUI-তে পাস করে) ব্যবহার করে নীতি সংক্রান্ত নিয়ম পরিচালনা করা সম্ভব।

একাধিক চালু থাকা প্রোফাইল API সংক্রান্ত তথ্যের জন্য, একাধিক চালু থাকা প্রোফাইল দেখুন।

এপিআই

নিম্নলিখিত API-গুলি EuiccManager রেফারেন্স ডকুমেন্টেশন এবং EuiccManager.java-এ পাওয়া যাবে।

ইন্সট্যান্স পান (সর্বজনীন)

Context#getSystemService-এর মাধ্যমে EuiccManager-এর ইনস্ট্যান্স পায়। আরও জানতে, getSystemService দেখুন।

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

চালু করা আছে (সর্বজনীন)

এম্বেড করা সাবস্ক্রিপশন চালু আছে কিনা তা চেক করে। LPA API অ্যাক্সেস করার আগে এটি চেক করে নিতে হবে। বিবরণের জন্য, 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);

SIM port কি উপলভ্য (পাবলিক)

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)

ডিভাইসে থাকা সব সাবস্ক্রিপশন মুছে দেয়। 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-এ ধ্রুবকEuiccManager-এর তালিকা দেখতে, ধ্রুবক দেখুন।