ใช้งาน eSIM

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

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

สถาปัตยกรรมการจัดสรรซิมระยะไกลอย่างง่าย (RSP)

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

ผู้ให้บริการเครือข่ายมือถือที่สนใจสร้างแอปของผู้ให้บริการควรดูที่ API ใน 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 API ต้องเป็น LPA กระบวนการนี้บังคับใช้โดยเฟรมเวิร์กของ Android

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

สร้างแอปของผู้ให้บริการ

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

ผู้จัดการ Euicc

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

หากต้องการใช้ API สาธารณะ แอปของผู้ให้บริการต้องรับอินสแตนซ์ของ EuiccManager จนถึง Context#getSystemService:

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

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

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

ดูรายการ API ทั้งหมดของ EuiccManager และตัวอย่างโค้ดได้ที่ eUICC API

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

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

  1. ผู้ให้บริการลงนาม APK ของแอปผู้ให้บริการ เวลา apksigner จะแนบใบรับรองคีย์สาธารณะไปยัง APK
  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 และ 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
    }
}

ดูรายละเอียดเพิ่มเติมเกี่ยวกับ App Signing ได้ที่ รับรองแอป ดูรายละเอียดเกี่ยวกับสิทธิ์ของผู้ให้บริการได้ที่ สิทธิ์ของผู้ให้บริการ UICC

สร้างแอปผู้ช่วยโปรไฟล์ในเครื่อง

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

ข้อกำหนดเกี่ยวกับฮาร์ดแวร์/โมเด็ม

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

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

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

  • IRadioConfig HAL v1.0: getSimSlotsStatus

  • IRadioConfig AIDL v1.0: getAllowedCarriers

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

    • ผู้ให้บริการหรือ OEM ต้องใช้ IRadioSim.getAllowedCarriers()HAL API

    • RIL / โมเด็ม ผู้ให้บริการจะระบุสถานะล็อกและรหัสผู้ให้บริการของผู้ให้บริการที่ล็อกอุปกรณ์ไว้เป็นส่วนหนึ่งของ IRadioSimResponse.getAllowedCarriersResponse()HAL API

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

สำหรับอุปกรณ์ที่ใช้ 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 ประกอบด้วยองค์ประกอบ 2 อย่างแยกกัน (อาจใช้เหมือนกันทั้ง 2 อย่าง APK): แบ็กเอนด์ LPA และ LPA UI หรือ LUI

ในการใช้แบ็กเอนด์ LPA คุณต้องขยาย EuiccService และประกาศบริการนี้ในไฟล์ Manifest บริการต้องกำหนดให้ android.permission.BIND_EUICC_SERVICEสิทธิ์เพื่อให้แน่ใจว่ามีเพียง ก็จะเชื่อมโยงกับระบบได้ บริการต้องมีตัวกรอง Intent ที่มี การดำเนินการ android.service.euicc.EuiccService ลำดับความสำคัญของ Intent ควรตั้งค่าตัวกรองให้เป็นค่าที่ไม่ใช่ 0 ในกรณีที่มีการติดตั้งหลายรายการ ที่มีอยู่บนอุปกรณ์ เช่น

<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 ที่ใช้งานอยู่และโต้ตอบกับ ตามความจำเป็นเพื่อรองรับ eUICC API ของ Android มีการค้นหา 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 หมวดหมู่ และลำดับความสำคัญที่ไม่ใช่ 0 ระบบใช้ตรรกะที่คล้ายกันในการเลือกการติดตั้งใช้งานสำหรับกิจกรรมเหล่านี้ สามารถเลือกใช้ 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 ที่ใช้งานหน้าจอเหล่านี้ อาจมาจาก APK จากโปรแกรมที่ติดตั้งใช้งาน EuiccService มี APK เดียวหรือหลาย APK (เช่น APK ที่ใช้ EuiccService และอีกแบบหนึ่งที่มีกิจกรรม LUI) คือทางเลือกในการออกแบบ

ผู้จัดการบัตร EuiccCard

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

แอปของผู้ให้บริการ, LPA และ Euicc API

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

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

เช่นเดียวกับ EuiccManager ในการใช้ EuiccCardManager API LPA ของคุณต้อง รับอินสแตนซ์ของ EuiccCardManager ก่อน ผ่าน Context#getSystemService:

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

จากนั้น หากต้องการดูโปรไฟล์ทั้งหมดใน eUICC ให้ทำดังนี้

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

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

จากภายใน EuiccCardManager จะเชื่อมโยงกับ EuiccCardController (ซึ่งทำงานใน กระบวนการของโทรศัพท์) ผ่านอินเทอร์เฟซ AIDL และแต่ละเมธอด EuiccCardManager ได้รับการติดต่อกลับจากกระบวนการทางโทรศัพท์ผ่าน AIDL ที่ออกแบบมาโดยเฉพาะ ของ Google เมื่อใช้ EuiccCardManager API ผู้โทร (LPA) จะต้องระบุ Executor ที่เรียกใช้ Callback ออบเจ็กต์ Executor นี้อาจทํางานใน ชุดข้อความเดียวหรือในกลุ่มชุดข้อความที่ต้องการ

API ส่วนใหญ่ของ 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 ผ่านแอปผู้ให้บริการ

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

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

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

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

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

กำหนดบริการจัดสรร eUICC ของผู้ให้บริการ

LPA และแอปของผู้ให้บริการสื่อสารผ่าน AIDL อินเทอร์เฟซ: ICarrierEuiccProvisioningService และ IGetActivationCodeCallback ผู้ให้บริการ แอปต้องใช้อินเทอร์เฟซ ICarrierEuiccProvisioningService และ เปิดเผยใน การประกาศไฟล์ Manifest LPA ต้องเชื่อมโยงกับ 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 อนุญาตให้ผู้ให้บริการเชื่อมโยงโปรไฟล์กับอุปกรณ์ไว้ล่วงหน้า 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
    }
}

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

แอปของผู้ให้บริการต้องคัดลอกทั้ง 2 อย่างเพื่อให้ LPA เชื่อมโยงกับแอปของผู้ให้บริการ ICarrierEuiccProvisioningService.aidl และ IGetActivationCodeCallback.aidl ไปยัง โปรเจ็กต์และประกาศบริการ ICarrierEuiccProvisioningService ใน AndroidManifest.xml ไฟล์ บริการต้องกำหนดให้ สิทธิ์ของระบบ android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS รายการเพื่อให้แน่ใจ ซึ่งมีเฉพาะ LPA ซึ่งเป็นแอปที่ได้รับอนุญาตจากระบบเท่านั้นที่จะเชื่อมโยงกับ LPA ได้ บริการต้อง ให้รวมตัวกรอง Intent ที่มีฟังก์ชัน การดำเนินการ 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 Intent แพ็กเกจแอปของผู้ให้บริการที่มีการดำเนินการอยู่ (ผู้รับแอปของผู้ให้บริการต้อง ได้รับการปกป้องในการประกาศไฟล์ Manifest ด้วย android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" ถึง หลีกเลี่ยงการได้รับ Intent จากแอปที่ไม่ใช่ 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 จะดำเนินการเปิดใช้งานต่อ หากแอปของผู้ให้บริการระบุว่า ผู้ใช้ควรสแกนคิวอาร์โค้ดแทนการให้ LPA ผูกผู้ให้บริการ ของบริการของแอป แอปของผู้ให้บริการตอบสนองต่อ LPA โดยใช้ setResult(int, Intent) ที่มี RESULT_OK และอินสแตนซ์ Intent ที่มีค่าบูลีนเพิ่มเติม ตั้งค่า android.telephony.euicc.extra.USE_QR_SCANNER เป็น true LPA จากนั้นตรวจสอบส่วนเสริมแล้วเปิดเครื่องมือสแกนคิวอาร์แทนการเชื่อมโยง การใช้งาน ICarrierEuiccProvisioningService ของแอปของผู้ให้บริการ
    2. หากแอปของผู้ให้บริการขัดข้องหรือตอบสนองด้วย RESULT_CANCELED (นี่คือรหัสตอบกลับเริ่มต้น) LPA จะยกเลิก eSIM ขั้นตอนการเปิดใช้งาน
    3. หากแอปของผู้ให้บริการตอบสนองด้วยสิ่งอื่นที่ไม่ใช่ RESULT_OK หรือ RESULT_CANCELED LPA จะถือว่าเป็นข้อผิดพลาด

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

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

ตั้งแต่ Android 11 เป็นต้นไป แอปของผู้ให้บริการจะใช้ eUICC API ได้ เพื่อเริ่ม LUI สำหรับ eSIM การเปิดใช้งาน วิธีนี้แสดง UI ขั้นตอนการเปิดใช้งาน eSIM ของ LPA เพื่อเปิดใช้งาน โปรไฟล์ eSIM จากนั้น LPA จะส่งประกาศเมื่อโปรไฟล์ eSIM สิ้นสุดการเปิดใช้งาน

  1. LPA ต้องประกาศกิจกรรมที่มีตัวกรอง Intent ที่มีฟิลด์ การดำเนินการ android.service.euicc.action.START_EUICC_ACTIVATION รายการ ลำดับความสำคัญ ของตัวกรอง Intent ให้เป็นค่าที่ไม่ใช่ 0 ในกรณีที่มี ในการใช้งานอุปกรณ์ เช่น

    <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 การดำเนินการ LPA ยังตรวจสอบค่าบูลีนเพิ่มเติม android.telephony.euicc.extra.USE_QR_SCANNER หากค่าเป็น true ค่า LPA เปิดตัวตัวสแกนคิวอาร์โค้ดเพื่อให้ผู้ใช้สแกนคิวอาร์โค้ดของโปรไฟล์

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

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

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

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

รองรับ eSIM หลายรายการ

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

ข้อกำหนด

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

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

การใช้งาน

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

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

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

เมื่อสร้างแอปของผู้ให้บริการสำหรับอุปกรณ์ที่มี eSIM หลายรายการ ให้ใช้ 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: รับการสมัครใช้บริการที่ใช้งานอยู่และสร้างอินสแตนซ์ 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 และสร้างอินสแตนซ์ 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 ตั้งแต่ต้นจนจบ อย่างไรก็ตาม กรอบการทดสอบพื้นฐาน พร้อมใช้งานใน AOSP เพื่อดูแลให้ eUICC API เปิดเผย ใช้ได้ใน Android บิลด์

คุณควรตรวจสอบว่าบิลด์ผ่านกรอบการทดสอบ CTS ต่อไปนี้ (สำหรับสาธารณะ API): /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts

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

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