eUICC-APIs

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.

Android-Smartphone mit Carrier App und OEM LPA

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: