การใช้งาน eSIM

เทคโนโลยี Embedded SIM (eSIM หรือ eUICC) ช่วยให้ผู้ใช้อุปกรณ์พกพาดาวน์โหลดโปรไฟล์ผู้ให้บริการและเปิดใช้งานบริการของผู้ให้บริการโดยไม่ต้องมีซิมการ์ดจริง เป็นข้อกำหนดสากลที่ขับเคลื่อนโดย GSMA ที่เปิดใช้งานการจัดเตรียม SIM ระยะไกล (RSP) ของอุปกรณ์มือถือใดๆ เริ่มตั้งแต่ Android 9 เป็นต้นไป เฟรมเวิร์กของ Android จะจัดเตรียม API มาตรฐานสำหรับการเข้าถึง eSIM และจัดการโปรไฟล์การสมัครรับข้อมูลบน eSIM เหล่านี้ APIs eUICC ช่วยให้บุคคลที่สามในการพัฒนาแอพพลิเคของตัวเองผู้ให้บริการและผู้ช่วยรายละเอียดท้องถิ่น (LPAs) บนอุปกรณ์ Android ESIM ที่เปิดใช้งาน

LPA เป็นแอประบบแบบสแตนด์อโลนที่ควรรวมอยู่ในอิมเมจบิลด์ของ Android LPA จัดการโปรไฟล์บน eSIM เนื่องจากทำหน้าที่เป็นสะพานเชื่อมระหว่าง SM-DP+ (บริการระยะไกลที่จัดเตรียม จัดเก็บ และจัดส่งแพ็คเกจโปรไฟล์ไปยังอุปกรณ์) และชิป eUICC LPA APK สามารถเลือกรวมองค์ประกอบ UI ที่เรียกว่า LPA UI หรือ LUI เพื่อเป็นศูนย์กลางสำหรับผู้ใช้ปลายทางในการจัดการโปรไฟล์การสมัครรับข้อมูลแบบฝังทั้งหมด กรอบงาน Android จะค้นหาและเชื่อมต่อกับ LPA ที่ดีที่สุดโดยอัตโนมัติ และกำหนดเส้นทางการดำเนินการ eUICC ทั้งหมดผ่านอินสแตนซ์ LPA

สถาปัตยกรรม Remote SIM Provisioning (RSP) แบบง่าย

สถาปัตยกรรมรูปที่ 1 แบบย่อ RSP

ประกอบการเครือข่ายโทรศัพท์มือถือที่มีความสนใจในการสร้างแอปผู้ให้บริการควรมีลักษณะที่ APIs ใน EuiccManager ซึ่งมีระดับสูงดำเนินงานการจัดการรายละเอียดเช่น downloadSubscription() , switchToSubscription() และ deleteSubscription()

หากคุณเป็นอุปกรณ์ OEM สนใจในการสร้างแอพพลิเคระบบ LPA ของคุณเองคุณจะต้องขยาย EuiccService สำหรับกรอบ Android เพื่อเชื่อมต่อกับบริการ LPA ของคุณ นอกจากนี้คุณควรใช้ API ใน EuiccCardManager ที่ให้ฟังก์ชั่น ES10x อยู่บนพื้นฐานของ GSMA RSP v2.0 ฟังก์ชั่นเหล่านี้จะถูกใช้ในการออกคำสั่งไปยังชิป eUICC เช่น prepareDownload() , loadBoundProfilePackage() , retrieveNotificationList() และ resetMemory()

API สำหรับใน EuiccManager จำเป็นต้องมีแอพพลิเค LPA ดำเนินการอย่างถูกต้องเพื่อการทำงานและโทรของ EuiccCardManager APIs ต้องเป็น พ.ร.บ. คุ้มครองแรงงาน สิ่งนี้บังคับใช้โดยกรอบงาน Android

อุปกรณ์ที่ใช้ Android 10 ขึ้นไปสามารถรองรับอุปกรณ์ที่มี eSIM หลายตัว สำหรับข้อมูลเพิ่มเติมโปรดดูที่ สนับสนุน eSIMs หลาย

ทำแอพผู้ให้บริการ

eUICC APIs ใน Android 9 ทำให้ผู้ให้บริการเครือข่ายมือถือสามารถสร้างแอปที่มีแบรนด์ผู้ให้บริการเพื่อจัดการโปรไฟล์ได้โดยตรง ซึ่งรวมถึงการดาวน์โหลดและการลบโปรไฟล์การสมัครรับข้อมูลที่เป็นของผู้ให้บริการเครือข่าย ตลอดจนการเปลี่ยนไปใช้โปรไฟล์ที่ผู้ให้บริการเป็นเจ้าของ

EuiccManager

EuiccManager เป็นจุดเริ่มต้นที่หลักสำหรับปพลิเคชันในการโต้ตอบกับ LPA ซึ่งรวมถึงแอปของผู้ให้บริการที่ดาวน์โหลด ลบ และเปลี่ยนเป็นการสมัครรับข้อมูลที่เป็นของผู้ให้บริการ นี้ยังรวมถึงแอพพลิเคระบบ LUI ซึ่งมีทำเลที่ตั้ง / UI สำหรับการจัดการการสมัครสมาชิกฝังตัวทั้งหมดและอาจจะเป็น app แยกจากคนที่ให้ EuiccService

การใช้ API ของประชาชนซึ่งเป็นแอปผู้ให้บริการต้องได้รับตัวอย่างของ EuiccManager ผ่าน Context#getSystemService :

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

คุณควรตรวจสอบว่าอุปกรณ์รองรับ eSIM หรือไม่ก่อนดำเนินการใดๆ กับ eSIM EuiccManager#isEnabled() โดยทั่วไปผลตอบแทน true ถ้า android.hardware.telephony.euicc คุณลักษณะกำหนดและแพคเกจ LPA เป็นปัจจุบัน

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

ในการรับข้อมูลเกี่ยวกับฮาร์ดแวร์ eUICC และเวอร์ชัน eSIM OS:

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

APIs เป็นจำนวนมากเช่น downloadSubscription() และ switchToSubscription() ใช้ PendingIntent เรียกกลับขณะที่พวกเขาอาจใช้เวลาไม่กี่วินาทีหรือแม้กระทั่งนาทีที่จะเสร็จสมบูรณ์ PendingIntent ถูกส่งด้วยรหัสผลใน EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_ พื้นที่ซึ่งมีรหัสข้อผิดพลาดกรอบที่กำหนดไว้เช่นเดียวกับรหัสผลลัพธ์รายละเอียดโดยพลการแพร่กระจายจากการ LPA เป็น EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE ช่วยให้แอปผู้ให้บริการในการติดตามสำหรับการเข้าสู่ระบบ / วัตถุประสงค์ในการแก้จุดบกพร่อง PendingIntent โทรกลับจะต้อง BroadcastReceiver

ในการดาวน์โหลดการสมัครสมาชิกดาวน์โหลดที่กำหนด (สร้างขึ้นจากรหัสเปิดใช้งานหรือรหัส QR a):

// 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*/);
                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);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT);
mgr.downloadSubscription(sub, true /* switchAfterDownload */,
        callbackIntent);

หากต้องการเปลี่ยนเป็นการสมัครรับข้อมูลตาม ID การสมัคร:

// 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);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT);
mgr.switchToSubscription(1 /* subscriptionId */, callbackIntent);

สำหรับรายการที่สมบูรณ์ของ EuiccManager APIs และตัวอย่างโค้ดดู APIs eUICC

ข้อผิดพลาดที่แก้ไขได้

มีบางกรณีที่ระบบไม่สามารถดำเนินการ eSIM ให้เสร็จสิ้นได้ แต่ผู้ใช้สามารถแก้ไขข้อผิดพลาดได้ ยกตัวอย่างเช่น downloadSubscription อาจล้มเหลวหากเมตาดาต้ารายละเอียดระบุว่ารหัสการยืนยันผู้ให้บริการจะต้อง หรือ switchToSubscription อาจล้มเหลวหากแอปผู้ให้บริการมีสิทธิ์ให้บริการมากกว่ารายละเอียดปลายทาง (ที่เป็นผู้ให้บริการที่เป็นเจ้าของรายละเอียด) แต่ไม่ได้มีสิทธิพิเศษในการให้บริการมากกว่ารายละเอียดการเปิดใช้งานในขณะนี้และด้วยเหตุนี้ความยินยอมจากผู้ใช้ที่จำเป็น

สำหรับกรณีนี้โทรกลับโทรมาเรียกว่ามี EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR การเรียกกลับ Intent มีความพิเศษภายในเช่นว่าเมื่อโทรผ่านมันไป EuiccManager#startResolutionActivity ละเอียดสามารถขอผ่าน LUI การใช้รหัสการยืนยันตัวอย่างอีกครั้ง EuiccManager#startResolutionActivity เรียกหน้าจอ LUI ที่ช่วยให้ผู้ใช้สามารถป้อนรหัสยืนยัน; หลังจากป้อนรหัสแล้ว การดาวน์โหลดจะกลับมาทำงานต่อ วิธีนี้ช่วยให้แอปของผู้ให้บริการสามารถควบคุมได้อย่างเต็มที่เมื่อแสดง UI แต่ให้ LPA/LUI มีวิธีการขยายได้เพื่อเพิ่มการจัดการปัญหาที่ผู้ใช้กู้คืนได้ในอนาคตโดยไม่จำเป็นต้องเปลี่ยนแอปไคลเอ็นต์

Android 9 กำหนดข้อผิดพลาดเหล่านี้ใน resolvable 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 ใช้กลไกเพื่อให้สิทธิ์พิเศษแก่แอปของเจ้าของโปรไฟล์ (นั่นคือแอปของผู้ให้บริการ) ใน Android ใบรับรองโหลดแพลตฟอร์มเก็บไว้ในแฟ้มรายละเอียดของกฎการเข้าถึง (ARF) และได้รับอนุญาตทุนปพลิเคชันที่ลงนามโดยใบรับรองเหล่านี้โทรไปยัง EuiccManager APIs กระบวนการระดับสูงได้อธิบายไว้ด้านล่าง:

  1. ผู้ให้บริการลงนามใน APK ของแอปผู้ให้บริการ apksigner เครื่องมือแนบใบรับรองกุญแจสาธารณะเพื่อเอพีเค
  2. Operator/SM-DP+ เตรียมโปรไฟล์และข้อมูลเมตา ซึ่งรวมถึง ARF ที่ประกอบด้วย:

    1. ลายเซ็น (SHA-1 หรือ SHA-256) ของใบรับรองคีย์สาธารณะของแอปผู้ให้บริการ (จำเป็น)
    2. ชื่อแพ็คเกจของแอพผู้ให้บริการ (ไม่บังคับ)
  3. ผู้ให้บริการแอพพลิเคพยายามที่จะทำการดำเนินการ eUICC ผ่าน EuiccManager API

  4. แพลตฟอร์ม Android ตรวจสอบแฮช SHA-1 หรือ SHA-256 ของใบรับรองแอปผู้โทรตรงกับลายเซ็นของใบรับรองที่ได้รับจาก ARF ของโปรไฟล์เป้าหมาย หากชื่อแพ็กเกจของแอปผู้ให้บริการรวมอยู่ใน ARF ชื่อแพ็กเกจนั้นจะต้องตรงกับชื่อแพ็กเกจของแอปผู้โทรด้วย

  5. หลังจากตรวจสอบลายเซ็นและชื่อแพ็คเกจแล้ว (ถ้ามี) ผู้ให้บริการจะมอบสิทธิ์ให้กับแอปผู้โทรผ่านโปรไฟล์เป้าหมาย

เนื่องจากข้อมูลเมตาของโปรไฟล์สามารถใช้ได้นอกโปรไฟล์ (เพื่อให้ LPA สามารถดึงข้อมูลเมตาของโปรไฟล์จาก SM-DP+ ก่อนดาวน์โหลดโปรไฟล์ หรือจาก ISD-R เมื่อปิดใช้งานโปรไฟล์) จึงควรมีกฎของสิทธิ์ของผู้ให้บริการเหมือนกัน เช่นเดียวกับในโปรไฟล์

eUICC OS และ SM-DP + ต้องสนับสนุนแท็กที่เป็นกรรมสิทธิ์ BF76 ในข้อมูลเมตารายละเอียด เนื้อหาแท็กควรจะเหมือนกันกฎผู้ให้บริการสิทธิพิเศษที่ส่งกลับโดยแอปเพล็กฎการเข้าถึง (ARA) ที่กำหนดไว้ใน สิทธิ UICC Carrier :

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 Carrier

การทำแอพ LPA

คุณสามารถใช้ LPA ของคุณเองได้ ซึ่งต้องเชื่อมต่อกับ Android Euicc API ส่วนต่อไปนี้จะให้ภาพรวมคร่าวๆ ของการสร้างแอป LPA และการรวมเข้ากับระบบ Android

ข้อกำหนดฮาร์ดแวร์/โมเด็ม

LPA และ eSIM OS บนชิป eUICC ต้องรองรับ GSMA RSP (Remote SIM Provisioning) เวอร์ชัน 2.0 หรือ v2.2 เป็นอย่างน้อย คุณควรวางแผนที่จะใช้เซิร์ฟเวอร์ SM-DP+ และ SM-DS ที่มีเวอร์ชัน RSP ที่ตรงกัน สำหรับสถาปัตยกรรม RSP รายละเอียดโปรดดู GSMA SGP.21 RSP สถาปัตยกรรมข้อมูลจำเพาะ

นอกจากนี้ ในการผสานรวมกับ eUICC API ใน Android 9 โมเด็มของอุปกรณ์ควรส่งความสามารถของเทอร์มินัลโดยรองรับการเข้ารหัสความสามารถของ eUICC (การจัดการโปรไฟล์ในเครื่องและการดาวน์โหลดโปรไฟล์) นอกจากนี้ยังต้องใช้วิธีการดังต่อไปนี้:

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

  • IRadioConfig HAL v1.0: getSimSlotsStatus

โมเด็มควรรู้จัก eSIM ที่เปิดใช้งานโปรไฟล์การบูตเริ่มต้นเป็นซิมที่ถูกต้องและเปิดซิมไว้

สำหรับอุปกรณ์ที่ใช้ Android 10 ต้องกำหนดอาร์เรย์ ID สล็อต 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 และประกาศบริการนี้ในไฟล์ manifest ของคุณ บริการต้องต้อง android.permission.BIND_EUICC_SERVICE ได้รับอนุญาตของระบบเพื่อให้แน่ใจว่าระบบสามารถเชื่อมโยงกับมัน บริการยังต้องรวมตัวกรองความตั้งใจกับ android.service.euicc.EuiccService กระทำ ลำดับความสำคัญของตัวกรองเจตนาควรตั้งค่าเป็นค่าที่ไม่ใช่ศูนย์ ในกรณีที่มีการใช้งานหลายรายการในอุปกรณ์ ตัวอย่างเช่น:

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

ภายในกรอบงาน Android จะกำหนด LPA ที่ใช้งานอยู่และโต้ตอบกับ LPA ตามความจำเป็นเพื่อรองรับ Android eUICC API PackageManager สอบถามปพลิเคชันทั้งหมดที่มี android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS ได้รับอนุญาตซึ่งระบุบริการสำหรับ android.service.euicc.EuiccService กระทำ เลือกบริการที่มีลำดับความสำคัญสูงสุดแล้ว หากไม่พบบริการ การสนับสนุน LPA จะถูกปิดใช้งาน

ในการใช้งาน LUI คุณต้องจัดเตรียมกิจกรรมสำหรับการดำเนินการต่อไปนี้:

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

เช่นเดียวกับการให้บริการแต่ละกิจกรรมจะต้องจำเป็นต้อง android.permission.BIND_EUICC_SERVICE รับอนุญาตระบบ แต่ละคนควรจะมีตัวกรองความตั้งใจกับการดำเนินการที่เหมาะสมที่ android.service.euicc.category.EUICC_UI หมวดหมู่และจัดลำดับความสำคัญไม่ใช่ศูนย์ ตรรกะที่คล้ายกันจะใช้ในการเลือกใช้งานสำหรับกิจกรรมเหล่านี้เช่นเดียวกับการเลือกการดำเนินงานของ EuiccService ตัวอย่างเช่น:

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

นี่ก็หมายความว่าการดำเนินการ UI หน้าจอเหล่านี้สามารถมาจากเอพีเคแตกต่างจากคนที่ใช้ EuiccService ไม่ว่าจะมีเอพีเค APK ที่เดียวหรือหลาย (ตัวอย่างหนึ่งที่ดำเนินการ EuiccService และหนึ่งที่ให้กิจกรรม LUI) เป็นทางเลือกการออกแบบ

EuiccCardManager

EuiccCardManager เป็นอินเตอร์เฟซสำหรับการสื่อสารกับชิป ESIM มีฟังก์ชัน ES10 (ตามที่อธิบายไว้ในข้อมูลจำเพาะ GSMA RSP) และจัดการคำสั่งคำขอ/การตอบสนองของ APDU ระดับต่ำ ตลอดจนการแยกวิเคราะห์ ASN.1 EuiccCardManager เป็นระบบ API และสามารถเรียกได้ว่าเป็นแอพพลิเคระบบสิทธิพิเศษเท่านั้น

แอพผู้ให้บริการ, LPA และ Euicc APIs

รูปที่ 2 ทั้งสองแอปผู้ให้บริการและการใช้ LPA Euicc APIs

API สำหรับการดำเนินงานรายละเอียดผ่าน EuiccCardManager ต้องโทรไปจะเป็น พ.ร.บ. คุ้มครองแรงงาน สิ่งนี้บังคับใช้โดยกรอบงาน Android วิธีนี้โทรต้องขยาย EuiccService และได้รับการประกาศในไฟล์ Manifest ของคุณตามที่อธิบายไว้ในส่วนก่อนหน้า

คล้ายกับ EuiccManager เพื่อใช้ EuiccCardManager APIs, 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 เฉพาะ เมื่อใช้ EuiccCardManager APIs, โทร (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);

