Unter Android 9 werden APIs zur Profilverwaltung (öffentliche und
@SystemApi) sind über die Klasse EuiccManager
verfügbar. eUICC-Kommunikation
APIs (nur @SystemApi) sind über die Klasse EuiccCardManager
verfügbar.
Über eUICC
Mobilfunkanbieter können Mobilfunkanbieter-Apps zur Profilverwaltung über EuiccManager erstellen (siehe Abbildung unten) in Abbildung 1. Mobilfunkanbieter-Apps müssen keine System-Apps sein, aber einen Mobilfunkanbieter haben Berechtigungen, die durch eUICC-Profile gewährt werden. Eine LPA-App (LUI und LPA) Back-End) muss eine System-App (d.h. im System-Image enthalten) sein, die aufgerufen wird, die @SystemApi.
Abbildung 1: Android-Smartphones mit Mobilfunkanbieter-App und OEM-LPA
Neben der Logik zum Aufrufen von EuiccCardManager
und dem Sprechen mit eUICC werden LPA-Apps
muss Folgendes implementiert werden:
- SM-DP+-Client, der zur Authentifizierung mit dem SM-DP+-Server kommuniziert Profile herunterladen
- [Optional] SM-DS, um mehr Profile zum Herunterladen zu erhalten
- Benachrichtigungsverarbeitung, um Benachrichtigungen an den Server zu senden, Profilstatus aktualisieren
- [Optional] Slotverwaltung, einschließlich Wechsel zwischen eSIM und pSIM-Logik. Das ist optional, wenn das Smartphone nur einen eSIM-Chip hat.
- eSIM-OTA
Obwohl mehrere LPA-Apps auf einem Android-Smartphone vorhanden sein können, ist nur eine LPA-App vorhanden.
kann basierend auf der in den
der Datei AndroidManifest.xml
jeder Anwendung
EuiccManager verwenden
Die LPA APIs sind über EuiccManager
öffentlich (unter dem Paket)
android.telephony.euicc
). Eine Mobilfunkanbieter-App kann
die Instanz von EuiccManager
abrufen,
und die Methoden in EuiccManager
aufrufen, um die eUICC-Informationen abzurufen und
Abos (werden in GSMA RSP-Dokumenten als Profile bezeichnet) als
SubscriptionInfo-Instanzen.
Öffentliche APIs aufrufen, einschließlich Herunterladen, Wechseln und Löschen des Abos muss die Mobilfunkanbieter-App über die erforderlichen Berechtigungen verfügen. Spediteur Berechtigungen werden vom Mobilfunkanbieter in den Profilmetadaten hinzugefügt. Die eUICC Die API erzwingt die entsprechenden Mobilfunkanbieter-Berechtigungsregeln.
Die Android-Plattform verarbeitet die Profilrichtlinien nicht. Wenn eine Richtlinienregel in den Profilmetadaten deklariert ist, kann die LPA festlegen, wie Profildownload und Installationsvorgang. Zum Beispiel kann ein Drittanbieter-OEM-LPA zur Verarbeitung von Richtlinienregeln mit einem speziellen Fehlercode (der Fehlercode wird der Code vom OEM LPA an die Plattform übergeben. Anschließend übergibt die Plattform den an den OEM LUI.
Informationen zu mehreren aktivierten Profil-APIs finden Sie unter Mehrere aktivierte Profile:
APIs
Die folgenden APIs finden Sie in der
Referenzdokumentation zu EuiccManager
und
EuiccManager.java
Instanz abrufen (öffentlich)
Ruft die Instanz von EuiccManager
über Context#getSystemService
ab.
Weitere Informationen finden Sie unter
getSystemService
EuiccManager mgr = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);
Prüfung aktiviert (öffentlich)
Prüft, ob das eingebettete Abo aktiviert ist. Dies sollte aktiviert werden
bevor Sie auf LPA APIs zugreifen. Weitere Informationen finden Sie unter
isEnabled
boolean isEnabled = mgr.isEnabled();
if (!isEnabled) {
return;
}
EID abrufen (öffentlich)
Ruft die EID zur Identifizierung der eUICC-Hardware ab. Dieser Wert kann null sein, wenn die eUICC
noch nicht bereit. Der Aufrufer muss die Berechtigung des Mobilfunkanbieters haben oder die
Berechtigung „READ_PRIVILEGED_PHONE_STATE
“. Weitere Informationen finden Sie unter
getEid
String eid = mgr.getEid();
if (eid == null) {
// Handle null case.
}
EuiccInfo abrufen (öffentlich)
Ruft Informationen zur eUICC ab. Enthält die Version des Betriebssystems. Weitere Informationen
Siehe
getEuiccInfo
EuiccInfo info = mgr.getEuiccInfo();
String osVer = info.getOsVersion();
Abo herunterladen (öffentlich)
das angegebene Abo herunterlädt (in GSMA RSP als „Profil“ bezeichnet) Dokumente). Das Abo kann aus einem Aktivierungscode erstellt werden. Für Beispiel: Ein Aktivierungscode kann von einem QR-Code geparst werden. Das Herunterladen eines "subscription" ist ein asynchroner Vorgang.
Der Aufrufer muss entweder die Berechtigung WRITE_EMBEDDED_SUBSCRIPTIONS
haben oder
Sie haben Mobilfunkanbieter-Berechtigungen für das Zielabo. Weitere Informationen finden Sie unter
downloadSubscription
// 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);
Abo wechseln (öffentlich)
Wechselt zum angegebenen Abo (aktiviert) Der Aufrufer muss entweder
WRITE_EMBEDDED_SUBSCRIPTIONS
oder Mobilfunkanbieter-Berechtigungen für den aktuellen
und das Zielabo. Weitere Informationen finden Sie unter
switchToSubscription
// 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);
Abo mit Port wechseln (öffentlich)
(Verfügbar ab Android 13) Schalter zu (aktiviert)
Das angegebene Abo mit dem angegebenen Portindex.
Der Anrufer muss entweder WRITE_EMBEDDED_SUBSCRIPTIONS
oder einen Mobilfunkanbieter haben
Berechtigungen für das aktuell aktivierte Abo und das Zielabo.
Weitere Informationen finden Sie unter
switchToSubscription
// 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 */, 0 /*portIndex*/, callbackIntent);
Ist SIM-Port verfügbar (öffentlich)
public boolean isSimPortAvailable(int portIndex)
(Verfügbar ab Android 13) Gibt zurück, ob das Ereignis
Portindex übergeben wird. Ein Port ist verfügbar, wenn er
kein Abo aktiviert ist oder die Anruf-App über den Mobilfunkanbieter berechtigt ist,
das auf dem ausgewählten Port installiert ist. Weitere Informationen finden Sie unter
isSimPortAvailable
Abo löschen (öffentlich)
Löscht ein Abo mit einer Abo-ID. Wenn das Abo derzeit
aktiv ist, wird sie zuerst deaktiviert. Der Aufrufer muss entweder
WRITE_EMBEDDED_SUBSCRIPTIONS
- oder Mobilfunkanbieter-Berechtigungen für das Ziel
Abo. Weitere Informationen finden Sie unter
deleteSubscription
// 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);
Alle Abos löschen (System-API)
Löscht alle Abos auf einem Gerät. In Android starten
11 haben, müssen Sie eine EuiccCardManager#ResetOption
angeben
Enum-Wert, der angibt, ob alle Test-, Betriebs- oder beide Arten von
Abos. Der Aufrufer muss die Berechtigung WRITE_EMBEDDED_SUBSCRIPTIONS
haben.
// 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);
Lösungsaktivität starten (öffentlich)
Startet eine Aktivität, um einen vom Nutzer behebbaren Fehler zu beheben. Wenn ein Vorgang zurückgegeben wird
EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR
, diese Methode kann
aufgerufen, um den Nutzer aufzufordern, das Problem zu beheben. Diese Methode kann nur aufgerufen werden,
für einen bestimmten Fehler.
...
mgr.startResolutionActivity(getActivity(), 0 /* requestCode */, resultIntent, callbackIntent);
Konstanten
Eine Liste der public
-Konstanten in EuiccManager
finden Sie unter
Konstanten: