eUICC APIs

ใน Android ที่ 9 การจัดการ APIs รายละเอียด (ประชาชนและ @SystemApi) สามารถผ่านชั้น EuiccManager eUICC APIs สื่อสาร (@SystemApi เท่านั้น) สามารถผ่านชั้น EuiccCardManager

เกี่ยวกับ eUICC

ผู้ให้บริการสามารถสร้างแอปของผู้ให้บริการโดยใช้ EuiccManager เพื่อจัดการโปรไฟล์ ดังแสดงในรูปที่ 1 แอปของผู้ให้บริการไม่จำเป็นต้องเป็นแอประบบ แต่ต้องมีสิทธิ์ของผู้ให้บริการที่ได้รับจากโปรไฟล์ eUICC LPA แอป (LUI และ LPA แบ็กเอนด์) จะต้องมีแอพพลิเคระบบ (เช่นรวมอยู่ในระบบภาพ) เพื่อเรียก @SystemApi

โทรศัพท์ Android ที่มีแอปผู้ให้บริการและ OEM LPA

รูปที่ 1 โทรศัพท์ Android กับแอปผู้ให้บริการและ OEM LPA

นอกจากตรรกะของการเรียก EuiccCardManager และพูดคุยกับ eUICC ปพลิเคชัน LPA จะต้องดำเนินการต่อไปนี้:

  • ไคลเอ็นต์ SM-DP+ กำลังพูดคุยกับเซิร์ฟเวอร์ SM-DP+ เพื่อตรวจสอบสิทธิ์และดาวน์โหลดโปรไฟล์
  • [ไม่บังคับ] SM-DS เพื่อรับโปรไฟล์ที่สามารถดาวน์โหลดได้มากขึ้น
  • การจัดการการแจ้งเตือนเพื่อส่งการแจ้งเตือนไปยังเซิร์ฟเวอร์เพื่ออัปเดตสถานะโปรไฟล์
  • [ไม่บังคับ] การจัดการสล็อตรวมถึงการสลับระหว่างตรรกะ eSIM และ pSIM ตัวเลือกนี้เป็นทางเลือกหากโทรศัพท์มีชิป eSIM เท่านั้น
  • eSIM OTA

แม้ว่ามากกว่าหนึ่งแอป LPA สามารถจะอยู่ในโทรศัพท์ Android เพียงหนึ่ง LPA สามารถเลือกให้เป็น LPA ทำงานจริงขึ้นอยู่กับการจัดลำดับความสำคัญที่กำหนดไว้ใน AndroidManifest.xml ไฟล์ของแต่ละแอป

การใช้ EuiccManager

API ของ LPA เป็นสาธารณะผ่าน EuiccManager (ภายใต้แพคเกจ android.telephony.euicc ) การตรวจสอบผู้ให้บริการจะได้รับตัวอย่างของ EuiccManager และเรียกวิธีการใน EuiccManager จะได้รับข้อมูล eUICC และจัดการกับการสมัคร (เรียกว่าโปรไฟล์ในเอกสาร GSMA RSP) เป็นกรณี SubscriptionInfo

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

แพลตฟอร์ม Android ไม่จัดการกฎนโยบายโปรไฟล์ หากมีการประกาศกฎนโยบายในข้อมูลเมตาของโปรไฟล์ LPA สามารถเลือกวิธีจัดการกับขั้นตอนการดาวน์โหลดและการติดตั้งโปรไฟล์ ตัวอย่างเช่น เป็นไปได้ที่ OEM LPA ของบริษัทอื่นจะจัดการกฎนโยบายโดยใช้รหัสข้อผิดพลาดพิเศษ (รหัสข้อผิดพลาดถูกส่งจาก OEM LPA ไปยังแพลตฟอร์ม จากนั้นแพลตฟอร์มจะส่งรหัสไปยัง OEM LUI)

APIs

API ที่ต่อไปนี้สามารถพบได้ใน EuiccManager เอกสารอ้างอิง และ EuiccManager.java

รับอินสแตนซ์ (สาธารณะ)

ได้รับตัวอย่างของ EuiccManager ผ่าน Context#getSystemService

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

เปิดใช้งานการตรวจสอบ (สาธารณะ)

ตรวจสอบว่ามีการเปิดใช้งานการสมัครรับข้อมูลแบบฝังหรือไม่ ควรตรวจสอบสิ่งนี้ก่อนเข้าถึง LPA API

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

รับ EID (สาธารณะ)

รับ EID ที่ระบุฮาร์ดแวร์ eUICC นี่อาจเป็นโมฆะหาก eUICC ไม่พร้อม โทรต้องมีสิทธิ์ผู้ให้บริการหรือ READ_PRIVILEGED_PHONE_STATE ได้รับอนุญาต

String eid = mgr.getEid();
if (eid == null) {
  // Handle null case.
}

รับ EuiccInfo (สาธารณะ)

รับข้อมูลเกี่ยวกับ eUICC นี้มีเวอร์ชันของระบบปฏิบัติการ

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

ดาวน์โหลดการสมัครสมาชิก (สาธารณะ)

ดาวน์โหลดการสมัครรับข้อมูลที่กำหนด (เรียกว่า "โปรไฟล์" ในเอกสาร GSMA RSP) สามารถสร้างการสมัครสมาชิกได้จากรหัสเปิดใช้งาน ตัวอย่างเช่น สามารถแยกวิเคราะห์รหัสเปิดใช้งานจากรหัส QR การดาวน์โหลดการสมัครเป็นการดำเนินการแบบอะซิงโครนัส

โทรทั้งต้องมี WRITE_EMBEDDED_SUBSCRIPTIONS ได้รับอนุญาตหรือผู้มีสิทธิ์ให้บริการสำหรับการสมัครสมาชิกเป้าหมาย

// Register receiver.
String action = "download_subscription";
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),
        "example.broadcast.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);

เปลี่ยนการสมัครสมาชิก (สาธารณะ)

เปลี่ยนเป็น (เปิดใช้งาน) การสมัครรับข้อมูลที่กำหนด โทรทั้งต้องมี WRITE_EMBEDDED_SUBSCRIPTIONS หรือผู้มีสิทธิ์ให้บริการสำหรับปัจจุบันที่เปิดใช้งานการสมัครสมาชิกและการสมัครเป้าหมาย

// Register receiver.
String action = "switch_to_subscription";
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),
        "example.broadcast.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);

ลบการสมัคร (สาธารณะ)

ลบการสมัครสมาชิกด้วย ID การสมัครสมาชิก หากการสมัครใช้งานอยู่ในปัจจุบัน จะถูกปิดใช้งานก่อน โทรต้องมี WRITE_EMBEDDED_SUBSCRIPTIONS หรือสิทธิพิเศษในการให้บริการสำหรับการสมัครสมาชิกเป้าหมาย

// Register receiver.
String action = "delete_subscription";
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),
        "example.broadcast.permission" /* broadcastPermission*/,
        null /* handler */);

// Delete a subscription asynchronously.
Intent intent = new Intent(action);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.deleteSubscription(1 /* subscriptionId */, callbackIntent);

ลบการสมัครสมาชิกทั้งหมด (ระบบ API)

ลบการสมัครรับข้อมูลทั้งหมดบนอุปกรณ์ เริ่มต้นใน Android 11 คุณควรให้ EuiccCardManager#ResetOption enum ค่าเพื่อระบุว่าจะลบทุกการทดสอบการดำเนินงานหรือทั้งสองประเภทของการสมัครสมาชิก โทรต้องมี WRITE_EMBEDDED_SUBSCRIPTIONS ได้รับอนุญาต

// Register receiver.
String action = "delete_subscription";
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),
        "example.broadcast.permission" /* broadcastPermission*/,
        null /* handler */);

// Erase all operational subscriptions asynchronously.
Intent intent = new Intent(action);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.eraseSubscriptions(
        EuiccCardManager.RESET_OPTION_DELETE_OPERATIONAL_PROFILES, callbackIntent);

เริ่มกิจกรรมการแก้ปัญหา (สาธารณะ)

เริ่มกิจกรรมเพื่อแก้ไขข้อผิดพลาดที่ผู้ใช้แก้ไขได้ หากการดำเนินการส่งกลับ EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR วิธีนี้สามารถเรียกได้ว่าจะแจ้งให้ผู้ใช้ในการแก้ไขปัญหา วิธีนี้สามารถเรียกได้เพียงครั้งเดียวสำหรับข้อผิดพลาดเฉพาะ

...
mgr.startResolutionActivity(getActivity(), 0 /* requestCode */, resultIntent, callbackIntent);

ค่าคงที่

หากต้องการดูรายการที่ public คงที่ใน EuiccManager ดู ค่าคงที่