ในการรับที่อยู่ 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 ผ่านแอพผู้ให้บริการ

ในอุปกรณ์ที่ใช้ Android 9 ขึ้นไป คุณสามารถใช้แอปของผู้ให้บริการเพื่อเปิดใช้งาน eSIM และดาวน์โหลดโปรไฟล์ได้ แอปพลิเคผู้ให้บริการสามารถดาวน์โหลดโปรไฟล์โดยการเรียก downloadSubscription โดยตรงหรือโดยการให้รหัสเปิดใช้งานเพื่อ LPA

เมื่อแอปผู้ให้บริการดาวน์โหลดรายละเอียดโดยการเรียก downloadSubscription บังคับใช้การเรียกว่า app สามารถจัดการรายละเอียดผ่าน BF76 แท็กเมตาดาต้า ที่ encodes กฎผู้ให้บริการสิทธิพิเศษ สำหรับรายละเอียด หากรายละเอียดไม่ได้ BF76 แท็กหรือถ้า BF76 แท็กไม่ตรงกับลายเซ็นของผู้ให้บริการแอพพลิเคโทรของการดาวน์โหลดถูกปฏิเสธ

ส่วนด้านล่างอธิบายการเปิดใช้งาน eSIM ผ่านแอพของผู้ให้บริการโดยใช้รหัสเปิดใช้งาน

การเปิดใช้งาน eSIM โดยใช้รหัสเปิดใช้งาน

เมื่อใช้รหัสเปิดใช้งานเพื่อเปิดใช้งานโปรไฟล์ eSIM LPA จะดึงรหัสเปิดใช้งานจากแอพของผู้ให้บริการและดาวน์โหลดโปรไฟล์ โฟลว์นี้สามารถเริ่มต้นได้โดย LPA และ LPA สามารถควบคุมโฟลว์ UI ทั้งหมดได้ ซึ่งหมายความว่าไม่มีการแสดง UI ของแอปผู้ให้บริการ วิธีการนี้จะทะลุ BF76 ตรวจสอบแท็กและผู้ประกอบการเครือข่ายไม่จำเป็นต้องใช้ทั้ง ESIM เปิดใช้งาน UI ไหลรวมทั้งการดาวน์โหลดรายละเอียด ESIM และจัดการข้อผิดพลาด

การกำหนดบริการจัดเตรียม eUICC ของผู้ให้บริการ

คุ้มครองแรงงานและ app ผู้ให้บริการการสื่อสารผ่านสอง 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 ช่วยให้ผู้ให้บริการไปก่อนผูกโปรไฟล์เพื่ออี๊ดอุปกรณ์ก่อนขั้นตอนการดาวน์โหลดจะเริ่มต้นขึ้น

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

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

ตัวอย่างการใช้งานแอพผู้ให้บริการ

สำหรับ LPA ไปผูกไว้กับแอปผู้ให้บริการแอปผู้ให้บริการต้องคัดลอกทั้ง ICarrierEuiccProvisioningService.aidl และ IGetActivationCodeCallback.aidl กับโครงการของคุณและประกาศ ICarrierEuiccProvisioningService ให้บริการใน AndroidManifest.xml ไฟล์ บริการต้องต้อง android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS ได้รับอนุญาตของระบบเพื่อให้แน่ใจว่ามีเพียง LPA, แอพพลิเคระบบสิทธิพิเศษสามารถผูกกับมัน บริการยังต้องรวมตัวกรองความตั้งใจกับ android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE กระทำ

AndroidManifest.xml

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

ที่จะใช้บริการของแอปผู้ให้บริการ AIDL สร้างบริการที่ขยาย Stub ระดับและดำเนินการ getActivationCode และ getActivationCodeForEid วิธี จากนั้น LPA สามารถเรียกวิธีใดวิธีหนึ่งเพื่อดึงรหัสเปิดใช้งานโปรไฟล์ แอปพลิเคผู้ให้บริการควรจะตอบสนองโดยการเรียก IGetActivationCodeCallback#onSuccess กับรหัสเปิดใช้งานถ้ารหัสถูกดึงมาจากเซิร์ฟเวอร์ของผู้ให้บริการที่ประสบความสำเร็จ หากไม่ประสบความสำเร็จของแอปผู้ให้บริการควรจะตอบสนองกับ IGetActivationCodeCallback#onFailure

CarrierEuiccProvisioningService.java

import android.service.euicc.ICarrierEuiccProvisioningService;
import android.service.euicc.ICarrierEuiccProvisioningService.Stub;
import android.service.euicc.IGetActivationCodeCallback;

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

            @Override
            public void getActivationCodeForEid(String eid, IGetActivationCodeCallback callback) throws RemoteException {
                String activationCode = // do whatever work necessary (HTTP requests, fetch from storage, etc.)
                callback.onSuccess(activationCode);
            }
      }
}

การเริ่ม UI ของแอปผู้ให้บริการในขั้นตอนการเปิดใช้งาน LPA

บนอุปกรณ์ที่ใช้ Android 11 ขึ้นไป LPA สามารถเริ่ม UI ของแอปผู้ให้บริการได้ สิ่งนี้มีประโยชน์เนื่องจากแอปของผู้ให้บริการอาจต้องการข้อมูลเพิ่มเติมจากผู้ใช้ก่อนที่จะส่งรหัสเปิดใช้งานไปยัง LPA ตัวอย่างเช่น ผู้ให้บริการอาจกำหนดให้ผู้ใช้เข้าสู่ระบบเพื่อเปิดใช้งานหมายเลขโทรศัพท์ของตนหรือดำเนินการบริการย้ายข้อมูลอื่นๆ

นี่คือกระบวนการเริ่มต้น UI ของแอปผู้ให้บริการใน LPA:

  1. เปิดตัว LPA การเปิดใช้งานแอปของผู้ให้บริการโดยการส่ง android.service.euicc.action.START_CARRIER_ACTIVATION เจตนาที่จะให้บริการแอพพลิเคแพคเกจที่มีการดำเนินการ (รับผู้ให้บริการแอปจะต้องได้รับการคุ้มครองในการประกาศอย่างชัดแจ้งกับ android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" เพื่อหลีกเลี่ยงการได้รับ intents จากแอปที่ไม่ใช่ 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. ผู้ให้บริการแอพพลิเคตอบสนองต่อการ LPA โดยการเรียก setResult(int, Intent) และ finish()

    1. หากแอปผู้ให้บริการตอบสนองกับ RESULT_OK ที่ LPA ยังคงไหลการเปิดใช้งาน หากแอปผู้ให้บริการกำหนดว่าผู้ใช้ควรสแกน QR โค้ดแทนการปล่อยให้ LPA ผูกบริการแอปของผู้ให้บริการที่ตอบสนองผู้ให้บริการแอพพลิเคกับ LPA ใช้ setResult(int, Intent) กับ RESULT_OK และ Intent เช่นมีพิเศษบูล android.telephony.euicc.extra.USE_QR_SCANNER ตั้งค่าให้ true คุ้มครองแรงงานแล้วการตรวจสอบพิเศษและเปิดตัวสแกนเนอร์ QR แทนการผูกแอปของผู้ให้บริการ ICarrierEuiccProvisioningService การดำเนินงาน
    2. หากเกิดความผิดพลาดของผู้ให้บริการแอปหรือการตอบสนองกับ RESULT_CANCELED (นี่คือรหัสการตอบสนองเริ่มต้น) ที่ LPA ยกเลิกการเปิดใช้งาน ESIM
    3. หากแอปผู้ให้บริการตอบสนองกับสิ่งอื่นที่ไม่ใช่ RESULT_OK หรือ RESULT_CANCELED ที่ถือว่า LPA ว่ามันเป็นข้อผิดพลาด

    สำหรับเหตุผลด้านความปลอดภัย LPA ไม่ควรยอมรับโดยตรงรหัสเปิดใช้งานจำหน่ายในผลเจตนาเพื่อให้มั่นใจว่าสายที่ไม่ใช่ LPA ไม่สามารถรับรหัสเปิดใช้งานจากการตรวจสอบผู้ให้บริการ

การเปิดใช้โฟลว์การเปิดใช้งาน LPA ในแอปผู้ให้บริการ

ตั้งแต่ Android 11 เป็นต้นไป แอปของผู้ให้บริการสามารถใช้ eUICC API เพื่อเริ่ม LUI สำหรับการเปิดใช้งาน eSIM ได้ เมธอดนี้แสดง UI โฟลว์การเปิดใช้งาน eSIM ของ LPA เพื่อเปิดใช้งานโปรไฟล์ 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. แอพผู้ให้บริการทำงานโดยใช้ UI ของตัวเอง ตัวอย่างเช่น การเข้าสู่ระบบของผู้ใช้หรือส่งคำขอ HTTP ไปยังแบ็กเอนด์ของผู้ให้บริการ

  3. ณ จุดนี้แอปผู้ให้บริการจะต้องมีความพร้อมที่จะจัดหารหัสเปิดใช้งานผ่าน ICarrierEuiccProvisioningService การดำเนินงาน ผู้ให้บริการแอปพลิเคเปิดตัว LPA โดยการเรียก startActivityForResult(Intent, int) กับ android.telephony.euicc.action.START_EUICC_ACTIVATION กระทำ คุ้มครองแรงงานนอกจากนี้ยังตรวจสอบบูลพิเศษ android.telephony.euicc.extra.USE_QR_SCANNER หากมีค่าเป็น true เปิดตัว LPA เครื่องสแกน QR เพื่อให้ผู้ใช้สแกน QR โค้ดโปรไฟล์

  4. ในด้าน LPA ที่ผูก LPA ไปยังแอปของผู้ให้บริการ ICarrierEuiccProvisioningService ดำเนินการดึงข้อมูลรหัสเปิดใช้งานและดาวน์โหลดรายละเอียดที่เกี่ยวข้อง LPA จะแสดงองค์ประกอบ UI ที่จำเป็นทั้งหมดระหว่างการดาวน์โหลด เช่น หน้าจอการโหลด

  5. เมื่อการเปิดใช้งาน LPA เสร็จสมบูรณ์ใน พ.ร.บ. คุ้มครองแรงงานตอบสนองต่อการให้บริการแอปที่มีรหัสผลซึ่งจับผู้ให้บริการแอพพลิเคใน onActivityResult(int, int, Intent)

    1. หาก LPA ประสบความสำเร็จในการดาวน์โหลดรายละเอียด ESIM ใหม่ก็ตอบสนองด้วย RESULT_OK
    2. หากผู้ใช้ยกเลิกการเปิดใช้งานรายละเอียด ESIM ใน LPA ก็ตอบสนองด้วย RESULT_CANCELED
    3. หาก LPA ตอบสนองกับสิ่งอื่นที่ไม่ใช่ RESULT_OK หรือ RESULT_CANCELED ผู้ให้บริการแอพพลิเคถือว่าสิ่งนี้เป็นข้อผิดพลาด

    สำหรับเหตุผลด้านความปลอดภัย LPA ไม่ยอมรับรหัสเปิดใช้งานโดยตรงในที่จัดเจตนาเพื่อให้มั่นใจว่าสายที่ไม่ใช่ LPA ไม่สามารถรับรหัสเปิดใช้งานจากการตรวจสอบผู้ให้บริการ

รองรับหลาย eSIM

สำหรับอุปกรณ์ที่ใช้ Android 10 หรือสูงกว่า EuiccManager ระดับอุปกรณ์ที่รองรับกับ eSIMs หลาย อุปกรณ์ที่มี ESIM เดียวที่มีการอัพเกรดเป็น Android 10 ไม่จำเป็นต้องมีการปรับเปลี่ยนใด ๆ ในการดำเนินการ LPA เป็นแพลตฟอร์มโดยอัตโนมัติร่วม EuiccManager เช่นกับ eUICC เริ่มต้น eUICC เริ่มต้นจะถูกกำหนดโดยแพลตฟอร์มสำหรับอุปกรณ์ที่มีวิทยุ HAL เวอร์ชัน 1.2 หรือสูงกว่า และโดย LPA สำหรับอุปกรณ์ที่มีวิทยุ HAL เวอร์ชันต่ำกว่า 1.2

ความต้องการ

เพื่อรองรับ eSIM หลายตัว อุปกรณ์จะต้องมี eUICC มากกว่าหนึ่งตัว ซึ่งสามารถเป็นได้ทั้ง eUICC ในตัวหรือช่องเสียบ SIM จริงที่สามารถใส่ eUICC แบบถอดได้

ต้องใช้วิทยุ HAL เวอร์ชัน 1.2 หรือสูงกว่าเพื่อรองรับ eSIM หลายตัว ขอแนะนำให้ใช้วิทยุ HAL เวอร์ชัน 1.4 และ RadioConfig HAL เวอร์ชัน 1.2

การดำเนินการ

เพื่อสนับสนุนหลาย eSIMs (รวม eUICCs ถอดออกหรือตั้งโปรแกรมซิม) LPA จะต้องดำเนินการ EuiccService ซึ่งได้รับรหัสช่องที่ตรงกับบัตรโทรให้ไว้

non_removable_euicc_slots ทรัพยากรที่ระบุใน arrays.xml เป็นอาร์เรย์ของจำนวนเต็มที่เป็นตัวแทนของรหัสสล็อตของอุปกรณ์ของในตัว eUICCs คุณต้องระบุทรัพยากรนี้เพื่ออนุญาตให้แพลตฟอร์มกำหนดว่า eUICC ที่แทรกนั้นถอดออกได้หรือไม่

แอพผู้ให้บริการสำหรับอุปกรณ์ที่มี eSIM หลายตัว

เมื่อทำแอปผู้ให้บริการสำหรับอุปกรณ์ที่มี eSIMs หลายใช้ createForCardId วิธีการใน EuiccManager เพื่อสร้าง EuiccManager วัตถุที่ถูกตรึงอยู่กับบัตรประจำตัวที่กำหนด รหัสบัตรเป็นค่าจำนวนเต็มที่ระบุ UICC หรือ eUICC บนอุปกรณ์โดยไม่ซ้ำกัน

ที่จะได้รับบัตรประจำตัวสำหรับ eUICC เริ่มต้นอุปกรณ์ใช้ getCardIdForDefaultEuicc วิธีการใน TelephonyManager วิธีการนี้จะส่งกลับ UNSUPPORTED_CARD_ID ถ้าวิทยุรุ่น HAL ต่ำกว่า 1.2 และผลตอบแทน UNINITIALIZED_CARD_ID หากอุปกรณ์ยังไม่ได้อ่าน eUICC

นอกจากนี้คุณยังจะได้รับรหัสบัตรจาก getUiccCardsInfo และ getUiccSlotsInfo (ระบบ API) ใน TelephonyManager และ getCardId ใน SubscriptionInfo

เมื่อ EuiccManager วัตถุได้รับอินสแตนซ์ที่มีบัตรประจำตัวเฉพาะการดำเนินงานทั้งหมดจะถูกนำไป eUICC ที่มีบัตรประจำตัวว่า หาก eUICC จะกลายเป็นไม่สามารถเข้าถึงได้ (ตัวอย่างเช่นเมื่อมันถูกปิดหรือถูกลบออก) EuiccManager ไม่ทำงาน

คุณสามารถใช้ตัวอย่างโค้ดต่อไปนี้เพื่อสร้างแอปผู้ให้บริการ

ตัวอย่างที่ 1: รับสมัครสมาชิกที่ใช้งานและ instantiate 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 และ instantiate 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 ไปใช้ และคุณไม่คาดว่าจะมี LPA พร้อมใช้งานบน Android ทุกรุ่น (ไม่ใช่โทรศัพท์ทุกเครื่องที่รองรับ eSIM) ด้วยเหตุนี้ จึงไม่มีกรณีทดสอบ CTS แบบ end-to-end อย่างไรก็ตาม กรณีทดสอบพื้นฐานมีอยู่ใน AOSP เพื่อให้แน่ใจว่า eUICC API ที่เปิดเผยนั้นใช้ได้ใน Android บิลด์

คุณควรตรวจสอบให้แน่ใจว่าสร้างผ่านการทดสอบกรณี CTS ดังต่อไปนี้ (สำหรับ API สาธารณะ): แพลตฟอร์ม / กะรัต / ทดสอบ / ทดสอบ / / โทรศัพท์ / ปัจจุบัน / src / Android / โทรศัพท์ / euicc / กะรัต

ผู้ให้บริการที่ใช้แอปของผู้ให้บริการควรผ่านรอบการประกันคุณภาพภายในองค์กรตามปกติ เพื่อให้แน่ใจว่าคุณลักษณะที่นำมาใช้ทั้งหมดทำงานได้ตามที่คาดไว้ อย่างน้อยที่สุด แอปผู้ให้บริการควรสามารถแสดงรายการโปรไฟล์การสมัครรับข้อมูลทั้งหมดที่เป็นเจ้าของโดยผู้ให้บริการรายเดียวกัน ดาวน์โหลดและติดตั้งโปรไฟล์ เปิดใช้งานบริการบนโปรไฟล์ สลับระหว่างโปรไฟล์ และลบโปรไฟล์

หากคุณกำลังสร้าง LPA ของคุณเอง คุณควรผ่านการทดสอบที่เข้มงวดกว่านี้มาก คุณควรทำงานร่วมกับผู้จำหน่ายโมเด็ม ชิป eUICC หรือผู้ให้บริการ eSIM OS ผู้จำหน่าย SM-DP+ และผู้ให้บริการเพื่อแก้ไขปัญหาและรับรองความสามารถในการทำงานร่วมกันของ LPA ภายในสถาปัตยกรรม RSP การทดสอบด้วยตนเองจำนวนมากเป็นสิ่งที่หลีกเลี่ยงไม่ได้ สำหรับความคุ้มครองการทดสอบที่ดีที่สุดคุณควรทำตาม SGP.23 แผน GSMA RSP ทดสอบ