ই-সিম প্রয়োগ করা

এম্বেডেড সিম (eSIM বা eUICC) প্রযুক্তি মোবাইল ব্যবহারকারীদের কোনও পরিষেবা প্রদানকারীর প্রোফাইল ডাউনলোড করতে এবং কোনও ফিজিক্যাল সিম কার্ড ছাড়াই পরিষেবা প্রদানকারীর পরিষেবা অ্যাক্টিভেট করতে দেয়। এটি GSMA দ্বারা পরিচালিত একটি গ্লোবাল স্পেসিফিকেশন যা যেকোনও মোবাইল ডিভাইসের রিমোট সিম প্রোভিশনিং (RSP) চালু করে। Android 9 থেকে শুরু করে, Android ফ্রেমওয়ার্ক ই-সিম অ্যাক্সেস করা এবং ই-সিমের সাবস্ক্রিপশন প্রোফাইল ম্যানেজ করার জন্য স্ট্যান্ডার্ড API প্রদান করে। এইসব eUICC API, থার্ড-পার্টিকে eSIM চালু থাকা Android ডিভাইসে তাদের নিজস্ব ক্যারিয়ার অ্যাপ ও লোকাল প্রোফাইল অ্যাসিস্ট্যান্ট (LPA) ডেভেলপ করতে সাহায্য করে।

LPA হল একটি স্ট্যান্ডঅ্যালোন, সিস্টেম অ্যাপ যা Android বিল্ড ইমেজে অন্তর্ভুক্ত করা উচিত। eSIM-এ প্রোফাইল ম্যানেজ করার কাজটি সাধারণত LPA করে, কারণ এটি SM-DP+ (রিমোট পরিষেবা যা প্রোফাইল প্যাকেজ তৈরি, স্টোর ও ডিভাইসে ডেলিভার করে) এবং eUICC চিপের মধ্যে ব্রিজ হিসেবে কাজ করে। LPA APK-তে ঐচ্ছিকভাবে একটি UI কম্পোনেন্ট অন্তর্ভুক্ত থাকতে পারে, এটিকে LPA UI বা LUI বলা হয়। এটি এন্ড-ইউজারকে সমস্ত এম্বেড করা সাবস্ক্রিপশন প্রোফাইল ম্যানেজ করার জন্য একটি কেন্দ্রীয় জায়গা প্রদান করে। Android ফ্রেমওয়ার্ক অটোমেটিক উপলভ্য সেরা LPA খুঁজে পায় এবং সেটির সাথে কানেক্ট করে এবং LPA ইনস্ট্যান্সের মাধ্যমে সব eUICC অপারেশন রাউট করে।

সরলীকৃত রিমোট সিম প্রোভিশনিং (RSP) আর্কিটেকচার

ছবি ১. সরলীকৃত RSP আর্কিটেকচার

ক্যারিয়ার অ্যাপ তৈরি করতে আগ্রহী মোবাইল নেটওয়ার্ক অপারেটরদের EuiccManager-এ API দেখতে হবে, যা হাই-লেভেল প্রোফাইল ম্যানেজমেন্ট অপারেশন প্রদান করে, যেমন downloadSubscription(), switchToSubscription() এবং deleteSubscription()।

আপনি যদি এমন কোনও ডিভাইস OEM হন যা নিজের LPA সিস্টেম অ্যাপ তৈরি করতে আগ্রহী, তাহলে আপনাকে অবশ্যই এক্সটেন্ড EuiccService করতে হবে যাতে Android ফ্রেমওয়ার্ক আপনার LPA পরিষেবার সাথে কানেক্ট করতে পারে। এছাড়াও, আপনাকে EuiccCardManager-এ API ব্যবহার করতে হবে, যা GSMA RSP v2.0-এর উপর ভিত্তি করে ES10x ফাংশন প্রদান করে। এইসব ফাংশন eUICC চিপে কমান্ড ইস্যু করতে ব্যবহার করা হয়, যেমন prepareDownload(), loadBoundProfilePackage(), retrieveNotificationList(), এবং resetMemory()।

EuiccManager API-কে কাজ করার জন্য সঠিকভাবে প্রয়োগ করা LPA অ্যাপ প্রয়োজন এবং EuiccCardManager API-এর কলকারীকে অবশ্যই LPA হতে হবে। এটি Android ফ্রেমওয়ার্ক দ্বারা এনফোর্স করা হয়।

Android 10 বা এর পরবর্তী যেকোনও ভার্সনে চলে এমন ডিভাইস একাধিক eSIM সহ ডিভাইসে কাজ করতে পারে। আরও তথ্যের জন্য, একাধিক eSIM কাজ করে দেখুন।

পরিষেবা প্রদানকারী অ্যাপ তৈরি করুন

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

EuiccManager

EuiccManager হল LPA-এর সাথে ইন্টার‍্যাক্ট করার জন্য অ্যাপের মূল এন্ট্রি পয়েন্ট। এর মধ্যে পরিষেবা প্রদানকারীর অ্যাপ অন্তর্ভুক্ত যা পরিষেবা প্রদানকারীর মালিকানাধীন সাবস্ক্রিপশন ডাউনলোড, মুছে দেয় এবং এতে পরিবর্তন করে। এর মধ্যে LUI সিস্টেম অ্যাপও অন্তর্ভুক্ত, যা এম্বেড করা সব সাবস্ক্রিপশন ম্যানেজ করার জন্য একটি সেন্ট্রাল লোকেশন/UI প্রদান করে এবং EuiccService প্রদানকারী অ্যাপের থেকে আলাদা অ্যাপ হতে পারে।

পাবলিক API ব্যবহার করতে, পরিষেবা প্রদানকারী অ্যাপকে প্রথমে Context#getSystemService-এর মাধ্যমে EuiccManager-এর ইনস্ট্যান্স পেতে হবে:

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

কোনও ই-সিম অপারেশন করার আগে ডিভাইসে ই-সিম কাজ করে কিনা তা চেক করে নেওয়া উচিত। EuiccManager#isEnabled() সাধারণত true রিটার্ন করে যদি android.hardware.telephony.euicc ফিচারটি সংজ্ঞায়িত করা হয় এবং একটি LPA প্যাকেজ উপস্থিত থাকে।

if (mgr == null || !mgr.isEnabled()) {
    return;
}

eUICC হার্ডওয়্যার ও eSIM OS ভার্সন সম্পর্কে তথ্য পেতে:

EuiccInfo info = mgr.getEuiccInfo();
String osVer = info.getOsVersion();

downloadSubscription() ও switchToSubscription()-এর মতো অনেক API, PendingIntent কলব্যাক ব্যবহার করে, কারণ এগুলি সম্পূর্ণ হতে সেকেন্ড বা এমনকি মিনিটও লাগতে পারে। PendingIntent-এর সাথে EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_ স্পেসে একটি ফলাফল কোড পাঠানো হয়, যা ফ্রেমওয়ার্ক-সংজ্ঞায়িত সমস্যার কোড, সেইসাথে LPA থেকে EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE হিসেবে প্রোপাগেট করা একটি নির্বিচারে বিস্তারিত ফলাফল কোড প্রদান করে, যার ফলে লগিং/ডিবাগিংয়ের উদ্দেশ্যে ক্যারিয়ার অ্যাপ ট্র্যাক করতে পারে। PendingIntent কলব্যাক অবশ্যই BroadcastReceiver হতে হবে।

প্রদত্ত ডাউনলোড করা যায় এমন সাবস্ক্রিপশন (যা অ্যাক্টিভেশন কোড বা QR কোড থেকে তৈরি করা হয়েছে) ডাউনলোড করতে:

// Register receiver.
static final String ACTION_DOWNLOAD_SUBSCRIPTION = "download_subscription";
static final String LPA_DECLARED_PERMISSION
    = "com.your.company.lpa.permission.BROADCAST";
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*/);

                // If the result code is a resolvable error, call startResolutionActivity
                if (resultCode == EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR) {
                    PendingIntent callbackIntent = PendingIntent.getBroadcast(
                        getContext(), 0 /* requestCode */, intent,
                        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
                    mgr.startResolutionActivity(
                        activity,
                        0 /* requestCode */,
                        intent,
                        callbackIntent);
                }

                resultIntent = intent;
            }
        };
context.registerReceiver(receiver,
        new IntentFilter(ACTION_DOWNLOAD_SUBSCRIPTION),
        LPA_DECLARED_PERMISSION /* broadcastPermission*/,
        null /* handler */);

// Download subscription asynchronously.
DownloadableSubscription sub = DownloadableSubscription
        .forActivationCode(code /* encodedActivationCode*/);
Intent intent = new Intent(action).setPackage(context.getPackageName());
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
mgr.downloadSubscription(sub, true /* switchAfterDownload */,
        callbackIntent);

AndroidManifest.xml-এ অনুমতি নির্ধারণ ও ব্যবহার করুন:

    <permission android:protectionLevel="signature" android:name="com.your.company.lpa.permission.BROADCAST" />
    <uses-permission android:name="com.your.company.lpa.permission.BROADCAST"/>

সাবস্ক্রিপশন আইডি ব্যবহার করে সাবস্ক্রিপশন পরিবর্তন করতে:

// Register receiver.
static final String ACTION_SWITCH_TO_SUBSCRIPTION = "switch_to_subscription";
static final String LPA_DECLARED_PERMISSION
    = "com.your.company.lpa.permission.BROADCAST";
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_SWITCH_TO_SUBSCRIPTION),
        LPA_DECLARED_PERMISSION /* broadcastPermission*/,
        null /* handler */);

// Switch to a subscription asynchronously.
Intent intent = new Intent(action).setPackage(context.getPackageName());
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
mgr.switchToSubscription(1 /* subscriptionId */, callbackIntent);

EuiccManager API এবং কোডের উদাহরণের সম্পূর্ণ তালিকার জন্য, eUICC API দেখুন।

সমাধানযোগ্য সমস্যা

কিছু ক্ষেত্রে, সিস্টেম ই-সিম অপারেশন সম্পূর্ণ করতে পারে না কিন্তু ব্যবহারকারী সমস্যার সমাধান করতে পারেন। যেমন, downloadSubscription ব্যর্থ হতে পারে যদি প্রোফাইল মেটাডেটা থেকে বোঝা যায় যে ক্যারিয়ার কনফার্মেশন কোড প্রয়োজন। অথবা switchToSubscription ব্যর্থ হতে পারে যদি গন্তব্য প্রোফাইলের উপর ক্যারিয়ার অ্যাপের ক্যারিয়ার বিশেষ সুবিধা থাকে (অর্থাৎ, প্রোফাইলের মালিকানা ক্যারিয়ারের কাছে থাকে) কিন্তু বর্তমানে চালু থাকা প্রোফাইলের উপর ক্যারিয়ারের বিশেষ সুবিধা না থাকে এবং সেই কারণে ব্যবহারকারীর সম্মতি প্রয়োজন হয়।

এইসব ক্ষেত্রে, কলারের কলব্যাককে EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR দিয়ে কল করা হয়। কলব্যাক Intent-এ ইন্টার্নাল এক্সট্রা থাকে, যাতে কলার সেটি EuiccManager#startResolutionActivity-এ পাস করলে, LUI-এর মাধ্যমে রেজোলিউশনের অনুরোধ করা যায়। কনফার্মেশন কোড ব্যবহার করে যেমন, আবার, EuiccManager#startResolutionActivity LUI স্ক্রিন ট্রিগার করে যা ব্যবহারকারীকে কনফার্মেশন কোড লিখতে দেয়; কোড লেখা হয়ে গেলে, ডাউনলোড অপারেশন আবার শুরু হয়। এই পদ্ধতি ক্যারিয়ার অ্যাপকে UI কখন দেখানো হবে তার উপর সম্পূর্ণ নিয়ন্ত্রণ প্রদান করে, তবে LPA/LUI-কে ভবিষ্যতে ক্লায়েন্ট অ্যাপ পরিবর্তন করার প্রয়োজন ছাড়াই ব্যবহারকারী-সমাধানযোগ্য সমস্যার নতুন হ্যান্ডলিং যোগ করার জন্য একটি এক্সটেনসিবল পদ্ধতি প্রদান করে।

Android 9-এ এই সমাধানযোগ্য সমস্যাগুলি EuiccService-এ সংজ্ঞায়িত করা হয়েছে, যা LUI-এর ম্যানেজ করা উচিত:

/**
 * Alert the user that this action will result in an active SIM being
 * deactivated. To implement the LUI triggered by the system, you need to define
 * this in AndroidManifest.xml.
 */
public static final String ACTION_RESOLVE_DEACTIVATE_SIM =
        "android.service.euicc.action.RESOLVE_DEACTIVATE_SIM";
/**
 * Alert the user about a download/switch being done for an app that doesn't
 * currently have carrier privileges.
 */
public static final String ACTION_RESOLVE_NO_PRIVILEGES =
        "android.service.euicc.action.RESOLVE_NO_PRIVILEGES";

/** Ask the user to resolve all the resolvable errors. */
public static final String ACTION_RESOLVE_RESOLVABLE_ERRORS =
        "android.service.euicc.action.RESOLVE_RESOLVABLE_ERRORS";

পরিষেবা প্রদানকারীর বিশেষ সুবিধা

আপনি যদি এমন কোনও ক্যারিয়ার হন যিনি নিজের ক্যারিয়ার অ্যাপ ডেভেলপ করছেন যা কোনও ডিভাইসে প্রোফাইল ডাউনলোড করার জন্য EuiccManager কল করে, তাহলে আপনার প্রোফাইলে মেটাডেটাতে আপনার ক্যারিয়ার অ্যাপের সাথে সম্পর্কিত ক্যারিয়ার বিশেষ অধিকার সংক্রান্ত নিয়ম অন্তর্ভুক্ত থাকতে হবে। এর কারণ হল, বিভিন্ন পরিষেবা প্রদানকারীর সাবস্ক্রিপশন প্রোফাইল কোনও ডিভাইসের eUICC-তে একসাথে থাকতে পারে এবং প্রতিটি পরিষেবা প্রদানকারীর অ্যাপকে শুধুমাত্র সেই পরিষেবা প্রদানকারীর মালিকানাধীন প্রোফাইল অ্যাক্সেস করার অনুমতি দেওয়া উচিত। যেমন, কেরিয়ার 'ক' যেন কেরিয়ার 'খ'-এর মালিকানাধীন প্রোফাইল ডাউনলোড, চালু বা বন্ধ করতে না পারে।

