استخدام شريحة eSIM

تسمح تقنية شريحة SIM المضمّنة (eSIM أو eUICC) لمستخدمي الأجهزة الجوّالة بما يلي: يمكنك تنزيل ملف شخصي لمشغّل شبكة الجوّال وتفعيل خدمة مشغّل شبكة الجوّال بدون الحاجة إلى شريحة SIM. وهي مواصفات عالمية تستند إلى الجمعية الدولية لشبكات الهاتف الجوّال (GSMA) والتي تتيح توفير شريحة SIM عن بُعد (RSP) لأي جهاز محمول. البدء بـ Android 9، يوفر إطار عمل Android واجهات برمجة تطبيقات قياسية الوصول إلى شريحة eSIM وإدارة الملفات الشخصية للاشتراك على شريحة eSIM هذه eUICC واجهات برمجة التطبيقات (APIs) التي تمكّن الجهات الخارجية من تطوير تطبيقات مشغّل شبكة الجوّال وملفها الشخصي المحلي تطبيقات "مساعد Google" (LPA) على أجهزة Android المزوَّدة بشريحة eSIM.

"إعلانات الأنشطة التجارية" (LPA) هي تطبيق نظام مستقل يجب تضمينه في صورة إصدار Android يمكن بشكل عام إدارة الملفات الشخصية على شريحة eSIM من خلال لـ LPA، لأنها تعمل كجسر بين SM-DP+ (الخدمة عن بُعد التي وإعداد حزم الملف الشخصي وتخزينها وتسليمها إلى الأجهزة) وشريحة eUICC. يمكن أن تتضمن حزمة APK LPA بشكل اختياري مكونًا لواجهة المستخدم، يُسمى واجهة مستخدم LPA أو LUI توفير مكان مركزي للمستخدم لإدارة جميع الاشتراكات المضمّنة الشخصية. يعمل إطار عمل Android تلقائيًا على اكتشاف أفضل التطبيقات والاتصال بها LPA المتاحة، وتوجه جميع عمليات eUICC من خلال مثيل LPA.

البنية المبسّطة لتوفير المتطلبات اللازمة لشرائح SIM عن بُعد (RSP)

الشكل 1. بنية RSP المبسّطة

على مشغّلي شبكات الجوّال المهتمين بإنشاء تطبيق لمشغّل شبكة الجوّال الاطّلاع على واجهات برمجة التطبيقات في EuiccManager، والذي يوفر عمليات عالية المستوى لإدارة الملف الشخصي مثل downloadSubscription() وswitchToSubscription() و deleteSubscription()

إذا كنت مصنّعًا أصليًا للأجهزة وتريد إنشاء تطبيق نظام LPA خاص بك، يجب: توسيع EuiccService لإطار عمل Android للربط بخدمات إعلانات الأنشطة التجارية المحلية. بالإضافة إلى ذلك، واجهات برمجة التطبيقات (API) في EuiccCardManager، التي توفر وظائف ES10x استنادًا إلى الإصدار 2.0 من بروتوكول GSMA RSP. تُستخدَم هذه الدوال لإصدار أوامر لشريحة eUICC، مثل prepareDownload()، loadBoundProfilePackage()، retrieveNotificationList()، وresetMemory().

تتوفر واجهات برمجة التطبيقات في EuiccManager تطبيق تطبيق LPA منفّذ بشكل صحيح ليعمل ومتصل EuiccCardManager يجب أن تكون واجهات برمجة التطبيقات LPA. ويفرض ذلك إطار عمل Android.

يمكن أن تتوافق الأجهزة التي تعمل بنظام التشغيل Android 10 أو الإصدارات الأحدث أجهزة مزوّدة بشرائح eSIM متعددة. لمزيد من المعلومات، يُرجى مراجعة التوافق مع شرائح eSIM متعددة

إنشاء تطبيق مشغّل شبكة جوّال

تتيح واجهات برمجة التطبيقات eUICC في Android 9 إمكانية مشغلي شبكات الجوال لإنشاء تطبيقات تحمل العلامة التجارية لشركة الجوال لإدارة ملفات التعريف مباشرةً. يشمل ذلك تنزيل الملفات الشخصية للاشتراك وحذفها. مملوكًا لمشغّل شبكة الجوّال، بالإضافة إلى التبديل إلى ملف شخصي يملكه مشغّل شبكة الجوّال.

مدير EuiccManager

EuiccManager هي نقطة الدخول الرئيسية التي تتيح للتطبيقات التفاعل مع إعلانات الأنشطة التجارية المحلية. يشمل ذلك تطبيقات مشغّل شبكة الجوّال التي تنزّل المحتوى وتحذفه وتحوّله إلى الاشتراكات المملوكة لمشغِّل شبكة الجوّال. ويتضمن ذلك أيضًا تطبيق نظام LUI، الذي توفّر موقعًا مركزيًا/واجهة مستخدم لإدارة جميع الاشتراكات المضمّنة يمكن أن يكون تطبيقًا منفصلاً عن التطبيق الذي يوفّر EuiccService.

لاستخدام واجهات برمجة التطبيقات العامة، يجب أن يحصل تطبيق مشغّل شبكة الجوّال أولاً على مثيل من EuiccManager إلى Context#getSystemService:

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

يجب التحقق مما إذا كانت شريحة eSIM متوافقة مع الجهاز قبل تنفيذ أي عمليات eSIM. تعرض الدالة EuiccManager#isEnabled() عادةً القيمة true إذا كانت يتم تحديد ميزة android.hardware.telephony.euicc ويتم تصنيف حزمة إعلانات الأنشطة التجارية المحلية حاليًا.

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

للحصول على معلومات حول أجهزة eUICC وإصدار نظام تشغيل eSIM:

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

تستخدم العديد من واجهات برمجة التطبيقات، مثل downloadSubscription() وswitchToSubscription()، 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.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 وأمثلة على الرموز البرمجية، يمكنك الاطّلاع على واجهات برمجة تطبيقات eUICC.

الأخطاء القابلة للحلّ

في بعض الحالات، يتعذّر على النظام إكمال عملية eSIM. ولكن يمكن للمستخدم حل الخطأ. على سبيل المثال: downloadSubscription قد يتعذّر تنفيذ الإجراء إذا كانت البيانات الوصفية للملف الشخصي تشير إلى أنّ رمز تأكيد مشغّل شبكة الجوّال مطلوبة. أو قد يتعذّر تنفيذ سياسة switchToSubscription إذا كان تطبيق مشغّل شبكة الجوّال لديه مشغّل شبكة جوّال. امتيازات على الملف الشخصي الوجهة (أي أن مشغِّل شبكة الجوّال يمتلك الملف الشخصي) ولكن لا يمتلك امتيازات مشغِّل شبكة الجوّال مقارنةً بالملف الشخصي المفعَّل حاليًا، وبالتالي موافقة المستخدم مطلوبة.

في هذه الحالات، يتم استدعاء معاودة الاتصال للمتصل باستخدام EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR معاودة الاتصال يحتوي Intent على ميزات إضافية داخلية، لذلك عندما يمرّره المتصل إلى EuiccManager#startResolutionActivity, الحل من خلال LUI. يعد استخدام رمز التأكيد المثال مرة أخرى، EuiccManager#startResolutionActivity تؤدي إلى تشغيل شاشة LUI تتيح للمستخدم إدخال رمز التأكيد بعد إدخال الرمز، يتم استئناف عملية التنزيل. هذا الأسلوب تزويد تطبيق مشغل شبكة الجوال بالتحكم الكامل في وقت عرض واجهة المستخدم، ولكنه يوفر 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 من واجهات برمجة التطبيقات. في ما يلي توضيح للعملية رفيعة المستوى:

  1. يوقّع عامل التشغيل على حزمة APK الخاصة بتطبيق مشغّل شبكة الجوّال. الـ apksigner شهادة المفتاح العام بملف APK.
  2. يعمل عامل التشغيل/SM-DP+ على إعداد ملف شخصي وبياناته الوصفية، والتي تشمل إطار عمل ARF يحتوي على:

    1. توقيع (SHA-1 أو SHA-256) لشهادة المفتاح العام لتطبيق مشغّل شبكة الجوّال (يجب ملء هذا الحقل)
    2. اسم حزمة تطبيق مشغّل شبكة الجوّال (يُنصح به بشدة)
  3. يحاول تطبيق مشغّل شبكة الجوّال تنفيذ عملية eUICC باستخدام واجهة برمجة التطبيقات EuiccManager.

  4. يتحقّق نظام Android الأساسي من تجزئة SHA-1 أو SHA-256 في تطبيق المتصل. تتطابق مع توقيع الشهادة التي تم الحصول عليها من ARF للملف الشخصي المستهدف. إذا كان اسم حزمة تطبيق مشغّل شبكة الجوّال مُدرجًا في ARF، فيجب أن يتطابق أيضًا مع اسم حزمة تطبيق المتصل.

  5. بعد إثبات صحة التوقيع واسم الحزمة (إذا كانا مُدرَجَين)، يتم منح امتياز مشغّل شبكة الجوّال لتطبيق المتّصل بدلاً من الملف الشخصي المستهدَف.

