eUICC-APIs

In Android 9, Profil - Management - APIs (öffentliche und @SystemApi) sind durch die Klasse verfügbar EuiccManager . eUICC Kommunikations APIs (@SystemApi nur) durch die Klasse zur Verfügung EuiccCardManager .

Über eUICC

Netzbetreiber können mit EuiccManager Netzbetreiber-Apps erstellen, um Profile zu verwalten, wie in Abbildung 1 gezeigt. Netzbetreiber-Apps müssen keine System-Apps sein, sondern müssen über Netzbetreiberberechtigungen verfügen, die von eUICC-Profilen gewährt werden. Eine LPA app (LUI und LPA backend) braucht ein System app (dh in dem Systemabbild enthielt) , um die @SystemApi zu nennen.

Android-Telefon mit Carrier App und OEM LPA

Abbildung 1. Android - Handys mit Träger App und OEM LPA

Neben der Logik des Aufrufs EuiccCardManager und im Gespräch mit eUICC, LPA - Anwendungen müssen die folgenden implementieren:

  • SM-DP+-Client kommuniziert mit SM-DP+-Server, um Profile zu authentifizieren und herunterzuladen
  • [Optional] SM-DS, um mehr potenzielle herunterladbare Profile zu erhalten
  • Benachrichtigungsbehandlung, um Benachrichtigungen an den Server zu senden, um den Profilstatus zu aktualisieren
  • [Optional] Slots-Verwaltung einschließlich Umschalten zwischen eSIM- und pSIM-Logik. Dies ist optional, wenn das Telefon nur über einen eSIM-Chip verfügt.
  • eSIM-OTA

Obwohl mehr als ein LPA - App in einem Android - Handy sein kann, kann nur eine LPA ausgewählt werden die tatsächlichen Arbeits LPA auf die in der definierten Priorität basiert sein AndroidManifest.xml Datei jeder App.

Verwenden von EuiccManager

Die LPA APIs sind öffentlich über EuiccManager (unter Paket android.telephony.euicc ). Ein Träger App kann die Instanz von bekommen EuiccManager , und die Methoden in rufen EuiccManager die eUICC Informationen und verwalten Abonnements zu erhalten (bezeichnet als Profile in GSMA RSP - Dokumente) als SubscriptionInfo Instanzen.

Zum Aufrufen öffentlicher APIs einschließlich Download-, Wechsel- und Löschvorgängen von Abonnements muss die Mobilfunkanbieter-App über die erforderlichen Berechtigungen verfügen. Mobilfunkanbieter-Berechtigungen werden vom Mobilfunkanbieter in den Profilmetadaten hinzugefügt. Die eUICC-API erzwingt die Berechtigungsregeln des Betreibers entsprechend.

Die Android-Plattform verarbeitet die Profilrichtlinienregeln nicht. Wenn in den Profilmetadaten eine Richtlinienregel deklariert ist, kann der LPA wählen, wie der Profildownload und das Installationsverfahren gehandhabt werden soll. Es ist beispielsweise möglich, dass ein OEM-LPA eines Drittanbieters Richtlinienregeln mithilfe eines speziellen Fehlercodes verarbeitet (der Fehlercode wird vom OEM-LPA an die Plattform übergeben, dann übergibt die Plattform den Code an die OEM-LUI).

APIs

Die folgenden APIs können in dem zu finden EuiccManager Referenzdokumentation und EuiccManager.java .

Instanz abrufen (öffentlich)

Ruft die Instanz des EuiccManager durch Context#getSystemService .

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

Check aktiviert (öffentlich)

Überprüft, ob das eingebettete Abonnement aktiviert ist. Dies sollte vor dem Zugriff auf LPA-APIs überprüft werden.

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

EID abrufen (öffentlich)

Ruft die EID ab, die die eUICC-Hardware identifiziert. Dies kann null sein, wenn die eUICC nicht bereit ist. Der Anrufer muss Träger Privileg oder die haben READ_PRIVILEGED_PHONE_STATE Erlaubnis.

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

Holen Sie sich EuiccInfo (öffentlich)

Ruft Informationen über die eUICC ab. Diese enthält die OS-Version.

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

Abonnement herunterladen (öffentlich)

Lädt das angegebene Abonnement herunter (in GSMA RSP-Dokumenten als "Profil" bezeichnet). Das Abonnement kann aus einem Aktivierungscode erstellt werden. Beispielsweise kann ein Aktivierungscode aus einem QR-Code geparst werden. Das Herunterladen eines Abonnements ist ein asynchroner Vorgang.

Der Anrufer muss entweder die WRITE_EMBEDDED_SUBSCRIPTIONS Erlaubnis oder Trägerberechtigungen für das Ziel Abonnement hat.

// 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 zu (aktiviert) das angegebene Abonnement. Der Anrufer muss entweder WRITE_EMBEDDED_SUBSCRIPTIONS oder Träger Privilegien für die aktuelle Abonnement und das Ziel Abonnement aktiviert.

// 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);

Abonnement löschen (öffentlich)

Löscht ein Abonnement mit einer Abonnement-ID. Wenn das Abonnement derzeit aktiv ist, wird es zunächst deaktiviert. Der Anrufer muss entweder WRITE_EMBEDDED_SUBSCRIPTIONS oder Trägerberechtigungen für das Ziel Abonnement.

// 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 Abonnements löschen (System-API)

Löscht alle Abonnements auf einem Gerät. Ab Android 11, sollten Sie einen bieten EuiccCardManager#ResetOption Enum - Wert angeben , ob alle Test, operativen oder beiden Arten von Abonnements zu löschen. Der Anrufer muss WRITE_EMBEDDED_SUBSCRIPTIONS Erlaubnis.

// 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);

Auflösungsaktivität starten (öffentlich)

Startet eine Aktivität, um einen vom Benutzer behebbaren Fehler zu beheben. Wenn eine Operation kehrt EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR , kann diese Methode aufgerufen werden , um den Benutzer aufzufordern , das Problem zu beheben. Diese Methode kann nur einmal für einen bestimmten Fehler aufgerufen werden.

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

Konstanten

Um eine Liste der siehe public Konstanten in EuiccManager finden Konstanten .