কোনও প্রোফাইল যাতে শুধুমাত্র তার মালিকই অ্যাক্সেস করতে পারেন তা নিশ্চিত করতে, Android একটি মেকানিজম ব্যবহার করে যা প্রোফাইলের মালিকের অ্যাপকে (অর্থাৎ, ক্যারিয়ার অ্যাপ) বিশেষ সুবিধা প্রদান করে। Android প্ল্যাটফর্ম প্রোফাইলের অ্যাক্সেস রুল ফাইলে (ARF) সেভ করা সার্টিফিকেট লোড করে এবং এইসব সার্টিফিকেট দিয়ে সাইন-ইন করা অ্যাপকে EuiccManager API-তে কল করার অনুমতি দেয়। নিচে হাই-লেভেল প্রসেস বর্ণনা করা হয়েছে:

  1. অপারেটর, পরিষেবা প্রদানকারীর অ্যাপ APK-তে সই করেন; apksigner টুলটি APK-তে পাবলিক-কী সার্টিফিকেট অ্যাটাচ করে।
  2. অপারেটর/SM-DP+ একটি প্রোফাইল ও তার মেটাডেটা প্রস্তুত করে, যার মধ্যে একটি ARF থাকে, যাতে এগুলি থাকে:

    1. ক্যারিয়ার অ্যাপের পাবলিক-কী সার্টিফিকেটের স্বাক্ষর (SHA-1 বা SHA-256) (প্রয়োজনীয়)
    2. পরিষেবা প্রদানকারী অ্যাপের প্যাকেজের নাম (এটি করার জন্য অত্যন্ত সাজেস্ট করা হয়)
  3. পরিষেবা প্রদানকারীর অ্যাপ EuiccManager API-এর মাধ্যমে eUICC অপারেশন করার চেষ্টা করে।

  4. Android প্ল্যাটফর্ম যাচাই করে যে কলার অ্যাপের SHA-1 বা SHA-256 হ্যাশ সার্টিফিকেট টার্গেট প্রোফাইলের ARF থেকে পাওয়া সার্টিফিকেটের সিগনেচারের সাথে মিলছে কিনা। ক্যারিয়ার অ্যাপের প্যাকেজের নাম ARF-এ অন্তর্ভুক্ত থাকলে, সেটি অবশ্যই কলার অ্যাপের প্যাকেজের নামের সাথেও মিলতে হবে।

  5. সিগনেচার ও প্যাকেজের নাম (যদি অন্তর্ভুক্ত থাকে) যাচাই করার পরে, টার্গেট প্রোফাইলের উপর কলার অ্যাপকে ক্যারিয়ার প্রিভিলেজ দেওয়া হয়।

প্রোফাইল মেটাডেটা প্রোফাইলের বাইরেও উপলভ্য থাকতে পারে (যাতে প্রোফাইল ডাউনলোড করার আগে LPA, SM-DP+ থেকে প্রোফাইল মেটাডেটা রিট্রিভ করতে পারে অথবা প্রোফাইল বন্ধ করা থাকলে ISD-R থেকে), তাই এতে প্রোফাইলের মতো একই ক্যারিয়ার প্রিভিলেজ নিয়ম থাকতে হবে।

eUICC OS এবং SM-DP+-কে অবশ্যই প্রোফাইল মেটাডেটাতে একটি মালিকানাধীন ট্যাগ BF76 সমর্থন করতে হবে। ট্যাগ কন্টেন্টকে অবশ্যই অ্যাক্সেস রুল অ্যাপলেট (ARA) দ্বারা রিটার্ন করা একই ক্যারিয়ার প্রিভিলেজ নিয়ম হতে হবে যা UICC ক্যারিয়ার প্রিভিলেজ-এ সংজ্ঞায়িত করা হয়েছে:

RefArDo ::= [PRIVATE 2] SEQUENCE {  -- Tag E2
    refDo [PRIVATE 1] SEQUENCE {  -- Tag E1
        deviceAppIdRefDo [PRIVATE 1] OCTET STRING (SIZE(20|32)),  -- Tag C1
        pkgRefDo [PRIVATE 10] OCTET STRING (SIZE(0..127)) OPTIONAL  -- Tag CA
    },
    arDo [PRIVATE 3] SEQUENCE {  -- Tag E3
        permArDo [PRIVATE 27] OCTET STRING (SIZE(8))  -- Tag DB
    }
}

অ্যাপ সাইনিং সম্পর্কে আরও বিবরণের জন্য, আপনার অ্যাপ সাইন করুন দেখুন। পরিষেবা প্রদানকারীর বিশেষ সুবিধা সম্পর্কে বিবরণের জন্য, UICC পরিষেবা প্রদানকারীর বিশেষ সুবিধা দেখুন।

স্থানীয় প্রোফাইল অ্যাসিস্ট্যান্ট অ্যাপ তৈরি করা

ডিভাইস প্রস্তুতকারক নিজস্ব লোকাল প্রোফাইল অ্যাসিস্ট্যান্ট (LPA) প্রয়োগ করতে পারে, যা অবশ্যই Android Euicc API-এর সাথে হুক-আপ করতে হবে। নিম্নলিখিত বিভাগগুলি LPA অ্যাপ তৈরি করা এবং সেটিকে Android সিস্টেমের সাথে ইন্টিগ্রেট করার একটি সংক্ষিপ্ত ওভারভিউ দেয়।

হার্ডওয়্যার/মডেম সংক্রান্ত প্রয়োজনীয়তা

eUICC চিপে LPA এবং eSIM OS-এ কমপক্ষে GSMA RSP (রিমোট সিম প্রোভিশনিং) v2.0 বা v2.2 কাজ করতে হবে। এছাড়াও, আপনাকে SM-DP+ এবং SM-DS সার্ভার ব্যবহার করার পরিকল্পনা করতে হবে যেগুলির RSP ভার্সন ম্যাচ করে। বিস্তারিত RSP আর্কিটেকচারের জন্য, GSMA SGP.21 RSP আর্কিটেকচার স্পেসিফিকেশন দেখুন।

এছাড়াও, Android 9-এ eUICC API-এর সাথে ইন্টিগ্রেট করতে, ডিভাইস মডেমকে eUICC এনকোড করা (লোকাল প্রোফাইল ম্যানেজমেন্ট এবং প্রোফাইল ডাউনলোড) সংক্রান্ত সুবিধা সহ টার্মিনাল ক্যাপাবিলিটি পাঠাতে হবে। এছাড়াও, নিম্নলিখিত পদ্ধতিগুলি প্রয়োগ করতে হবে:

  • IRadio HAL v1.1: setSimPower
  • IRadio HAL v1.2: getIccCardStatus

  • IRadioConfig HAL v1.0: getSimSlotsStatus

  • IRadioConfig AIDL v1.0: getAllowedCarriers

    Google LPA-কে পরিষেবা প্রদানকারীর লক স্ট্যাটাস জানতে হবে যাতে এটি শুধুমাত্র অনুমোদিত পরিষেবা প্রদানকারীর জন্য eSIM ডাউনলোড বা ট্রান্সফার করার অনুমতি দিতে পারে। তা না হলে, ব্যবহারকারী সিম ডাউনলোড ও ট্রান্সফার করতে পারেন এবং পরে বুঝতে পারেন যে ডিভাইসটি অন্য কোনও পরিষেবা প্রদানকারীর কাছে লক করা আছে।

    • ভেন্ডর বা OEM-কে অবশ্যই IRadioSim.getAllowedCarriers()HAL API প্রয়োগ করতে হবে।

    • IRadioSimResponse.getAllowedCarriersResponse()HAL API-এর অংশ হিসেবে, ডিভাইস যে পরিষেবা প্রদানকারীর সাথে লক করা আছে, ভেন্ডর RIL / Modem সেই পরিষেবা প্রদানকারীর লক স্ট্যাটাস ও carrierId পূরণ করবে।

মডেমকে ডিফল্ট বুট প্রোফাইল চালু থাকা ই-সিমকে সঠিক সিম হিসেবে শনাক্ত করতে হবে এবং সিমের পাওয়ার চালু রাখতে হবে।

Android 10 ভার্সনে চলা ডিভাইসের জন্য, সরানো যায় না এমন eUICC স্লট আইডি অ্যারে অবশ্যই ডিফাইন করতে হবে। যেমন, arrays.xml দেখুন।

<resources>
   <!-- Device-specific array of SIM slot indexes which are are embedded eUICCs.
        e.g. If a device has two physical slots with indexes 0, 1, and slot 1 is an
        eUICC, then the value of this array should be:
            <integer-array name="non_removable_euicc_slots">
                <item>1</item>
            </integer-array>
        If a device has three physical slots and slot 1 and 2 are eUICCs, then the value of
        this array should be:
            <integer-array name="non_removable_euicc_slots">
               <item>1</item>
               <item>2</item>
            </integer-array>
        This is used to differentiate between removable eUICCs and built in eUICCs, and should
        be set by OEMs for devices which use eUICCs. -->

   <integer-array name="non_removable_euicc_slots">
       <item>1</item>
   </integer-array>
</resources>

মডেম সংক্রান্ত প্রয়োজনীয়তার সম্পূর্ণ তালিকা দেখতে, eSIM কাজ করার জন্য মডেম সংক্রান্ত প্রয়োজনীয়তা দেখুন।

EuiccService

LPA-তে দুটি আলাদা কম্পোনেন্ট থাকে (দুটিই একই APK-তে প্রয়োগ করা হতে পারে): LPA ব্যাকএন্ড এবং LPA UI বা LUI।

LPA ব্যাকএন্ড প্রয়োগ করতে, আপনাকে অবশ্যই EuiccService এক্সটেন্ড করতে হবে এবং আপনার ম্যানিফেস্ট ফাইলে এই পরিষেবা ঘোষণা করতে হবে। পরিষেবাটিকে অবশ্যই android.permission.BIND_EUICC_SERVICE সিস্টেম অনুমতি নিতে হবে, যাতে শুধুমাত্র সিস্টেমই এটির সাথে বাইন্ড করতে পারে। এছাড়াও, পরিষেবায় android.service.euicc.EuiccService অ্যাকশন সহ ইনটেন্ট ফিল্টার থাকতে হবে। ডিভাইসে একাধিক ইমপ্লিমেন্টেশন থাকলে, ইনটেন্ট ফিল্টারের অগ্রাধিকার শূন্য ছাড়া অন্য কোনও মানে সেট করা উচিত। যেমন:

<service
    android:name=".EuiccServiceImpl"
    android:permission="android.permission.BIND_EUICC_SERVICE">
    <intent-filter android:priority="100">
        <action android:name="android.service.euicc.EuiccService" />
    </intent-filter>
</service>

অভ্যন্তরীণভাবে, Android ফ্রেমওয়ার্ক অ্যাক্টিভ LPA নির্ধারণ করে এবং Android eUICC API-কে সাপোর্ট করার জন্য প্রয়োজনমতো সেটির সাথে ইন্টার‍্যাক্ট করে। PackageManager-এ android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS অনুমতি সহ সব অ্যাপের কোয়েরি করা হয়, যা android.service.euicc.EuiccService অ্যাকশনের জন্য পরিষেবা নির্দিষ্ট করে। সবচেয়ে বেশি অগ্রাধিকারযুক্ত পরিষেবা বেছে নেওয়া হয়। কোনও পরিষেবা খুঁজে পাওয়া না গেলে, LPA সহায়তা বন্ধ করা আছে।

LUI প্রয়োগ করতে, আপনাকে নিম্নলিখিত অ্যাকশনের জন্য একটি অ্যাক্টিভিটি প্রদান করতে হবে:

  • android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS
  • android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION

পরিষেবার মতো, প্রতিটি অ্যাক্টিভিটির জন্য android.permission.BIND_EUICC_SERVICE সিস্টেমের অনুমতি প্রয়োজন। প্রতিটিতে উপযুক্ত অ্যাকশন, android.service.euicc.category.EUICC_UI বিভাগ ও শূন্য নয় এমন অগ্রাধিকার সহ ইন্টেন্ট ফিল্টার থাকতে হবে। এইসব অ্যাক্টিভিটির জন্য ইমপ্লিমেন্টেশন বেছে নেওয়ার ক্ষেত্রে একই ধরনের যুক্তি ব্যবহার করা হয়, যেমন EuiccService-এর ইমপ্লিমেন্টেশন বেছে নেওয়ার ক্ষেত্রে ব্যবহার করা হয়। যেমন:

<activity android:name=".MyLuiActivity"
          android:exported="true"
          android:permission="android.permission.BIND_EUICC_SERVICE">
    <intent-filter android:priority="100">
        <action android:name="android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS" />
        <action android:name="android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.service.euicc.category.EUICC_UI" />
    </intent-filter>
</activity>

এর অর্থ হল, এইসব স্ক্রিন প্রয়োগকারী UI, EuiccService প্রয়োগকারী APK থেকে আলাদা APK থেকে আসতে পারে। সিঙ্গেল APK নাকি একাধিক APK (যেমন, একটি যা EuiccService প্রয়োগ করে এবং একটি যা LUI অ্যাক্টিভিটি প্রদান করে) থাকবে তা ডিজাইন সংক্রান্ত সিদ্ধান্ত।

EuiccCardManager

EuiccCardManager হল eSIM চিপের সাথে যোগাযোগ করার ইন্টারফেস। এটি ES10 ফাংশন (GSMA RSP স্পেসিফিকেশনে বর্ণিত) প্রদান করে এবং নিম্ন-স্তরের APDU অনুরোধ/উত্তর কমান্ডের পাশাপাশি ASN.1 পার্সিংও হ্যান্ডেল করে। EuiccCardManager হল একটি সিস্টেম API এবং এটি শুধুমাত্র সিস্টেম-প্রিভিলেজড অ্যাপের মাধ্যমে কল করা যেতে পারে।

পরিষেবা প্রদানকারী অ্যাপ, LPA এবং Euicc API

ছবি ২. পরিষেবা প্রদানকারী অ্যাপ ও LPA, দুটিই Euicc API ব্যবহার করে

EuiccCardManager-এর মাধ্যমে প্রোফাইল অপারেশন API-এর জন্য কলারকে LPA হতে হবে। এটি Android ফ্রেমওয়ার্কের মাধ্যমে এনফোর্স করা হয়। এর অর্থ হল, কলারকে অবশ্যই এক্সটেন্ড করতে হবে EuiccService এবং আগের বিভাগে যেমন বর্ণনা করা হয়েছে সেইভাবে আপনার ম্যানিফেস্ট ফাইলে ঘোষণা করতে হবে।

EuiccManager-এর মতো, EuiccCardManager API ব্যবহার করতে, আপনার LPA-কে অবশ্যই প্রথমে EuiccCardManager-এর ইনস্ট্যান্স পেতে হবে Context#getSystemService-এর মাধ্যমে:

EuiccCardManager cardMgr = (EuiccCardManager) context.getSystemService(Context.EUICC_CARD_SERVICE);

তারপর, eUICC-তে সব প্রোফাইল পেতে:

ResultCallback<EuiccProfileInfo[]> callback =
       new ResultCallback<EuiccProfileInfo[]>() {
           @Override
           public void onComplete(int resultCode,
                   EuiccProfileInfo[] result) {
               if (resultCode == EuiccCardManagerReflector.RESULT_OK) {
                   // handle result
               } else {
                   // handle error
               }
           }
       };

cardMgr.requestAllProfiles(eid, AsyncTask.THREAD_POOL_EXECUTOR, callback);

অভ্যন্তরীণভাবে, EuiccCardManager AIDL ইন্টারফেসের মাধ্যমে EuiccCardController-এর সাথে (যা ফোন প্রসেসে রান করে) বাইন্ড করে এবং প্রতিটি EuiccCardManager পদ্ধতি আলাদা, ডেডিকেটেড AIDL ইন্টারফেসের মাধ্যমে ফোন প্রসেস থেকে এর কলব্যাক পায়। EuiccCardManager API ব্যবহার করার সময়, কলকারী (LPA)-কে অবশ্যই এমন একটি Executor অবজেক্ট প্রদান করতে হবে যার মাধ্যমে কলব্যাককে আহ্বান করা হয়। এই Executor অবজেক্টটি আপনার পছন্দের একটি থ্রেড বা থ্রেড পুলে চলতে পারে।

বেশিরভাগ EuiccCardManager API-এর ব্যবহারের প্যাটার্ন একই। যেমন, eUICC-তে বাউন্ড প্রোফাইল প্যাকেজ লোড করতে:

...
cardMgr.loadBoundProfilePackage(eid, boundProfilePackage,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

প্রদত্ত ICCID সহ অন্য প্রোফাইলে পাল্টাতে:

...
cardMgr.switchToProfile(eid, iccid, true /* refresh */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

eUICC চিপ থেকে ডিফল্ট SM-DP+ অ্যাড্রেস পেতে:

...
cardMgr.requestDefaultSmdpAddress(eid, AsyncTask.THREAD_POOL_EXECUTOR,
        callback);

প্রদত্ত বিজ্ঞপ্তি ইভেন্টের বিজ্ঞপ্তির তালিকা পেতে:

...
cardMgr.listNotifications(eid,
        EuiccNotification.Event.INSTALL
              | EuiccNotification.Event.DELETE /* events */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

পরিষেবা প্রদানকারীর অ্যাপের মাধ্যমে ই-সিম প্রোফাইল অ্যাক্টিভেট করা

Android 9 বা তার পরবর্তী যেকোনও ভার্সন কাজ করে এমন ডিভাইসে, আপনি ই-সিম অ্যাক্টিভেট করতে এবং প্রোফাইল ডাউনলোড করতে, পরিষেবা প্রদানকারীর অ্যাপ ব্যবহার করতে পারবেন। পরিষেবা প্রদানকারীর অ্যাপ সরাসরি downloadSubscription কল করে অথবা LPA-তে অ্যাক্টিভেশন কোড প্রদান করে প্রোফাইল ডাউনলোড করতে পারে।

কোনও ক্যারিয়ার অ্যাপ downloadSubscription-এ কল করে প্রোফাইল ডাউনলোড করলে, কলটি নিশ্চিত করে যে অ্যাপটি BF76 মেটাডেটা ট্যাগ ব্যবহার করে প্রোফাইল ম্যানেজ করতে পারবে, যা প্রোফাইলের জন্য ক্যারিয়ার প্রিভিলেজ সংক্রান্ত নিয়ম এনকোড করে। কোনও প্রোফাইলে BF76 ট্যাগ না থাকলে অথবা সেটির BF76 ট্যাগ কলিং ক্যারিয়ার অ্যাপের সিগনেচারের সাথে না মিললে, ডাউনলোড বাতিল করা হয়।

নিচে দেওয়া বিভাগে অ্যাক্টিভেশন কোড ব্যবহার করে পরিষেবা প্রদানকারীর অ্যাপের মাধ্যমে ই-সিম অ্যাক্টিভেট করার বিষয়টি বর্ণনা করা হয়েছে।

অ্যাক্টিভেশন কোড ব্যবহার করে ই-সিম চালু করা

ই-সিম প্রোফাইল অ্যাক্টিভেট করার জন্য অ্যাক্টিভেশন কোড ব্যবহার করার সময়, LPA ক্যারিয়ার অ্যাপ থেকে অ্যাক্টিভেশন কোড নিয়ে প্রোফাইল ডাউনলোড করে। এই ফ্লো LPA-এর মাধ্যমে শুরু করা যেতে পারে এবং LPA সম্পূর্ণ UI ফ্লো কন্ট্রোল করতে পারে, এর অর্থ হল কোনও ক্যারিয়ার অ্যাপ UI দেখানো হয় না। এই পদ্ধতিতে BF76 ট্যাগ চেক এড়িয়ে যাওয়া যায় এবং নেটওয়ার্ক অপারেটরদের ই-সিম প্রোফাইল ডাউনলোড করা ও সমস্যার সমাধান সহ সম্পূর্ণ ই-সিম অ্যাক্টিভেশন UI ফ্লো প্রয়োগ করার প্রয়োজন হয় না।

পরিষেবা প্রদানকারীর eUICC প্রভিশনিং পরিষেবা নির্ধারণ করুন

LPA ও পরিষেবা প্রদানকারী অ্যাপ দুটি AIDL ইন্টারফেসের মাধ্যমে যোগাযোগ করে: ICarrierEuiccProvisioningService ও IGetActivationCodeCallback. ক্যারিয়ার অ্যাপকে অবশ্যই একটি ICarrierEuiccProvisioningService ইন্টারফেস প্রয়োগ করতে হবে এবং এর ম্যানিফেস্ট ডিক্লারেশনে এটি এক্সপোজ করতে হবে। LPA-কে অবশ্যই ICarrierEuiccProvisioningService-এর সাথে বাইন্ড করতে হবে এবং IGetActivationCodeCallback প্রয়োগ করতে হবে। কীভাবে AIDL ইন্টারফেস প্রয়োগ ও এক্সপোজ করবেন সেই সম্পর্কে আরও জানতে, AIDL ইন্টারফেস নির্ধারণ করা দেখুন।

AIDL ইন্টারফেসকে সংজ্ঞায়িত করতে, LPA এবং ক্যারিয়ার অ্যাপ দুটির জন্যই নিম্নলিখিত AIDL ফাইল তৈরি করুন।

  • ICarrierEuiccProvisioningService.aidl

    package android.service.euicc;
    
    import android.service.euicc.IGetActivationCodeCallback;
    
    oneway interface ICarrierEuiccProvisioningService {
        // The method to get the activation code from the carrier app. The caller needs to pass in
        // the implementation of IGetActivationCodeCallback as the parameter.
        void getActivationCode(in IGetActivationCodeCallback callback);
    
        // The method to get the activation code from the carrier app. The caller needs to pass in
        // the activation code string as the first parameter and the implementation of
        // IGetActivationCodeCallback as the second parameter. This method provides the carrier
        // app the device EID which allows a carrier to pre-bind a profile to the device's EID before
        // the download process begins.
        void getActivationCodeForEid(in String eid, in IGetActivationCodeCallback callback);
    }
    
    
  • IGetActivationCodeCallback.aidl

    package android.service.euicc;
    
    oneway interface IGetActivationCodeCallback {
        // The call back method needs to be called when the carrier app gets the activation
        // code successfully. The caller needs to pass in the activation code string as the
        // parameter.
        void onSuccess(String activationCode);
    
        // The call back method needs to be called when the carrier app failed to get the
        // activation code.
        void onFailure();
    }
    

LPA প্রয়োগের উদাহরণ

পরিষেবা প্রদানকারীর অ্যাপের ICarrierEuiccProvisioningService ইমপ্লিমেন্টেশনের সাথে বাইন্ড করতে, LPA-কে আপনার প্রোজেক্টে ICarrierEuiccProvisioningService.aidl ও IGetActivationCodeCallback.aidl দু'টিই কপি করতে হবে এবং ServiceConnection ইমপ্লিমেন্ট করতে হবে।

@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
    mCarrierProvisioningService = ICarrierEuiccProvisioningService.Stub.asInterface(iBinder);
}

পরিষেবা প্রদানকারী অ্যাপের ICarrierEuiccProvisioningService ইমপ্লিমেন্টেশনের সাথে বাইন্ড করার পরে, LPA getActivationCode অথবা getActivationCodeForEid-কে কল করে যাতে পরিষেবা প্রদানকারী অ্যাপ থেকে অ্যাক্টিভেশন কোড পাওয়া যায়। IGetActivationCodeCallback স্টাব ক্লাসের ইমপ্লিমেন্টেশন পাস করার মাধ্যমে এটি করা হয়।

getActivationCode এবং getActivationCodeForEid-এর মধ্যে পার্থক্য হল, getActivationCodeForEid ডাউনলোড প্রসেস শুরু হওয়ার আগে পরিষেবা প্রদানকারীকে ডিভাইসের EID-তে প্রোফাইল প্রি-বাইন্ড করার অনুমতি দেয়।

void getActivationCodeFromCarrierApp() {
    IGetActivationCodeCallback.Stub callback =
            new IGetActivationCodeCallback.Stub() {
                @Override
                public void onSuccess(String activationCode) throws RemoteException {
                    // Handle the case LPA success to get activation code from a carrier app.
                }

                @Override
                public void onFailure() throws RemoteException {
                    // Handle the case LPA failed to get activation code from a carrier app.
                }
            };
    
    try {
        mCarrierProvisioningService.getActivationCode(callback);
    } catch (RemoteException e) {
        // Handle Remote Exception
    }
}

পরিষেবা প্রদানকারী অ্যাপের জন্য প্রয়োগের উদাহরণ

LPA-কে পরিষেবা প্রদানকারীর অ্যাপের সাথে বাইন্ড করতে হলে, পরিষেবা প্রদানকারীর অ্যাপকে অবশ্যই ICarrierEuiccProvisioningService.aidl ও IGetActivationCodeCallback.aidl, দুটিকেই আপনার প্রোজেক্টে কপি করতে হবে এবং ICarrierEuiccProvisioningService পরিষেবাটি AndroidManifest.xml ফাইলে ঘোষণা করতে হবে। পরিষেবাটির জন্য অবশ্যই android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS সিস্টেমের অনুমতি প্রয়োজন যাতে নিশ্চিত করা যায় যে শুধুমাত্র LPA, একটি সিস্টেম-প্রিভিলেজড অ্যাপ, এটির সাথে বাইন্ড করতে পারে। পরিষেবাটিতে অবশ্যই android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE অ্যাকশন সহ একটি ইনটেন্ট ফিল্টার থাকতে হবে।

  • AndroidManifest.xml

    <application>
      ...
      <service
          android:name=".CarrierEuiccProvisioningService"
          android:exported="true"
          android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS">
        <intent-filter>
          <action android:name="android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE"/>
        </intent-filter>
      </service>
      ...
    </application>
    

AIDL পরিষেবা প্রদানকারী অ্যাপ পরিষেবা প্রয়োগ করতে, একটি পরিষেবা তৈরি করুন, Stub ক্লাস এক্সটেন্ড করুন এবং getActivationCode ও getActivationCodeForEid মেথড প্রয়োগ করুন। LPA তারপরে প্রোফাইল অ্যাক্টিভেশন কোড পেতে যেকোনও একটি পদ্ধতি ব্যবহার করে কল করতে পারে। কোডটি পরিষেবা প্রদানকারীর সার্ভার থেকে সফলভাবে ফেচ করা হলে, পরিষেবা প্রদানকারীর অ্যাপকে অ্যাক্টিভেশন কোড সহ IGetActivationCodeCallback#onSuccess কল করে উত্তর দিতে হবে। সেটি সফল না হলে, পরিষেবা প্রদানকারীর অ্যাপকে IGetActivationCodeCallback#onFailure দিয়ে উত্তর দিতে হবে।

  • CarrierEuiccProvisioningService.java

    import android.service.euicc.ICarrierEuiccProvisioningService;
    import android.service.euicc.ICarrierEuiccProvisioningService.Stub;
    import android.service.euicc.IGetActivationCodeCallback;
    
    public class CarrierEuiccProvisioningService extends Service {
        private final ICarrierEuiccProvisioningService.Stub binder =
            new Stub() {
              @Override
              public void getActivationCode(IGetActivationCodeCallback callback) throws RemoteException {
                String activationCode = // do whatever work necessary to get an activation code (HTTP requests to carrier server, fetch from storage, etc.)
                callback.onSuccess(activationCode);
              }
    
              @Override
              public void getActivationCodeForEid(String eid, IGetActivationCodeCallback callback) throws RemoteException {
                String activationCode = // do whatever work necessary (HTTP requests, fetch from storage, etc.)
                callback.onSuccess(activationCode);
              }
          }
    }
    

LPA অ্যাক্টিভেশন ফ্লোতে পরিষেবা প্রদানকারীর অ্যাপ UI চালু করুন

Android 11 ও তার পরের যেকোনও ভার্সনে চলা ডিভাইসে, LPA ক্যারিয়ার অ্যাপের UI চালু করতে পারে। এটি কার্যকর কারণ LPA-কে অ্যাক্টিভেশন কোড দেওয়ার আগে কোনও পরিষেবা প্রদানকারী অ্যাপের ব্যবহারকারীর কাছ থেকে অতিরিক্ত তথ্য প্রয়োজন হতে পারে। যেমন, পরিষেবা প্রদানকারী ব্যবহারকারীদের ফোন নম্বর অ্যাক্টিভেট করতে বা অন্যান্য পোর্টিং পরিষেবা পারফর্ম করতে লগ-ইন করতে বলতে পারে।

LPA-তে কোনও ক্যারিয়ার অ্যাপের UI শুরু করার প্রসেস হল:

  1. LPA, অ্যাকশন থাকা android.service.euicc.action.START_CARRIER_ACTIVATION ইনটেন্টটি ক্যারিয়ার অ্যাপ প্যাকেজে পাঠিয়ে ক্যারিয়ার অ্যাপের অ্যাক্টিভেশন ফ্লো লঞ্চ করে। (ক্যারিয়ার অ্যাপ রিসিভারকে অবশ্যই ম্যানিফেস্ট ঘোষণায় সুরক্ষিত থাকতে হবে, যাতে LPA নয় এমন অ্যাপ থেকে android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS"ইন্টেন্ট না আসে। )

    String packageName = // The carrier app's package name
    
    Intent carrierAppIntent =
        new Intent(“android.service.euicc.action.START_CARRIER_ACTIVATION”)
            .setPackage(packageName);
    
    ResolveInfo activity =
        context.getPackageManager().resolveActivity(carrierAppIntent, 0);
    
    carrierAppIntent
        .setClassName(activity.activityInfo.packageName, activity.activityInfo.name);
    
    startActivityForResult(carrierAppIntent, requestCode);
    
  2. পরিষেবা প্রদানকারী অ্যাপ নিজস্ব UI ব্যবহার করে কাজ করে। যেমন, ব্যবহারকারীকে লগ-ইন করানো বা পরিষেবা প্রদানকারীর ব্যাকএন্ডে HTTP অনুরোধ পাঠানো।

  3. ক্যারিয়ার অ্যাপটি LPA-কে setResult(int, Intent) এবং finish() নম্বরে কল করে উত্তর দেয়।

    1. পরিষেবা প্রদানকারী অ্যাপ RESULT_OK দিয়ে উত্তর দিলে, LPA অ্যাক্টিভেশন ফ্লো চালিয়ে যায়। LPA-কে ক্যারিয়ার অ্যাপের পরিষেবা বাইন্ড করার অনুমতি না দিয়ে, ব্যবহারকারীকে QR কোড স্ক্যান করতে হবে বলে ক্যারিয়ার অ্যাপ নির্ধারণ করলে, ক্যারিয়ার অ্যাপ setResult(int, Intent) সহ RESULT_OK এবং true-এ সেট করা বুলিয়ান এক্সট্রা android.telephony.euicc.extra.USE_QR_SCANNER সহ একটি Intent ইনস্ট্যান্স ব্যবহার করে LPA-কে উত্তর দেয়। LPA তারপরে অতিরিক্ত চেক করে এবং ক্যারিয়ার অ্যাপের ICarrierEuiccProvisioningService বাস্তবায়ন বাইন্ডিং করার পরিবর্তে QR স্ক্যানার চালু করে।
    2. পরিষেবা প্রদানকারীর অ্যাপ ক্র্যাশ করলে বা RESULT_CANCELED (এটি ডিফল্ট রেসপন্স কোড) রেসপন্স কোড দেখালে, LPA eSIM অ্যাক্টিভেশন ফ্লো বাতিল করে দেয়।
    3. ক্যারিয়ার অ্যাপটি RESULT_OK বা RESULT_CANCELED ছাড়া অন্য কিছু দিয়ে উত্তর দিলে, LPA এটিকে একটি সমস্যা হিসেবে বিবেচনা করে।

    নিরাপত্তার কারণে, LPA সরাসরি ফলাফল ইনটেন্টে দেওয়া অ্যাক্টিভেশন কোড গ্রহণ করবে না। এটি নিশ্চিত করে যে LPA নয় এমন কলাররা পরিষেবা প্রদানকারীর অ্যাপ থেকে অ্যাক্টিভেশন কোড পেতে পারবে না।

কোনও ক্যারিয়ার অ্যাপে LPA অ্যাক্টিভেশন ফ্লো লঞ্চ করা

Android 11 থেকে শুরু করে, eSIM অ্যাক্টিভেশনের জন্য LUI শুরু করতে ক্যারিয়ার অ্যাপগুলি eUICC API ব্যবহার করতে পারে। এই পদ্ধতি ই-সিম প্রোফাইল অ্যাক্টিভেট করার জন্য LPA-এর ই-সিম অ্যাক্টিভেশন ফ্লো UI দেখায়। তারপরে, LPA একটি ব্রডকাস্ট পাঠায় যখন ই-সিম প্রোফাইল অ্যাক্টিভেশন সম্পূর্ণ হয়।

  1. LPA-কে অবশ্যই একটি অ্যাক্টিভিটি ঘোষণা করতে হবে যার মধ্যে android.service.euicc.action.START_EUICC_ACTIVATION অ্যাকশন সহ একটি ইনটেন্ট ফিল্টার থাকবে। ডিভাইসে একাধিক ইমপ্লিমেন্টেশন থাকলে, ইনটেন্ট ফিল্টারের অগ্রাধিকার শূন্য-এর চেয়ে বেশি মান সেট করতে হবে। যেমন:

    <application>
      ...
    <activity
        android:name=".CarrierAppInitActivity"
        android:exported="true">
    
        <intent-filter android:priority="100">
            <action android:name="android.service.euicc.action.START_EUICC_ACTIVATION" />
        </intent-filter>
    </activity>
      ...
    </application>
    
  2. পরিষেবা প্রদানকারী অ্যাপ নিজস্ব UI ব্যবহার করে কাজ করে। যেমন, ব্যবহারকারীকে লগ-ইন করানো বা পরিষেবা প্রদানকারীর ব্যাকএন্ডে HTTP অনুরোধ পাঠানো।

  3. এই পর্যায়ে, পরিষেবা প্রদানকারীর অ্যাপকে অবশ্যই তার ICarrierEuiccProvisioningService প্রয়োগের মাধ্যমে একটি অ্যাক্টিভেশন কোড প্রদান করার জন্য প্রস্তুত থাকতে হবে। ক্যারিয়ার অ্যাপটি startActivityForResult(Intent, int) কল করে LPA চালু করে, যার সাথে android.telephony.euicc.action.START_EUICC_ACTIVATION অ্যাকশন থাকে। LPA-ও বুলিয়ান এক্সট্রা android.telephony.euicc.extra.USE_QR_SCANNER চেক করে। ভ্যালু true হলে, LPA QR স্ক্যানার চালু করে যাতে ব্যবহারকারী প্রোফাইল QR কোড স্ক্যান করতে পারেন।

  4. LPA-এর দিক থেকে, LPA, অ্যাক্টিভেশন কোড পেতে এবং ICarrierEuiccProvisioningService সংশ্লিষ্ট প্রোফাইল ডাউনলোড করতে, ক্যারিয়ার অ্যাপের ইমপ্লিমেন্টেশনের সাথে বাইন্ড করে। ডাউনলোড করার সময় LPA সমস্ত প্রয়োজনীয় UI এলিমেন্ট দেখায়, যেমন লোডিং স্ক্রিন।

  5. LPA অ্যাক্টিভেশন ফ্লো সম্পূর্ণ হলে, LPA পরিষেবা প্রদানকারী অ্যাপে একটি ফলাফল কোড সহ উত্তর দেয়, যা পরিষেবা প্রদানকারী অ্যাপ onActivityResult(int, int, Intent)-এ ম্যানেজ করে।

    1. LPA যদি নতুন ই-সিম প্রোফাইল ডাউনলোড করতে পারে, তাহলে এটি RESULT_OK দিয়ে উত্তর দেয়।
    2. ব্যবহারকারী LPA-তে ই-সিম প্রোফাইল অ্যাক্টিভেশন বাতিল করলে, এটি RESULT_CANCELED-এর মাধ্যমে উত্তর দেয়।
    3. LPA যদি RESULT_OK বা RESULT_CANCELED ছাড়া অন্য কিছু দিয়ে উত্তর দেয়, তাহলে ক্যারিয়ার অ্যাপ এটিকে একটি সমস্যা হিসেবে বিবেচনা করে।

    নিরাপত্তার কারণে, LPA সরাসরি সাপ্লাই করা ইনটেন্টে অ্যাক্টিভেশন কোড গ্রহণ করে না যাতে LPA নয় এমন কলাররা পরিষেবা প্রদানকারীর অ্যাপ থেকে অ্যাক্টিভেশন কোড না পেতে পারে।

একাধিক ই-সিম কাজ করে

Android 10 বা তার পরবর্তী ভার্সনে চলা ডিভাইসের জন্য, EuiccManager ক্লাস একাধিক eSIM সহ ডিভাইস সাপোর্ট করে। Android 10-এ আপগ্রেড করা হচ্ছে এমন একটি eSIM সহ ডিভাইসের LPA ইমপ্লিমেন্টেশনে কোনও পরিবর্তন করার প্রয়োজন নেই, কারণ প্ল্যাটফর্মটি অটোমেটিক ডিফল্ট eUICC-এর সাথে EuiccManager ইনস্ট্যান্সকে অ্যাসোসিয়েট করে। রেডিও HAL ভার্সন 1.2 বা তার পরের যেকোনও ভার্সন সহ ডিভাইসের জন্য প্ল্যাটফর্ম এবং রেডিও HAL ভার্সন 1.2-এর আগের যেকোনও ভার্সন সহ ডিভাইসের জন্য LPA ডিফল্ট eUICC নির্ধারণ করে।

প্রয়োজনীয়তা

একাধিক ই-সিম ব্যবহার করার জন্য, ডিভাইসে একাধিক eUICC থাকতে হবে, যা বিল্ট-ইন eUICC বা ফিজিক্যাল সিম স্লট হতে পারে যেখানে সরানো যায় এমন eUICC যোগ করা যেতে পারে।

একাধিক eSIM কাজ করানোর জন্য Radio HAL ভার্সন 1.2 বা তার পরের যেকোনও ভার্সন থাকতে হবে। Radio HAL ভার্সন ১.৪ এবং RadioConfig HAL ভার্সন ১.২ ব্যবহার করার জন্য সাজেস্ট করা হয়।

প্রয়োগ

একাধিক eSIM (সরানো যায় এমন eUICC বা প্রোগ্রাম করা যায় এমন সিম সহ) সাপোর্ট করতে, LPA-কে অবশ্যই EuiccService ইমপ্লিমেন্ট করতে হবে, যা কলারের দেওয়া কার্ড আইডির সাথে সংশ্লিষ্ট স্লট আইডি রিসিভ করে।

arrays.xml -এ উল্লেখ করা non_removable_euicc_slots রিসোর্স হল পূর্ণসংখ্যার একটি অ্যারে যা ডিভাইসের বিল্ট-ইন eUICC-এর স্লট আইডি দেখায়। ইনসার্ট করা eUICC সরানো যাবে কিনা তা নির্ধারণ করার জন্য প্ল্যাটফর্মকে অনুমতি দিতে আপনাকে অবশ্যই এই রিসোর্স নির্দিষ্ট করতে হবে।

একাধিক ই-সিম সহ ডিভাইসের জন্য পরিষেবা প্রদানকারীর অ্যাপ

একাধিক eSIM সহ ডিভাইসের জন্য ক্যারিয়ার অ্যাপ তৈরি করার সময়, EuiccManager-এ createForCardId পদ্ধতি ব্যবহার করে একটি EuiccManager অবজেক্ট তৈরি করুন যা প্রদত্ত কার্ড আইডিতে পিন করা থাকে। কার্ড আইডি হল একটি পূর্ণসংখ্যা মান যা ডিভাইসে একটি UICC বা একটি eUICC-কে অনন্যভাবে শনাক্ত করে।

ডিভাইসের ডিফল্ট eUICC-এর জন্য কার্ড আইডি পেতে, TelephonyManager-এ getCardIdForDefaultEuicc মেথড ব্যবহার করুন। রেডিও HAL ভার্সন 1.2-এর থেকে কম হলে এই পদ্ধতি UNSUPPORTED_CARD_ID রিটার্ন করে এবং ডিভাইস eUICC না পড়লে UNINITIALIZED_CARD_ID রিটার্ন করে।

এছাড়াও, আপনি TelephonyManager-এ getUiccCardsInfo এবং getUiccSlotsInfo (সিস্টেম API) থেকে এবং SubscriptionInfo-এ getCardId থেকে কার্ড আইডি পেতে পারেন।

কোনও নির্দিষ্ট কার্ড আইডি সহ EuiccManager অবজেক্ট ইনস্ট্যানশিয়েট করা হলে, সব অপারেশন সেই কার্ড আইডি সহ eUICC-তে ডাইরেক্ট করা হয়। eUICC-তে পৌঁছানো না গেলে (যেমন, এটি বন্ধ বা সরিয়ে দেওয়া হলে) EuiccManager আর কাজ করে না।

ক্যারিয়ার অ্যাপ তৈরি করতে, আপনি নিম্নলিখিত কোড স্যাম্পেল ব্যবহার করতে পারেন।

উদাহরণ ১: অ্যাক্টিভ সাবস্ক্রিপশন পান এবং EuiccManager ইনস্ট্যানশিয়েট করুন

// Get the active subscription and instantiate an EuiccManager for the eUICC which holds
// that subscription
SubscriptionManager subMan = (SubscriptionManager)
        mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
int cardId = subMan.getActiveSubscriptionInfo().getCardId();
EuiccManager euiccMan = (EuiccManager) mContext.getSystemService(Context.EUICC_SERVICE)
            .createForCardId(cardId);

উদাহরণ ২: UICC-এর মাধ্যমে ইটারেট করা এবং EuiccManager ইনস্ট্যানশিয়েট করা রিমুভেবল eUICC-এর জন্য

// On a device with a built-in eUICC and a removable eUICC, iterate through the UICC cards
// to instantiate an EuiccManager associated with a removable eUICC
TelephonyManager telMan = (TelephonyManager)
        mContext.getSystemService(Context.TELEPHONY_SERVICE);
List<UiccCardInfo> infos = telMan.getUiccCardsInfo();
int removableCardId = -1; // valid cardIds are 0 or greater
for (UiccCardInfo info : infos) {
    if (info.isRemovable()) {
        removableCardId = info.getCardId();
        break;
    }
}
if (removableCardId != -1) {
    EuiccManager euiccMan = (EuiccManager) mContext.getSystemService(Context.EUICC_SERVICE)
            .createForCardId(removableCardId);
}

যাচাইকরণ

AOSP-তে LPA প্রয়োগ করা হয় না এবং আপনার কাছে সব Android বিল্ডে LPA উপলভ্য থাকবে বলে আশা করা হয় না (সব ফোনে eSIM কাজ করে না)। এই কারণে, কোনও এন্ড-টু-এন্ড CTS টেস্ট কেস নেই। তবে, Android বিল্ডে এক্সপোজড eUICC API যাতে বৈধ থাকে তা নিশ্চিত করতে, AOSP-তে বেসিক টেস্ট কেস উপলভ্য আছে।

আপনাকে নিশ্চিত করতে হবে যে বিল্ডগুলি নিম্নলিখিত CTS টেস্ট কেসগুলি (পাবলিক API-এর জন্য) পাস করেছে: /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts।

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

আপনি নিজের LPA তৈরি করলে, আপনাকে আরও কঠোর পরীক্ষার মধ্য দিয়ে যেতে হবে। সমস্যার সমাধান করতে এবং RSP আর্কিটেকচারের মধ্যে আপনার LPA-এর অপারেশন সংক্রান্ত তথ্য বিনিময় নিশ্চিত করতে, আপনাকে নিজের মডেম ভেন্ডর, eUICC চিপ বা eSIM OS ভেন্ডর, SM-DP+ ভেন্ডর এবং পরিষেবা প্রদানকারীর সাথে কাজ করতে হবে। অনেকখানি ম্যানুয়াল টেস্টিং অবশ্যই করতে হবে। সেরা টেস্ট কভারেজের জন্য, আপনাকে GSMA SGP.23 RSP টেস্ট প্ল্যান অনুসরণ করতে হবে।