نظرًا لأن البيانات الوصفية للملف الشخصي يمكن أن تكون متاحة خارج الملف الشخصي نفسه (بحيث يمكن لـ LPA استرداد البيانات الوصفية للملف الشخصي من SM-DP+ قبل تحميل الملف الشخصي بالفعل، أو من ISD-R عند تعطيل الملف الشخصي)، يجب أن تحتوي على نفس قواعد امتيازات مشغل شبكة الجوال كما في الملف الشخصي.

يجب أن يتيح نظام التشغيل eUICC و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 تقدم الأقسام التالية نظرة عامة موجزة عن إنشاء تطبيق LPA ودمجه مع نظام Android.

متطلبات الأجهزة أو المودم

يجب أن يتوافق تطبيق LPA ونظام التشغيل eSIM على شريحة eUICC مع بروتوكول GSMA RSP على الأقل (عن بُعد. توفير شريحة SIM) الإصدار 2.0 أو الإصدار 2.2. يجب عليك أيضًا أن تخطط لاستخدام SM-DP+ وSM-DS ذات إصدار RSP مطابق. للحصول على بنية RSP التفصيلية، راجع مواصفات بنية بروتوكول GSMA SGP.21 RSP.

بالإضافة إلى ذلك، يمكن الدمج مع واجهات برمجة تطبيقات eUICC في Android 9، يجب أن يرسل مودم الجهاز إمكانات الوحدة الطرفية مع دعم إمكانات eUICC المشفرة (إدارة الملفات الشخصية المحلية تنزيل الملف الشخصي). يجب أيضًا تنفيذ الطرق التالية:

  • الإصدار 1.1 من IRadio HAL: setSimPower
  • الإصدار 1.2 من IRadio HAL: getIccCardStatus

  • الإصدار 1.0 من IRadioConfig HAL: getSimSlotsStatus

  • الإصدار 1.0 من IRadioConfig AIDL: getAllowedCarriers

    يجب أن تعرف "إعلانات الأنشطة التجارية المحلية" في Google حالة قفل مشغّل شبكة الجوّال لتتمكّن من السماح لمشغّل شبكة الجوّال بتنزيل شريحة eSIM أو نقلها فقط. وإلا فقد ينتهي الأمر بالمستخدمين بتنزيل شريحة SIM ونقلها ثم يدركون لاحقًا أن الجهاز مقفل أمام مشغِّل شبكة جوّال آخر.

    • على المورّدين أو المصنّعين الأصليين للأجهزة تنفيذ واجهة برمجة التطبيقات IRadioSim.getAllowedCarriers()HAL API.

    • على المورّد RIL / مودم ملء حالة القفل ومعرّف شركة النقل لمشغِّل شبكة الجوّال حيث يكون الجهاز مقفلاً، وذلك كجزء من واجهة برمجة التطبيقات IRadioSimResponse.getAllowedCarriersResponse()HAL.

