eSIM প্রয়োগ করুন

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

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

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

চিত্র ১. সরলীকৃত আরএসপি স্থাপত্য

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

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

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

অ্যান্ড্রয়েড ১০ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলো একাধিক ই-সিম সমর্থন করতে পারে। আরও তথ্যের জন্য, ‘একাধিক ই-সিম সমর্থন করা’ দেখুন।

একটি ক্যারিয়ার অ্যাপ তৈরি করুন

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

ইউইকম্যানেজার

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

পাবলিক এপিআই ব্যবহার করার জন্য, একটি ক্যারিয়ার অ্যাপকে প্রথমে Context#getSystemService এর মাধ্যমে EuiccManager এর ইনস্ট্যান্সটি সংগ্রহ করতে হবে:

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

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

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 হতে হবে।

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

// 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.permissi>on.BR<OADCAST" /
    uses-permission android:name="com.your.company.l>pa.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-কে ক্লায়েন্ট অ্যাপের কোনো পরিবর্তন ছাড়াই ভবিষ্যতে ব্যবহারকারী-পুনরুদ্ধারযোগ্য সমস্যার নতুন হ্যান্ডলিং যোগ করার জন্য একটি সম্প্রসারণযোগ্য পদ্ধতি প্রদান করে।

অ্যান্ড্রয়েড ৯ 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-তে বিভিন্ন ক্যারিয়ারের সাবস্ক্রিপশন প্রোফাইল একসাথে থাকতে পারে, এবং প্রতিটি ক্যারিয়ার অ্যাপকে শুধুমাত্র সেই ক্যারিয়ারের মালিকানাধীন প্রোফাইলগুলো অ্যাক্সেস করার অনুমতি দেওয়া উচিত। উদাহরণস্বরূপ, ক্যারিয়ার A-এর ক্যারিয়ার B-এর মালিকানাধীন কোনো প্রোফাইল ডাউনলোড, সক্রিয় বা নিষ্ক্রিয় করার ক্ষমতা থাকা উচিত নয়।

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

  1. অপারেটর ক্যারিয়ার অ্যাপের APK-তে স্বাক্ষর করে; apksigner টুলটি APK-এর সাথে পাবলিক-কী সার্টিফিকেটটি সংযুক্ত করে।
  2. অপারেটর/এসএম-ডিপি+ একটি প্রোফাইল এবং এর মেটাডেটা প্রস্তুত করে, যার মধ্যে একটি এআরএফ (ARF) অন্তর্ভুক্ত থাকে, যাতে থাকে:

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

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

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

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

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

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
    }
}

অ্যাপ সাইনিং সম্পর্কে আরও বিস্তারিত জানতে, আপনার অ্যাপে স্বাক্ষর করুন (Sign your app) দেখুন। ক্যারিয়ার প্রিভিলেজ সম্পর্কে বিস্তারিত জানতে, UICC ক্যারিয়ার প্রিভিলেজ (UICC Carrier Privileges) দেখুন।

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

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

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

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

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

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

  • IRadioConfig HAL v1.0: getSimSlotsStatus

  • IRadioConfig AIDL v1.0: getAllowedCarriers

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

    • ভেন্ডর বা OEM-দের অবশ্যই IRadioSim.getAllowedCarriers()HAL API-টি ইমপ্লিমেন্ট করতে হবে।

    • ভেন্ডর RIL / মোডেম, IRadioSimResponse.getAllowedCarriersResponse()HAL API-এর অংশ হিসেবে, ডিভাইসটি যে ক্যারিয়ারে লক করা আছে তার লক স্ট্যাটাস এবং ক্যারিয়ারআইডি প্রদান করবে।

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

অ্যান্ড্রয়েড ১০ চালিত ডিভাইসগুলোর জন্য, একটি অপসারণযোগ্য নয় এমন 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_s>lots"
      <    > <     >item1/item
  <          /int>eger-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_removab>le_euicc_slots&q<uot;>
<     >          item1/<item>
<     >          ite<m2/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="n>on_remov<able>_<euicc>_slo<ts"
     > < item1/ite>m
   /integer-array
/resources

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

ইউইকসার্ভিস

একটি LPA দুটি পৃথক উপাদান নিয়ে গঠিত (উভয়ই একই APK-তে প্রয়োগ করা যেতে পারে): LPA ব্যাকএন্ড এবং LPA UI বা LUI।

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

<service
    android:name=".EuiccServiceImpl"
    android:permission="android.permission.BIND>_EUIC<C_SERVICE"
    intent-filter an>droid:pri<ority="100"
        action android:name="an>droid<.service.euicc>.<EuiccSer>vice" /
    /intent-filter
/service

অভ্যন্তরীণভাবে, অ্যান্ড্রয়েড ফ্রেমওয়ার্ক সক্রিয় LPA নির্ধারণ করে এবং অ্যান্ড্রয়েড eUICC API সমর্থন করার জন্য প্রয়োজন অনুযায়ী এটির সাথে কাজ করে। android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS পারমিশনযুক্ত সমস্ত অ্যাপের জন্য PackageManager কোয়েরি করা হয়, যা 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.permi>ssion<.BIND_EUICC_SERVICE"
    intent>-filter a<ndroid:priority="100"
        action android:name="android.service.>euicc.act<ion.MANAGE_EMBEDDED_SUBSCRIPTIONS" /
        action android:name="android.>service.e<uicc.action.PROVISION_EMBEDDED_SUBSCRIPTION" /
     >   catego<ry android:name="android.intent.category.DEFAULT" /
   >     <category andro>i<d:name=&q>uot;android.service.euicc.category.EUICC_UI" /
    /intent-filter
/activity

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

ইউইককার্ডম্যানেজার

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

ক্যারিয়ার অ্যাপস, এলপিএ, এবং ইউইক এপিআই

চিত্র ২. ক্যারিয়ার অ্যাপ এবং এলপিএ উভয়ই Euicc API ব্যবহার করে।

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

EuiccManager এর মতোই, EuiccCardManager API-গুলো ব্যবহার করার জন্য, আপনার LPA-কে প্রথমে Context#getSystemService এর মাধ্যমে EuiccCardManager এর ইনস্ট্যান্সটি সংগ্রহ করতে হবে:

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);

ক্যারিয়ার অ্যাপের মাধ্যমে একটি ই-সিম প্রোফাইল সক্রিয় করুন।

অ্যান্ড্রয়েড ৯ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতে, আপনি একটি ক্যারিয়ার অ্যাপ ব্যবহার করে ই-সিম সক্রিয় করতে এবং প্রোফাইল ডাউনলোড করতে পারেন। ক্যারিয়ার অ্যাপটি সরাসরি downloadSubscription কল করে অথবা LPA-কে একটি অ্যাক্টিভেশন কোড প্রদান করে প্রোফাইল ডাউনলোড করতে পারে।

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

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

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

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

ক্যারিয়ার eUICC প্রোভিশনিং পরিষেবা সংজ্ঞায়িত করুন

এলপিএ এবং ক্যারিয়ার অ্যাপ দুটি AIDL ইন্টারফেসের মাধ্যমে যোগাযোগ করে: ICarrierEuiccProvisioningService এবং IGetActivationCodeCallback । ক্যারিয়ার অ্যাপকে অবশ্যই একটি ICarrierEuiccProvisioningService ইন্টারফেস ইমপ্লিমেন্ট করতে হবে এবং এর ম্যানিফেস্ট ডিক্লারেশনে তা প্রকাশ করতে হবে। এলপিএ-কে অবশ্যই 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();
    }
    

এলপিএ বাস্তবায়নের উদাহরণ

ক্যারিয়ার অ্যাপের ICarrierEuiccProvisioningService ইমপ্লিমেন্টেশনের সাথে বাইন্ড করতে, LPA-কে অবশ্যই ICarrierEuiccProvisioningService.aidl এবং IGetActivationCodeCallback.aidl উভয় ফাইল আপনার প্রজেক্টে কপি করতে হবে এবং ServiceConnection ইমপ্লিমেন্ট করতে হবে।

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

ক্যারিয়ার অ্যাপের ICarrierEuiccProvisioningService ইমপ্লিমেন্টেশনের সাথে বাইন্ড করার পর, LPA-টি IGetActivationCodeCallback স্টাব ক্লাসের ইমপ্লিমেন্টেশন পাস করে ক্যারিয়ার অ্যাপ থেকে অ্যাক্টিভেশন কোড পাওয়ার জন্য getActivationCode অথবা getActivationCodeForEid কল করে।

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
    }
}

ক্যারিয়ার অ্যাপের জন্য বাস্তবায়নের উদাহরণ

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

  • AndroidManifest.xml

    <application>
      ...
      <service
          android:name=".CarrierEuiccProvisioningService"
          android:exported="true"
          android:permission="android.permission.WRIT>E_EMB<EDDED_SUBSCRI>PTIONS&<quot;
        intent-filter
          action android:name="android.service.euicc.action.>BIND_<CARRIER_PROVIS>ION<ING_SERV>ICE&quo<t;/
        /int>ent-filter
      /service
      ...
    /application
    

AIDL ক্যারিয়ার অ্যাপ সার্ভিসটি ইমপ্লিমেন্ট করতে, একটি সার্ভিস তৈরি করুন, Stub ক্লাসটি এক্সটেন্ড করুন এবং getActivationCodegetActivationCodeForEid মেথডগুলো ইমপ্লিমেন্ট করুন। এরপর 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);
              }
          }
    }
    

এলপিএ অ্যাক্টিভেশন ফ্লো-তে ক্যারিয়ার অ্যাপ UI শুরু করুন।

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

এলপিএ-তে একটি ক্যারিয়ার অ্যাপের ইউআই চালু করার প্রক্রিয়াটি হলো:

  1. এলপিএ (LPA) অ্যাকশন ধারণকারী ক্যারিয়ার অ্যাপ প্যাকেজে android.service.euicc.action.START_CARRIER_ACTIVATION ইন্টেন্টটি পাঠানোর মাধ্যমে ক্যারিয়ার অ্যাপের অ্যাক্টিভেশন ফ্লো চালু করে। (নন-এলপিএ অ্যাপ থেকে ইন্টেন্ট গ্রহণ এড়ানোর জন্য ক্যারিয়ার অ্যাপ রিসিভারকে ম্যানিফেস্ট ডিক্লারেশনে 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. ক্যারিয়ার অ্যাপটি setResult(int, Intent) এবং finish() কল করার মাধ্যমে LPA-তে সাড়া দেয়।

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

    নিরাপত্তাজনিত কারণে, এলপিএ-এর রেজাল্ট ইন্টেন্টে সরবরাহ করা অ্যাক্টিভেশন কোড সরাসরি গ্রহণ করা উচিত নয়, যাতে এলপিএ-বহির্ভূত কলাররা ক্যারিয়ার অ্যাপ থেকে অ্যাক্টিভেশন কোড পেতে না পারে।

ক্যারিয়ার অ্যাপে এলপিএ অ্যাক্টিভেশন ফ্লো চালু করুন

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

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

    <application>
      ...
    <activity
        android:name=".CarrierAppInitActivity"
        android:expor>ted=&q<uot;true"
    
        intent-filter an>droid:pri<ority="100"
            action android:name="android.service.eui>cc.ac<tion.START_EUI>C<C_ACTIVAT>ION&quo<t; /
        /in>tent-filter
    /activity
      ...
    /application
    
  2. ক্যারিয়ার অ্যাপটি তার নিজস্ব ইউজার ইন্টারফেস (UI) ব্যবহার করে কাজ করে। যেমন, ব্যবহারকারীকে লগ ইন করানো বা ক্যারিয়ারের ব্যাকএন্ডে HTTP রিকোয়েস্ট পাঠানো।

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

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

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

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

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

একাধিক ই-সিম সমর্থন করে

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

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

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

একাধিক ই-সিম সমর্থন করার জন্য রেডিও এইচএএল সংস্করণ ১.২ বা তার উচ্চতর সংস্করণ প্রয়োজন। রেডিও এইচএএল সংস্করণ ১.৪ এবং রেডিওকনফিগ এইচএএল সংস্করণ ১.২ ব্যবহার করার পরামর্শ দেওয়া হয়।

বাস্তবায়ন

একাধিক ই-সিম (অপসারণযোগ্য ইইউআইসিসি বা প্রোগ্রামেবল সিম সহ) সমর্থন করার জন্য, এলপিএ-কে অবশ্যই EuiccService বাস্তবায়ন করতে হবে, যা কলার-প্রদত্ত কার্ড আইডির সাথে সঙ্গতিপূর্ণ স্লট আইডি গ্রহণ করে।

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

একাধিক ই-সিম যুক্ত ডিভাইসের জন্য ক্যারিয়ার অ্যাপ

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

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

আপনি TelephonyManager এর getUiccCardsInfogetUiccSlotsInfo (সিস্টেম এপিআই) এবং 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-গুলো পুনরাবৃত্তি করুন এবং একটি অপসারণযোগ্য eUICC-এর জন্য EuiccManager ইনস্ট্যানশিয়েট করুন।

// 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 ইমপ্লিমেন্টেশন আসে না এবং সব অ্যান্ড্রয়েড বিল্ডে LPA উপলব্ধ থাকবে এমনটাও আশা করা হয় না (সব ফোন eSIM সাপোর্ট করে না)। এই কারণে, কোনো এন্ড-টু-এন্ড CTS টেস্ট কেস নেই। তবে, প্রকাশিত eUICC API-গুলো অ্যান্ড্রয়েড বিল্ডে বৈধ কিনা তা নিশ্চিত করার জন্য AOSP-তে বেসিক টেস্ট কেস পাওয়া যায়।

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

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

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