eSIM প্রয়োগ করা হচ্ছে

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

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

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

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

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

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

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

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

কোনো eSIM অপারেশন করার আগে আপনার ডিভাইসে eSIM সমর্থিত কিনা তা পরীক্ষা করা উচিত। 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();

অনেক API, যেমন downloadSubscription() এবং switchToSubscription() , 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 APIs দেখুন।

সমাধানযোগ্য ত্রুটি

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

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

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

    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 ক্যারিয়ার বিশেষাধিকারে সংজ্ঞায়িত অ্যাক্সেস রুল অ্যাপলেট (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
    }
}

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

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

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

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

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/মডেম ক্যারিয়ারের লক স্ট্যাটাস এবং ক্যারিয়ার আইডি পূরণ করবে।

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

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>

অভ্যন্তরীণভাবে, অ্যান্ড্রয়েড ফ্রেমওয়ার্ক সক্রিয় এলপিএ নির্ধারণ করে এবং অ্যান্ড্রয়েড 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 থাকবে কিনা (উদাহরণস্বরূপ, যেটি EuiccService প্রয়োগ করে এবং একটি যে LUI কার্যকলাপ প্রদান করে) একটি ডিজাইন পছন্দ।

EuiccCardManager

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

ক্যারিয়ার অ্যাপ, LPA, এবং Euicc APIs

চিত্র 2. ক্যারিয়ার অ্যাপ এবং LPA উভয়ই 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);

একটি ক্যারিয়ার অ্যাপের মাধ্যমে একটি eSIM প্রোফাইল সক্রিয় করা হচ্ছে

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

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

নীচের বিভাগে একটি অ্যাক্টিভেশন কোড ব্যবহার করে ক্যারিয়ার অ্যাপের মাধ্যমে একটি eSIM সক্রিয় করার বর্ণনা রয়েছে।

একটি অ্যাক্টিভেশন কোড ব্যবহার করে eSIM সক্রিয় করা হচ্ছে

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

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

LPA কে ক্যারিয়ার অ্যাপের সাথে আবদ্ধ করার জন্য, ক্যারিয়ার অ্যাপটিকে অবশ্যই আপনার প্রোজেক্টে ICarrierEuiccProvisioningService.aidl এবং IGetActivationCodeCallback.aidl উভয়ই কপি করতে হবে এবং AndroidManifest.xml ফাইলে ICarrierEuiccProvisioningService পরিষেবা ঘোষণা করতে হবে। পরিষেবাটির অবশ্যই 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 এ একটি অ্যাক্টিভেশন কোড সরবরাহ করার আগে ব্যবহারকারীর কাছ থেকে অতিরিক্ত তথ্যের প্রয়োজন হতে পারে। উদাহরণস্বরূপ, ক্যারিয়ারগুলি ব্যবহারকারীদের তাদের ফোন নম্বর সক্রিয় করতে বা অন্যান্য পোর্টিং পরিষেবাগুলি সম্পাদন করতে লগ ইন করতে হতে পারে৷

এটি এলপিএ-তে ক্যারিয়ার অ্যাপের UI শুরু করার প্রক্রিয়া:

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

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

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

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

অ্যান্ড্রয়েড 11 থেকে শুরু করে, ক্যারিয়ার অ্যাপগুলি eSIM অ্যাক্টিভেশনের জন্য একটি LUI শুরু করতে eUICC API ব্যবহার করতে পারে। এই পদ্ধতিটি eSIM প্রোফাইল সক্রিয় করতে LPA-এর eSIM অ্যাক্টিভেশন ফ্লো UI-কে সারফেস করে। eSIM প্রোফাইল অ্যাক্টিভেশন শেষ হলে 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 বাস্তবায়নের মাধ্যমে একটি অ্যাক্টিভেশন কোড সরবরাহ করতে প্রস্তুত থাকতে হবে। ক্যারিয়ার অ্যাপ android.telephony.euicc.action.START_EUICC_ACTIVATION অ্যাকশন সহ startActivityForResult(Intent, int) কল করে LPA চালু করে। LPA এছাড়াও বুলিয়ান অতিরিক্ত android.telephony.euicc.extra.USE_QR_SCANNER চেক করে। মানটি true হলে, ব্যবহারকারীকে প্রোফাইল QR কোড স্ক্যান করতে দেওয়ার জন্য LPA QR স্ক্যানার চালু করে।

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

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

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

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

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

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

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

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

একাধিক eSIM সমর্থন করার জন্য রেডিও HAL সংস্করণ 1.2 বা উচ্চতর প্রয়োজন৷ রেডিও HAL সংস্করণ 1.4 এবং RadioConfig HAL সংস্করণ 1.2 সুপারিশ করা হয়।

বাস্তবায়ন

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

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

একাধিক eSIM সহ ডিভাইসের জন্য ক্যারিয়ার অ্যাপ

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

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

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

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

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

উদাহরণ 1: সক্রিয় সাবস্ক্রিপশন পান এবং 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);

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

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

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

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