من المفترض أن يتعرّف المودم على شريحة eSIM مع تفعيل الملف الشخصي التلقائي للتشغيل. شريحة SIM صالحة وإبقاء شريحة 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

يتألّف هذا الإعلان من مكوّنَين منفصلَين (يمكن تنفيذ كلّ منهما في APK): الواجهة الخلفية LPA وواجهة مستخدم LPA أو 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 "إعلانات الأنشطة التجارية المحلية" النشطة ويتفاعل مع حسب الحاجة لدعم واجهات برمجة تطبيقات Android eUICC. تم الاستعلام عن PackageManager عن جميع التطبيقات التي لديها إذن android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS ويحدّد خدمة للإجراء android.service.euicc.EuiccService. يتم اختيار الخدمة ذات الأولوية القصوى. في حال عدم العثور على أي خدمة، يتم استخدام إعلانات الأنشطة التجارية المحلية. تم إيقاف الدعم.

لتنفيذ 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>

وهذا يعني أن واجهة المستخدم التي تطبق هذه الشاشات يمكن أن تأتي من حزمة APK من التطبيق الذي ينفذ EuiccService ما إذا كان لديك حزمة APK واحدة أو عدة حِزم APK (على سبيل المثال، حزمة قابلة للتنفيذ) EuiccService وأحد الخيارات التي توفّر أنشطة LUI) هو اختيار للتصميم.

مدير EuiccCard

EuiccCardManager هي واجهة للاتصال بشريحة eSIM. أُنشأها جون هنتر، الذي كان متخصصًا وتوفر وظائف ES10 (كما هو موضح في مواصفات GSMA RSP) أوامر طلب/استجابة APDU منخفضة المستوى بالإضافة إلى تحليل ASN.1. EuiccCardManager هي واجهة برمجة تطبيقات للنظام ولا يمكن طلبها إلا من خلال الأذونات التي يمنحها النظام التطبيقات.

تطبيقات مشغِّل شبكة الجوّال وواجهات برمجة التطبيقات LPA وEuicc

الشكل 2. كل من تطبيق مشغّل شبكة الجوّال و"إعلانات المنتجات داخل المتجر" تستخدم واجهات Euicc API

تتطلّب واجهات برمجة التطبيقات لعملية الملف الشخصي من خلال EuiccCardManager أن يكون المتصل LPA. ويفرض ذلك إطار عمل Android. هذا يعني أن المتصل يجب أن يتم توسيع نطاق EuiccService وأن يتم الإعلان عنه في ملف البيان، على النحو الموضَّح في الأقسام السابقة.

كما هي الحال في EuiccManager، لاستخدام واجهات برمجة التطبيقات EuiccCardManager، يجب أن يكون منتج 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 بـ EuiccCardController (الذي يتم تشغيله في الهاتف) من خلال واجهة AIDL، وكل طريقة من طرق EuiccCardManager تتلقّى معاودة الاتصال من خلال عملية الهاتف من خلال واجهة AIDL مختلفة ومخصّصة من واجهة pyplot. عند استخدام واجهات برمجة تطبيقات EuiccCardManager، على المتصل (LPA) تقديم Executor الكائن الذي يتم استدعاء رد الاتصال من خلاله. قد يتم تشغيل كائن Executor هذا في سلسلة محادثات واحدة أو مجموعة سلاسل محادثات من اختيارك

معظم واجهات برمجة تطبيقات EuiccCardManager لها نمط الاستخدام نفسه. على سبيل المثال، لتحميل حزمة الملف الشخصي المرتبطة بـ eUICC:

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

للتبديل إلى ملف شخصي مختلف بمعرّف ICCID محدد:

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

للحصول على عنوان SM-DP+ التلقائي من شريحة eUICC:

...
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 من نظام التشغيل Android أو الإصدارات الأحدث، يمكنك استخدام تطبيق مشغّل شبكة الجوّال لتفعيلها. شريحة eSIM وتنزيل الملفات الشخصية يمكن لتطبيق مشغّل شبكة الجوّال تنزيل الملفات الشخصية عن طريق يتصل downloadSubscription مباشرةً أو من خلال تقديم رمز تفعيل إلى "إعلانات الأنشطة التجارية" (LPA).

عندما ينزِّل أحد تطبيقات مشغّل شبكة الجوّال ملفًا شخصيًا من خلال الاتصال downloadSubscription، تفرض المكالمة إمكانية إدارة التطبيق للملف الشخصي من خلال BF76 علامة البيانات الوصفية يعمل على ترميز قواعد امتيازات مشغِّل شبكة الجوّال بك. إذا كان الملف الشخصي لا يحتوي على علامة BF76 أو إذا كانت العلامة BF76 لا تحتوي على هذه العلامة تطابق توقيع تطبيق مشغّل شبكة الجوّال، فسيتم رفض التنزيل.

يصف القسم أدناه تفعيل شريحة eSIM من خلال أحد تطبيقات مشغّل شبكة الجوّال باستخدام رمز التفعيل.

تفعيل شريحة eSIM باستخدام رمز تفعيل

عند استخدام رمز تفعيل لتفعيل ملف شخصي لشريحة eSIM، تجلب "إعلانات الأنشطة التجارية المحلية" (LPA) رمز تفعيل من تطبيق مشغل شبكة الجوال ويقوم بتنزيل ملف التعريف. يمكن بدء هذا المسار من خلال "إعلانات المنتجات داخل المتجر" ويمكن لـ LPA التحكم في تدفق واجهة المستخدم بالكامل، مما يعني أنه لا توجد واجهة مستخدم لتطبيق مشغّل شبكة الجوّال كما هو موضح. تتجاوز هذه الطريقة التحقّق من علامة BF76، ولا ينفّذها مشغّلو الشبكة. يجب تنفيذ مسار واجهة مستخدم تفعيل شريحة eSIM بالكامل، بما في ذلك تنزيل الملف الشخصي لشريحة eSIM ومعالجة الأخطاء

تحديد خدمة توفير eUICC لمشغّل شبكة الجوّال

يتواصل تطبيق "إعلانات الأنشطة التجارية" (LPA) وتطبيق مشغّل شبكة الجوّال من خلال برنامج AIDL الواجهات: ICarrierEuiccProvisioningService وIGetActivationCodeCallback شركة النقل أن يستخدم التطبيق واجهة ICarrierEuiccProvisioningService عريضه في بيان البيان. يجب أن يلتزم "إعلانات المنتجات داخل المتجر" بـ "ICarrierEuiccProvisioningService" وتنفيذه. IGetActivationCodeCallback لمزيد من المعلومات حول كيفية تنفيذ عرض واجهة AIDL، يمكنك الاطّلاع على مقالة تعريف واجهة AIDL.

لتحديد واجهات AIDL، أنشئ ملفات AIDL التالية. لكلّ من "إعلانات الأنشطة التجارية" (LPA) وتطبيقات مشغّلي شبكة الجوّال

  • 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 لمشغّل شبكة الجوّال بربط ملف شخصي مسبقًا بحساب الجهاز. معرّف شريحة SIM المضمّنة (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 مشروعك والإعلان عن خدمة 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);
              }
          }
    }
    

بدء واجهة مستخدم تطبيق مشغّل شبكة الجوّال خلال مسار تفعيل "إعلانات الأنشطة التجارية المحلية"

على الأجهزة التي تعمل بنظام التشغيل Android 11 والإصدارات الأحدث، يمكن لـ LPA بدء واجهة المستخدم لتطبيق مشغل شبكة الجوال. ويعد هذا أمرًا مفيدًا حيث إن تطبيق مشغل شبكة الجوال قد يتطلب معلومات إضافية من المستخدم قبل تقديم رمز التفعيل إلى "إعلانات المنتجات داخل المتجر". على سبيل المثال، قد يختار مشغّلو شبكات الجوّال مطالبة المستخدمين بتسجيل الدخول لتفعيل أرقام هواتفهم أو إجراء عمليات نقل أخرى

في ما يلي خطوات بدء واجهة مستخدم لتطبيق مشغّل شبكة الجوّال في "إعلانات الأنشطة التجارية المحلية":

  1. تُطلق "إعلانات الأنشطة التجارية المحلية" خطوات تفعيل تطبيق مشغّل شبكة الجوّال من خلال إرسال 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. ينفّذ تطبيق مشغّل شبكة الجوّال عمله باستخدام واجهة المستخدم الخاصة به. على سبيل المثال، يمكن أن يؤدي تسجيل في واجهة المستخدم أو إرسال طلبات HTTP إلى الواجهة الخلفية لمشغِّل شبكة الجوّال.

  3. يردّ تطبيق مشغّل شبكة الجوّال على "إعلانات الأنشطة التجارية" (LPA) من خلال الاتصال بالرقم setResult(int, Intent). وfinish().

    1. إذا استجاب تطبيق مشغّل شبكة الجوّال بطلب RESULT_OK، سيتم تعديل بنود الخدمة. سيواصل تدفق التفعيل. إذا حدّد تطبيق مشغّل شبكة الجوّال أنّ على المستخدم مسح رمز الاستجابة السريعة ضوئيًا بدلاً من السماح لـ LPA بربط مشغِّل شبكة الجوّال. خدمة التطبيق، يستجيب تطبيق مشغّل شبكة الجوّال لـ LPA باستخدام setResult(int, Intent) مع RESULT_OK ومثال Intent التي تحتوي على القيمة المنطقية الإضافية تم ضبط android.telephony.euicc.extra.USE_QR_SCANNER على true. إعلانات الأنشطة التجارية المحلية ثم يتحقق من الرقم الإضافي ويشغِّل الماسح الضوئي لرمز الاستجابة السريعة بدلاً من الربط تنفيذ ICarrierEuiccProvisioningService لتطبيق مشغّل شبكة الجوّال.
    2. في حال تعطُّل تطبيق مشغّل شبكة الجوّال أو الردّ باستخدام RESULT_CANCELED (هذا هو رمز الاستجابة التلقائي)، تُلغي "إعلانات الأنشطة التجارية" (LPA) شريحة eSIM عملية التفعيل.
    3. إذا استجاب تطبيق مشغّل شبكة الجوّال بعبارة أخرى غير RESULT_OK أو RESULT_CANCELED، يتعامل مع "إعلانات الأنشطة التجارية المحلية" على أنّه خطأ.

    لأسباب تتعلق بالأمان، ينبغي ألا تقبل إعلانات الأنشطة التجارية المحلية رمز التفعيل المقدَّم في النتيجة المقصودة لضمان عدم عرض الإعلانات لا يمكن للمتصلين الحصول على رمز التفعيل من تطبيق مشغّل شبكة الجوّال.

بدء مسار تفعيل "إعلانات الأنشطة التجارية المحلية" في أحد تطبيقات مشغّل شبكة الجوّال

بدءًا من نظام التشغيل Android 11، يمكن لتطبيقات مشغّل شبكة الجوّال استخدام واجهات برمجة التطبيقات eUICC لبدء واجهة مستخدم جديدة (LUI) لشريحة eSIM التفعيل. تعرض هذه الطريقة واجهة مستخدم مسار تفعيل شريحة eSIM الخاصة بإعلانات التطبيقات الأقل أمانًا من أجل التفعيل. الملف الشخصي لشريحة eSIM. بعد ذلك، تُرسِل "إعلانات الأنشطة التجارية المحلية" (LPA) البث عندما يكون الملف الشخصي لشريحة eSIM. ينتهي التفعيل.

  1. يجب أن تعلن "إعلانات الأنشطة التجارية المحلية" عن نشاط يتضمّن فلتر أهداف يتضمّن الإجراء 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. ينفّذ تطبيق مشغّل شبكة الجوّال عمله باستخدام واجهة المستخدم الخاصة به. على سبيل المثال، يمكن أن يؤدي تسجيل في واجهة المستخدم أو إرسال طلبات HTTP إلى الواجهة الخلفية لمشغِّل شبكة الجوّال.

  3. في هذه المرحلة، يجب أن يكون تطبيق مشغّل شبكة الجوّال جاهزًا لتقديم طلب تفعيل. من خلال تنفيذ ICarrierEuiccProvisioningService. تشير رسالة الأشكال البيانية تطبيق مشغّل شبكة الجوّال يطلق "إعلانات الأنشطة التجارية المحلية" من خلال الاتصال startActivityForResult(Intent, int) مع android.telephony.euicc.action.START_EUICC_ACTIVATION اتخاذ القرار. تفحص "إعلانات الأنشطة التجارية المحلية" أيضًا القيمة المنطقية الإضافية android.telephony.euicc.extra.USE_QR_SCANNER إذا كانت القيمة هي true، يتم تُطلق إعلانات LPA الماسح الضوئي لرمز الاستجابة السريعة للسماح للمستخدم بمسح رمز الاستجابة السريعة الخاص بالملف الشخصي ضوئيًا.

  4. من جانب "إعلانات الأنشطة التجارية المحلية"، ترتبط هذه الإعلانات تنفيذ ICarrierEuiccProvisioningService لاسترجاع التفعيل الرمز وتنزيل الملف الشخصي المطابق. يعرض إعلانات الأنشطة التجارية المحلية كل ما يلزم عناصر واجهة المستخدم أثناء عملية التنزيل، مثل شاشة التحميل

  5. عند اكتمال تدفق تفعيل إعلانات الأنشطة التجارية المحلية، يستجيب هذا الطلب تطبيق مشغّل شبكة الجوّال برمز النتيجة الذي يتعامل معه تطبيق مشغّل شبكة الجوّال onActivityResult(int, int, Intent)

    1. إذا نجحت "إعلانات الأنشطة التجارية المحلية" في تنزيل الملف الشخصي الجديد لشريحة eSIM، ويستجيب باستخدام RESULT_OK.
    2. إذا ألغى المستخدم تفعيل الملف الشخصي لشريحة eSIM من خلال "إعلانات المنتجات المحلية"، سيتم ويستجيب باستخدام RESULT_CANCELED.
    3. في حال استجابة "إعلانات الأنشطة التجارية" (LPA) بشيء آخر غير RESULT_OK أو RESULT_CANCELED، يتعامل تطبيق مشغّل شبكة الجوّال مع هذا الإجراء على أنّه خطأ.

    لأسباب تتعلق بالأمان، لا تقبل "إعلانات الأنشطة التجارية" (LPA) رمز التفعيل مباشرةً في الغرض المقدَّم لضمان عدم تمكّن المتصلين غير التابعين لـ "إعلانات Google" من الحصول على رمز التفعيل من تطبيق مشغّل شبكة الجوّال.

إمكانية استخدام شرائح eSIM متعددة

بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 10 أو الإصدارات الأحدث، يجب تنفيذ ما يلي: فئة واحدة (EuiccManager) متوافقة مع الأجهزة مع شرائح eSIM متعددة الأجهزة التي تستخدم شريحة eSIM واحدة والتي ستتم ترقيتها إلى الإصدار 10 من نظام التشغيل Android لا تتطلّب أي تعديل على تنفيذ "إعلانات المنتجات داخل المتجر" بصفتها المنصة تربط المثيل EuiccManager تلقائيًا بـ eUICC التلقائية. تشير رسالة الأشكال البيانية يتم تحديد قيمة eUICC التلقائية من خلال النظام الأساسي للأجهزة التي تستخدم إصدار HAL للراديو 1.2 أو أعلى وبواسطة "إعلانات الأنشطة التجارية" (LPA) للأجهزة التي تعمل بإصدارات HAL للراديو أقل من 1.2.

المتطلبات

للتوافق مع شرائح eSIM متعددة، يجب أن يحتوي الجهاز على أكثر من eUICC واحدة، والتي يمكنها تكون إما eUICC مدمَجة أو فتحة لشريحة SIM، حيث يمكن إنشاء رموز eUICC قابلة للإزالة تم إدراجها.

يلزم توفُّر الإصدار 1.2 من تقنية HAL للراديو أو إصدار أحدث للتوافق مع شرائح eSIM متعددة. طبقة تجريد الأجهزة (HAL) للراديو يُنصح باستخدام الإصدار 1.4 والإصدار 1.2 من RadioConfig HAL.

