เทคโนโลยีซิมแบบฝัง (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
รูปที่ 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 โปรดดูคำอธิบายกระบวนการระดับสูงด้านล่างนี้
- ผู้ให้บริการลงนาม APK ของแอปผู้ให้บริการ เวลา apksigner จะแนบใบรับรองคีย์สาธารณะไปยัง APK
Operator/SM-DP+ เตรียมโปรไฟล์และข้อมูลเมตา ซึ่งรวมถึง ARF ที่มีสิ่งต่อไปนี้
- ลายเซ็น (SHA-1 หรือ SHA-256) ของใบรับรองคีย์สาธารณะของแอปผู้ให้บริการ (ต้องระบุ)
- ชื่อแพ็กเกจของแอปของผู้ให้บริการ (แนะนำอย่างยิ่ง)
แอปของผู้ให้บริการพยายามดำเนินการ eUICC กับ
EuiccManager
APIแพลตฟอร์ม Android ยืนยันแฮช SHA-1 หรือ SHA-256 ของแอปผู้โทร ใบรับรองตรงกับลายเซ็นของใบรับรองที่ได้รับจาก ARF ของโปรไฟล์เป้าหมาย หากมีชื่อแพ็กเกจของแอปของผู้ให้บริการรวมอยู่ใน ARF นั้นจะต้องตรงกับชื่อแพ็กเกจของแอปผู้โทรด้วย
หลังจากลายเซ็นและชื่อแพ็กเกจ (หากมี) ได้รับการยืนยันแล้ว ให้สิทธิ์ผู้ให้บริการแก่แอปผู้โทรผ่านโปรไฟล์เป้าหมาย
เนื่องจากข้อมูลเมตาของโปรไฟล์ สามารถใช้ได้นอกโปรไฟล์นั้นเอง (ดังนั้น 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 ระบบและเรียกได้โดยระบบที่มีสิทธิ์ของระบบเท่านั้น
แอป
รูปที่ 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 มีดังนี้
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);
แอปของผู้ให้บริการทำงานโดยใช้ UI ของตัวเอง เช่น การบันทึก ในตัวผู้ใช้ หรือการส่งคำขอ HTTP ไปยังแบ็กเอนด์ของผู้ให้บริการ
แอปของผู้ให้บริการตอบสนองต่อ LPA โดยโทรหา
setResult(int, Intent)
และfinish()
- หากแอปของผู้ให้บริการตอบสนองด้วย
RESULT_OK
LPA จะดำเนินการเปิดใช้งานต่อ หากแอปของผู้ให้บริการระบุว่า ผู้ใช้ควรสแกนคิวอาร์โค้ดแทนการให้ LPA ผูกผู้ให้บริการ ของบริการของแอป แอปของผู้ให้บริการตอบสนองต่อ LPA โดยใช้setResult(int, Intent)
ที่มีRESULT_OK
และอินสแตนซ์Intent
ที่มีค่าบูลีนเพิ่มเติม ตั้งค่าandroid.telephony.euicc.extra.USE_QR_SCANNER
เป็นtrue
LPA จากนั้นตรวจสอบส่วนเสริมแล้วเปิดเครื่องมือสแกนคิวอาร์แทนการเชื่อมโยง การใช้งานICarrierEuiccProvisioningService
ของแอปของผู้ให้บริการ - หากแอปของผู้ให้บริการขัดข้องหรือตอบสนองด้วย
RESULT_CANCELED
(นี่คือรหัสตอบกลับเริ่มต้น) LPA จะยกเลิก eSIM ขั้นตอนการเปิดใช้งาน - หากแอปของผู้ให้บริการตอบสนองด้วยสิ่งอื่นที่ไม่ใช่
RESULT_OK
หรือRESULT_CANCELED
LPA จะถือว่าเป็นข้อผิดพลาด
ด้วยเหตุผลด้านความปลอดภัย LPA ไม่ควรยอมรับ รหัสเปิดใช้งานที่ระบุใน Intent ของผลลัพธ์เพื่อให้แน่ใจว่าไม่ใช่ LPA ผู้โทรจะไม่ได้รับรหัสเปิดใช้งานจากแอปของผู้ให้บริการ
- หากแอปของผู้ให้บริการตอบสนองด้วย
เปิดขั้นตอนการเปิดใช้งาน LPA ในแอปของผู้ให้บริการ
ตั้งแต่ Android 11 เป็นต้นไป แอปของผู้ให้บริการจะใช้ eUICC API ได้ เพื่อเริ่ม LUI สำหรับ eSIM การเปิดใช้งาน วิธีนี้แสดง UI ขั้นตอนการเปิดใช้งาน eSIM ของ LPA เพื่อเปิดใช้งาน โปรไฟล์ eSIM จากนั้น LPA จะส่งประกาศเมื่อโปรไฟล์ eSIM สิ้นสุดการเปิดใช้งาน
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>
แอปของผู้ให้บริการทำงานโดยใช้ UI ของตัวเอง เช่น การบันทึก ในตัวผู้ใช้ หรือการส่งคำขอ HTTP ไปยังแบ็กเอนด์ของผู้ให้บริการ
ณ จุดนี้ แอปของผู้ให้บริการต้องพร้อมเปิดใช้งาน ผ่านการใช้งาน
ICarrierEuiccProvisioningService
แอปผู้ให้บริการเปิด LPA ด้วยการเรียกใช้startActivityForResult(Intent, int)
ที่มี วันที่android.telephony.euicc.action.START_EUICC_ACTIVATION
การดำเนินการ LPA ยังตรวจสอบค่าบูลีนเพิ่มเติมandroid.telephony.euicc.extra.USE_QR_SCANNER
หากค่าเป็นtrue
ค่า LPA เปิดตัวตัวสแกนคิวอาร์โค้ดเพื่อให้ผู้ใช้สแกนคิวอาร์โค้ดของโปรไฟล์ในฝั่ง LPA นั้น LPA จะผูกกับแอปของผู้ให้บริการ การใช้งาน
ICarrierEuiccProvisioningService
เพื่อดึงข้อมูลการเปิดใช้งาน และดาวน์โหลดโปรไฟล์ที่เกี่ยวข้อง LPA จะแสดงข้อมูลที่จําเป็นทั้งหมด องค์ประกอบ UI ระหว่างการดาวน์โหลด เช่น หน้าจอการโหลดเมื่อกระบวนการเปิดใช้งาน LPA เสร็จสมบูรณ์ LPA จะตอบสนองต่อ แอปของผู้ให้บริการที่มีรหัสผลลัพธ์ ซึ่งแอปของผู้ให้บริการจัดการ
onActivityResult(int, int, Intent)
- หาก LPA ดาวน์โหลดโปรไฟล์ eSIM ใหม่ได้สำเร็จ
ตอบกลับด้วย
RESULT_OK
- หากผู้ใช้ยกเลิกการเปิดใช้งานโปรไฟล์ eSIM ใน LPA
ตอบกลับด้วย
RESULT_CANCELED
- หาก LPA ตอบกลับด้วยสิ่งอื่นที่ไม่ใช่
RESULT_OK
หรือRESULT_CANCELED
แอปของผู้ให้บริการจะถือว่านี่เป็นข้อผิดพลาด
ด้วยเหตุผลด้านความปลอดภัย LPA จะไม่ยอมรับรหัสเปิดใช้งาน ใน Intent ที่ให้ไว้โดยตรงเพื่อให้แน่ใจว่าผู้โทรที่ไม่ได้อยู่ใน LPA จะไม่ได้รับ รหัสเปิดใช้งานจากแอปของผู้ให้บริการ
- หาก LPA ดาวน์โหลดโปรไฟล์ eSIM ใหม่ได้สำเร็จ
ตอบกลับด้วย
รองรับ 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