التنفيذ

للتوافق مع عدة شرائح eSIM (بما في ذلك شرائح SIM القابلة للبرمجة أو شرائح SIM قابلة للإزالة) (بما في ذلك شرائح SIM القابلة للبرمجة) يجب تنفيذ إعلانات الأنشطة التجارية المحلية EuiccService، التي تتلقّى رقم تعريف الخانة المتوافق مع رقم تعريف البطاقة التي يقدّمها المتصل.

تشير رسالة الأشكال البيانية non_removable_euicc_slots المورد المحدَّد في arrays.xml هو مصفوفة من الأعداد الصحيحة التي تمثّل معرّفات الخانات المضمنة في الجهاز eUICCs. يجب تحديد هذا المورد للسماح للمنصة بتحديد ما إذا كانت eUICC التي تم إدراجها قابلة للإزالة أم لا.

تطبيق مشغّل شبكة الجوّال على جهاز يتضمن شرائح eSIM متعددة

عند إنشاء تطبيق مشغّل شبكة جوّال لجهاز مزوّد بشرائح eSIM متعددة، استخدِم createForCardId في EuiccManager لإنشاء كائن EuiccManager تم تثبيته معرف البطاقة المحدد. رقم تعريف البطاقة هو قيمة عددية تُعرّف UICC بشكلٍ فريد أو eUICC على الجهاز.

للحصول على رقم تعريف البطاقة لواجهة eUICC التلقائية للجهاز، استخدِم getCardIdForDefaultEuicc في TelephonyManager. تُرجع هذه الطريقة UNSUPPORTED_CARD_ID إذا كان إصدار HAL للراديو أقل من 1.2 ويتم عرضه UNINITIALIZED_CARD_ID إذا لم يقرأ الجهاز eUICC.

يمكنك أيضًا الحصول على أرقام تعريف البطاقات من getUiccCardsInfo وgetUiccSlotsInfo (واجهة برمجة تطبيقات النظام) في TelephonyManager، getCardId في SubscriptionInfo.

عند إنشاء مثيل لعنصر 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: التكرار عبر UICCs وإنشاء مثيل 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 (لا يتوافق كل الهاتف مع شريحة eSIM). بالنسبة لهذا السبب، لا توجد حالات اختبار CTS الشاملة. ومع ذلك، فإن حالات الاختبار الأساسية تتوفّر في AOSP لضمان ظهور واجهات برمجة تطبيقات eUICC المعروضة صالحة في إصدارات Android.

يجب التأكّد من أنّ الإصدارات تجتاز حالات اختبار CTS التالية (للجميع واجهات برمجة التطبيقات: /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts.

على مشغّلي شبكات الجوّال الذين يطبّقون أحد تطبيقات مشغّل شبكة الجوّال أن يجتازوا إجراءاتهم الداخلية المعتادة. ضمان الجودة لضمان عمل جميع الميزات التي تم تنفيذها كما هو متوقع. في جلسة المعمل، على الأقل، يجب أن يتمكّن تطبيق مشغّل شبكة الجوّال من إدراج جميع الملفات الشخصية للاشتراك. الذي يمتلكه عامل التشغيل نفسه، تنزيل ملف شخصي وتثبيته، تفعيل خدمة في الملف الشخصي، والتبديل بين الملفات الشخصية وحذف الملفات الشخصية.

إذا كنت تصمم إعلانات LPA الخاصة بك، عليك تطبيق نهج أكثر صرامة اختبار الفرضية. يجب التواصل مع مورّد المودم أو شريحة eUICC أو مورّد نظام التشغيل eSIM. وبإمكان مورّدي خدمة SM-DP+ ومشغّلي شبكات الجوّال حلّ المشاكل وضمان التشغيل البيني إعلانات LPA ضمن بنية RSP واعلم أن قدرًا كبيرًا من الاختبار اليدوي أمرًا لا مفر منه. وللحصول على أفضل تغطية للاختبار، عليك اتّباع خطة اختبار GSMA SGP.23 RSP.