eSIM implementieren

Mit der integrierten SIM-Technologie (eSIM oder eUICC) können Nutzer von Mobilgeräten ein Profil herunterladen und den Dienst eines Transportunternehmens aktivieren, physische SIM-Karte Es ist eine globale Spezifikation auf der Basis der GSMA, mit der Remote-SIM-Bereitstellung (Remote SIM Provisioning, RSP) auf beliebigen Mobilgeräten Mit Android starten 9 bietet das Android-Framework Standard-APIs für auf die eSIM und die Aboprofile in der eSIM zu verwalten. Diese eUICC APIs ermöglichen es Drittanbietern, ihre eigenen Mobilfunkanbieter-Apps und ein lokales Profil zu entwickeln. Google Assistants (LPAs) auf eSIM-fähigen Android-Geräten.

Die LPA ist eine eigenständige System-App, die im Android-Build-Image Die Verwaltung der Profile in der eSIM erfolgt in der Regel LPA, da er als Brücke zwischen dem SM-DP+ (Remote-Dienst, bereitet Profilpakete vor und liefert sie an Geräte) sowie den eUICC-Chip. Das LPA-APK kann optional eine UI-Komponente mit der Bezeichnung LPA UI oder LUI enthalten, mit der einen zentralen Ort bereitstellen, an dem Endnutzer alle eingebetteten Abonnements verwalten können Profilen. Das Android-Framework erkennt automatisch die besten und leitet alle eUICC-Vorgänge über eine LPA-Instanz weiter.

Vereinfachte Architektur für Remote-SIM-Bereitstellung (RSP)

Abbildung 1: Vereinfachte RSP-Architektur

Mobilfunkanbieter, die an der Erstellung einer Mobilfunkanbieter-App interessiert sind, sollten sich die APIs in EuiccManager, mit übergeordneten Funktionen zur Profilverwaltung wie downloadSubscription(), switchToSubscription() und deleteSubscription()

Wenn Sie ein OEM sind und eine eigene LPA-System-App entwickeln möchten, erweitern EuiccService für das Android-Framework, um eine Verbindung zu Ihren LPA-Diensten herzustellen. Darüber hinaus können Sie sollten die APIs in EuiccCardManager, die ES10x-Funktionen auf Basis von GSMA RSP v2.0 bereitstellen. Diese Funktionen werden verwendet, um Befehle an den eUICC-Chip zu senden, z. B. prepareDownload(), loadBoundProfilePackage(), retrieveNotificationList() und resetMemory().

Die APIs in EuiccManager eine ordnungsgemäß implementierte LPA-App erforderlich und der Aufrufer von EuiccCardManager APIs müssen ein LPA sein. Dies wird vom Android-Framework erzwungen.

Geräte mit Android 10 oder höher unterstützen mit mehreren eSIMs. Weitere Informationen finden Sie unter Unterstützung mehrerer eSIMs.

Mobilfunkanbieter-App erstellen

Die eUICC-APIs in Android 9 ermöglichen können Mobilfunkanbieter Apps für die Verwaltung ihrer eigenen Profilen direkt hinzufügen. Dazu gehört auch das Herunterladen und Löschen von Aboprofilen und zu einem Profil eines Mobilfunkanbieters wechseln.

EuiccManager

EuiccManager ist der Haupteinstiegspunkt für Apps zur Interaktion mit dem LPA: Dazu gehören auch Mobilfunkanbieter-Apps, die heruntergeladen, gelöscht und Abos, die dem Mobilfunkanbieter gehören. Dazu gehört auch die LUI-System-App, die einen zentralen Ort/eine zentrale Benutzeroberfläche für die Verwaltung aller eingebetteten Abos bietet und kann eine andere App als die App sein, die das EuiccService bereitstellt.

Um die öffentlichen APIs nutzen zu können, muss eine Mobilfunkanbieter-App zuerst die Instanz von EuiccManager bis Context#getSystemService:

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

Du solltest prüfen, ob eSIM auf dem Gerät unterstützt wird, bevor du eSIM-Vorgänge EuiccManager#isEnabled() gibt in der Regel true zurück, wenn die Die Funktion android.hardware.telephony.euicc ist definiert und ein LPA-Paket ist präsent sind.

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

So erhalten Sie Informationen zur eUICC-Hardware und zur eSIM-Betriebssystemversion:

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

Viele APIs wie downloadSubscription() und switchToSubscription() verwenden PendingIntent-Rückrufe, da dies einige Sekunden oder sogar Minuten dauern kann. PendingIntent wird mit einem Ergebniscode im EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_-Bereich, der Folgendes bietet: Framework-definierten Fehlercodes sowie einem beliebigen detaillierten Ergebniscode vom LPA als EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE weitergegeben. die Mobilfunkanbieter-App zu Protokollierungs-/Fehlerbehebungszwecken zu verfolgen. Das PendingIntent Callback muss BroadcastReceiver sein.

Zum Herunterladen eines bestimmten, herunterladbaren Abonnements (aus einem Aktivierungscode oder QR-Code):

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

Definieren und verwenden Sie die Berechtigung in AndroidManifest.xml:

    <permission android:protectionLevel="signature" android:name="com.your.company.lpa.permission.BROADCAST" />
    <uses-permission android:name="com.your.company.lpa.permission.BROADCAST"/>

So wechseln Sie anhand der Abo-ID zu einem Abo:

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

Eine vollständige Liste der EuiccManager-APIs und Codebeispiele finden Sie unter eUICC-APIs.

Behebbare Fehler

In einigen Fällen kann das System den eSIM-Vorgang nicht abschließen aber der Fehler kann vom Nutzer behoben werden. Beispiel: downloadSubscription kann fehlschlagen, wenn in den Profilmetadaten ein Bestätigungscode des Mobilfunkanbieters angegeben ist. ist erforderlich. Oder switchToSubscription schlägt fehl, wenn die Mobilfunkanbieter-App über einen Mobilfunkanbieter verfügt. Berechtigungen für das Zielprofil (d. h., der Mobilfunkanbieter ist Inhaber des Profils), aber keine Mobilfunkanbieter-Berechtigungen für das derzeit aktivierte Profil hat und daher Nutzereinwilligung ist erforderlich.

In diesen Fällen wird der Rückruf des Anrufers mit EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR Der Callback Intent enthält interne Extras, die bei Weiterleitung des Aufrufs an EuiccManager#startResolutionActivity, kann über das LUI angefordert werden. Mit dem Bestätigungscode für um ein Beispiel für eine EuiccManager#startResolutionActivity löst einen LUI-Bildschirm aus, in dem der Nutzer einen Bestätigungscode eingeben kann. Nachdem der Code eingegeben wurde, wird der Downloadvorgang fortgesetzt. Dieser Ansatz überlässt es der Netzbetreiber-App volle Kontrolle darüber, wann die Benutzeroberfläche angezeigt wird, LPA/LUI – eine erweiterbare Methode für die neue Verarbeitung von wiederherstellbaren ohne dass Client-Apps geändert werden müssen.

Unter Android 9 werden diese EuiccService, Das LUI sollte Folgendes verarbeiten:

/**
 * 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";

Berechtigungen für Mobilfunkanbieter

Wenn Sie ein Mobilfunkanbieter sind und eine eigene App entwickeln, die EuiccManager aufruft Wenn du Profile auf ein Gerät herunterladen möchtest, sollte dein Profil den Mobilfunkanbieter Berechtigungsregeln, die der Mobilfunkanbieter-App in den Metadaten entsprechen. Dies ist da Aboprofile verschiedener Mobilfunkanbieter in eUICC eines Geräts festgelegt ist und jede Mobilfunkanbieter-App nur auf die die dem jeweiligen Mobilfunkanbieter gehören. Anbieter A sollte z. B. nicht in der Lage sein, ein Profil von Mobilfunkanbieter B herunterladen, aktivieren oder deaktivieren

Damit ein Profil nur für den Inhaber zugänglich ist, nutzt Android einen Mechanismus, der App des Profilinhabers (d. h. der Mobilfunkanbieter-App) besondere Berechtigungen zu gewähren. Die Android-Plattform lädt Zertifikate, die in der Zugriffregeldatei des Profils gespeichert sind (ARF) und gewährt Apps, die von diesen Zertifikaten signiert sind, die Berechtigung, Anrufe zu tätigen zu EuiccManager APIs. Der übergeordnete Prozess wird im Folgenden beschrieben:

  1. Der Betreiber signiert das APK der Mobilfunkanbieter-App. die apksigner hängt das Public-Key-Zertifikat an das APK an.
  2. Der Betreiber/SM-DP+ bereitet ein Profil und dessen Metadaten vor, darunter ein Formular zur Kontowiederherstellung. enthält:

    1. Signatur (SHA-1 oder SHA-256) des Public-Key-Zertifikats der Mobilfunkanbieter-App (erforderlich)
    2. Paketname der Mobilfunkanbieter-App (dringend empfohlen)
  3. Die Mobilfunkanbieter-App versucht, einen eUICC-Vorgang mit der EuiccManager API auszuführen.

  4. Die Android-Plattform überprüft den SHA-1- oder SHA-256-Hash der aufrufenden Apps mit der Signatur des Zertifikats aus dem das Formular zur Kontowiederherstellung ein. Wenn der Paketname der Mobilfunkanbieter-App in zur Verfügung stellen, muss er auch mit dem Paketnamen der Anrufer-App übereinstimmen.

  5. Nachdem die Unterschrift und der Paketname (falls enthalten) überprüft wurden, Der Anrufer-App wird der Mobilfunkanbieter-Berechtigung für das Zielprofil gewährt.

Da Profilmetadaten außerhalb des Profils selbst verfügbar sein können (sodass LPA kann die Profilmetadaten von SM-DP+ abrufen, bevor das Profil heruntergeladen oder von ISD-R, wenn das Profil deaktiviert ist), sollte es den dieselben Mobilfunkanbieter-Berechtigungsregeln wie im Profil festgelegt sind.

Das eUICC-Betriebssystem und SM-DP+ müssen das proprietäre Tag BF76 im Profil unterstützen Metadaten. Der Tag-Inhalt muss den zurückgegebenen Berechtigungen des Mobilfunkanbieters entsprechen das Applet für Zugriffsregel (Access Rule, AAA) definiert. UICC-Mobilfunkanbieterberechtigungen:

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
    }
}

Weitere Informationen zur App-Signatur findest du unter Signieren Sie Ihre App. Weitere Informationen zu den Berechtigungen für Mobilfunkanbieter finden Sie unter UICC-Mobilfunkanbieterberechtigungen.

Lokale Profilassistenten-App erstellen

Gerätehersteller können einen eigenen lokalen Profilassistenten (Local Profile Assistant, LPA) implementieren, Das muss angegriffen werden, mit den Euicc-APIs von Android. In den folgenden Abschnitten erhalten Sie einen kurzen Überblick eine LPA-App entwickelt und in das Android-System integriert.

Hardware-/Modemanforderungen

Der LPA und das eSIM-Betriebssystem auf dem eUICC-Chip müssen mindestens GSMA RSP (Remote SIM-Bereitstellung) 2.0 oder 2.2. Sie sollten auch SM-DP+ und SM-DS verwenden. Server mit einer passenden RSP-Version. Detaillierte Informationen zur RSP-Architektur finden Sie unter GSMA SGP.21 RSP-Architekturspezifikation

Für die Integration der eUICC-APIs in Android 9 – das Gerätemodem sollte Terminalfunktionen senden mit verschlüsselter Unterstützung für eUICC-Funktionen (lokale Profilverwaltung und Profildownload). Außerdem müssen die folgenden Methoden implementiert werden:

  • IRadio HAL v1.1: setSimPower
  • IRadio HAL v1.2: getIccCardStatus

  • IRadioConfig HAL v1.0: getSimSlotsStatus

  • IRadioConfig AIDL Version 1.0: getAllowedCarriers

    Der Google-LPA muss den Status der Sperre des Mobilfunkanbieters kennen, damit die eSIM nur für den zulässigen Mobilfunkanbieter heruntergeladen oder übertragen werden kann. Andernfalls kann es passieren, dass Nutzer eine SIM herunterladen und übertragen und später feststellen, dass das Gerät an einen anderen Mobilfunkanbieter gebunden ist.

    • Anbieter oder OEMs müssen die IRadioSim.getAllowedCarriers()HAL API implementieren.

    • Der Anbieter RIL / Modem muss den Sperrstatus und die Bewerber-ID des Mobilfunkanbieters angeben, an den das Gerät als Teil der IRadioSimResponse.getAllowedCarriersResponse()HAL API gebunden ist.

Das Modem sollte die eSIM mit aktiviertem Standard-Bootprofil als eine gültige SIM-Karte und lassen Sie die SIM-Karte eingeschaltet.

Für Geräte mit Android 10: eine nicht entfernbare eUICC Anzeigenflächen-ID-Array muss definiert werden. Siehe zum Beispiel 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>

Eine vollständige Liste der Modemanforderungen finden Sie unter Modemanforderungen für den eSIM-Support

Euicc-Service

Ein LPA besteht aus zwei separaten Komponenten, die beide im selben APK): das LPA-Back-End und die LPA-UI bzw. LUI

Um das LPA-Back-End zu implementieren, müssen Sie EuiccService und diesen Dienst in der Manifestdatei deklarieren. Für den Dienst muss die android.permission.BIND_EUICC_SERVICE-Systemberechtigung, um sicherzustellen, dass nur kann sich das System an sie binden. Der Dienst muss auch einen Intent-Filter mit die Aktion android.service.euicc.EuiccService. Die Priorität des Intents Filter sollte auf einen Wert ungleich null gesetzt werden, falls mehrere Implementierungen auf dem Gerät vorhanden ist. Beispiel:

<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>

Das Android-Framework bestimmt intern den aktiven LPA und interagiert mit um die Android eUICC APIs zu unterstützen. PackageManager wird abgefragt alle Apps mit der Berechtigung android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS, wodurch ein Dienst für die Aktion android.service.euicc.EuiccService angegeben wird. Der Dienst mit der höchsten Priorität wird ausgewählt. Wenn kein Dienst gefunden wird, Support ist deaktiviert.

Zum Implementieren des LUI müssen Sie eine Aktivität für die folgenden Aktionen angeben:

  • android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS
  • android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION

Wie beim Service muss auch bei jeder Aktivität der Parameter android.permission.BIND_EUICC_SERVICE Systemberechtigung. Jedes sollte ein Intent-Filter mit der entsprechenden Aktion, dem android.service.euicc.category.EUICC_UI und eine Priorität ungleich null. Mit einer ähnlichen Logik werden die Implementierungen für diese Aktivitäten mit der Auswahl der Implementierung EuiccService Beispiel:

<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>

Dies impliziert, dass die Benutzeroberfläche, die diese Bildschirme implementiert, von einer anderen das APK aus demjenigen, das EuiccService ob ein einzelnes APK oder mehrere APKs verwendet werden sollen, z. B. eines, EuiccService und eine mit LUI-Aktivitäten) ist eine Designentscheidung.

EuiccCardManager

EuiccCardManager ist die Oberfläche für die Kommunikation mit dem eSIM-Chip. Es stellt ES10-Funktionen bereit (wie in der GSMA RSP-Spezifikation beschrieben) und verarbeitet die Low-Level-APDU-Anfrage-/Antwortbefehle sowie ASN.1-Parsing. EuiccCardManager ist eine System-API und kann nur von systemprivilegierten Nutzern aufgerufen werden. Apps.

Mobilfunkanbieter-Apps, LPA und Euicc-APIs

Abbildung 2: Sowohl die Mobilfunkanbieter-App als auch der LPA verwenden Euicc-APIs

Für die Profilvorgangs-APIs über EuiccCardManager muss der Aufrufer mit lokalen Anzeigen. Dies wird vom Android-Framework erzwungen. Das bedeutet, dass der Aufrufer die EuiccService erweitern und in Ihrer Manifestdatei deklariert werden, wie unter in den vorherigen Abschnitten.

Ähnlich wie bei EuiccManager muss Ihr LPA zur Verwendung der EuiccCardManager-APIs Rufen Sie zuerst die Instanz von EuiccCardManager über Context#getSystemService:

EuiccCardManager cardMgr = (EuiccCardManager) context.getSystemService(Context.EUICC_CARD_SERVICE);

Gehen Sie dann so vor, um alle Profile auf der eUICC abzurufen:

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

Intern bindet EuiccCardManager an EuiccCardController (das im Telefonprozess) über eine AIDL-Schnittstelle und jede EuiccCardManager-Methode empfängt seinen Rückruf vom Telefonprozess über eine andere dedizierte AIDL . Bei der Verwendung von EuiccCardManager APIs muss der Aufrufer (LPA) eine Executor -Objekt, über das der Callback ausgelöst wird. Dieses Executor-Objekt kann auf folgenden Geräten ausgeführt werden: einem einzelnen Thread oder einem Thread-Pool Ihrer Wahl.

Die meisten EuiccCardManager APIs haben das gleiche Nutzungsmuster. Um beispielsweise eine gebundenen Profilpaket auf die eUICC:

...
cardMgr.loadBoundProfilePackage(eid, boundProfilePackage,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

So wechseln Sie zu einem anderen Profil mit einer bestimmten ICCID:

...
cardMgr.switchToProfile(eid, iccid, true /* refresh */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

So rufen Sie die SM-DP+ Standardadresse über den eUICC-Chip ab:

...
cardMgr.requestDefaultSmdpAddress(eid, AsyncTask.THREAD_POOL_EXECUTOR,
        callback);

So rufen Sie eine Liste der Benachrichtigungen für die jeweiligen Benachrichtigungsereignisse ab:

...
cardMgr.listNotifications(eid,
        EuiccNotification.Event.INSTALL
              | EuiccNotification.Event.DELETE /* events */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

eSIM-Profil über die App eines Mobilfunkanbieters aktivieren

Auf Geräten mit Android 9 oder höher kannst du die Aktivierung über die App des Mobilfunkanbieters vornehmen die eSIM herunter und laden Sie Profile herunter. Die Mobilfunkanbieter-App kann Profile herunterladen, indem Anrufen downloadSubscription oder indem Sie dem LPA einen Aktivierungscode zur Verfügung stellen.

Wenn eine Mobilfunkanbieter-App per Anruf ein Profil herunterlädt downloadSubscription, Der Aufruf erzwingt, dass die App das Profil über eine BF76 verwalten kann Metadaten-Tag die Mobilfunkanbieterprivilegien für die zu erstellen. Wenn ein Profil kein BF76-Tag hat oder das zugehörige BF76-Tag nicht mit der Signatur der anrufenden App des Mobilfunkanbieters übereinstimmt, wird der Download abgelehnt.

Im folgenden Abschnitt wird beschrieben, wie eine eSIM über die App eines Mobilfunkanbieters mit einer Aktivierungscode.

eSIM mit einem Aktivierungscode aktivieren

Wenn du einen Aktivierungscode zum Aktivieren eines eSIM-Profils verwendest, ruft der LPA einen Aktivierungscode von und lädt das Profil herunter. Dieser Vorgang kann vom LPA initiiert werden Der LPA kann den gesamten UI-Ablauf steuern, d. h., dass keine Benutzeroberfläche einer Mobilfunkbetreiber-App angezeigt. Bei diesem Ansatz wird die Tag-Prüfung BF76 umgangen und Netzbetreiber Implementierung des gesamten UI-Workflows für die eSIM-Aktivierung, einschließlich des Herunterladens eines eSIM-Profil und Fehlerbehandlung

eUICC-Bereitstellungsdienst des Mobilfunkanbieters definieren

Die LPA- und die Mobilfunkanbieter-App kommunizieren über zwei AIDL Schnittstellen: ICarrierEuiccProvisioningService und IGetActivationCodeCallback. Der Mobilfunkanbieter App muss eine ICarrierEuiccProvisioningService-Schnittstelle implementieren und in ihrer eigenen Manifest-Deklaration. Die LPA muss an ICarrierEuiccProvisioningService gebunden und implementiert werden IGetActivationCodeCallback. Weitere Informationen zur Implementierung und eine AIDL-Schnittstelle verfügbar machen, siehe Definieren und AIDL-Schnittstelle.

Erstellen Sie die folgenden AIDL-Dateien, um die AIDL-Schnittstellen zu definieren für LPA- und Mobilfunkanbieter-Apps.

  • 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();
    }
    

Beispiel für die Implementierung von LPA

So binden Sie eine Bindung an die ICarrierEuiccProvisioningService-Implementierung der Mobilfunkanbieter-App: muss die LPA sowohl ICarrierEuiccProvisioningService.aidl als auch IGetActivationCodeCallback.aidl hinzu und implementieren Sie ServiceConnection.

@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
    mCarrierProvisioningService = ICarrierEuiccProvisioningService.Stub.asInterface(iBinder);
}

Nach der Bindung an die ICarrierEuiccProvisioningService des Mobilfunkanbieters ruft der LPA entweder getActivationCode oder getActivationCodeForEid, um den Aktivierungscode von der Mobilfunkanbieter-App zu erhalten. und übergeben die Implementierung der Stub-Klasse IGetActivationCodeCallback.

Der Unterschied zwischen getActivationCode und getActivationCodeForEid besteht darin, Mit getActivationCodeForEid kann ein Mobilfunkanbieter vorab ein Profil an das Gerät binden EID vor Beginn des Downloadvorgangs.

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
    }
}

Beispiel für die Implementierung einer Mobilfunkanbieter-App

Damit der LPA an die Mobilfunkanbieter-App gebunden werden kann, muss die Mobilfunkanbieter-App beide ICarrierEuiccProvisioningService.aidl und IGetActivationCodeCallback.aidl nach und legen Sie den Dienst ICarrierEuiccProvisioningService im AndroidManifest.xml-Datei. Für den Dienst muss die android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS Systemberechtigung erforderlich dass sich nur der LPA, eine systemprivilegierte App, an sie binden kann. Der Dienst muss fügen Sie auch einen Intent-Filter mit der Aktion „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>
    

Erstellen Sie einen Dienst und erweitern Sie die Stub, um den AIDL-Carrier-App-Dienst zu implementieren. Klasse und implementiere die getActivationCode und getActivationCodeForEid . Der LPA kann dann beide Methoden aufrufen, um die Profilaktivierung abzurufen. Code. Die Mobilfunkanbieter-App sollte durch einen Anruf antworten IGetActivationCodeCallback#onSuccess durch den Aktivierungscode, falls der Code erfolgreich vom Server des Mobilfunkanbieters abgerufen wurde. Falls das Problem nicht behoben wird, sollte mit IGetActivationCodeCallback#onFailure antworten.

  • 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);
              }
          }
    }
    

Benutzeroberfläche der Mobilfunkanbieter-App während der Aktivierung der LPA starten

Auf Geräten mit Android 11 und höher kann der LPA die Benutzeroberfläche einer Mobilfunkanbieter-App starten. Das ist nützlich, da eine Mobilfunkanbieter-App möglicherweise zusätzliche Informationen aus der bevor Sie dem LPA einen Aktivierungscode übergeben. So können Mobilfunkanbieter Nutzer müssen sich anmelden, um ihre Telefonnummern zu aktivieren oder eine andere Rufnummernmitnahme durchzuführen Dienstleistungen.

So starten Sie die UI einer Mobilfunkanbieter-App im LPA:

  1. Der LPA startet den Aktivierungsvorgang der Mobilfunkanbieter-App durch Senden der android.service.euicc.action.START_CARRIER_ACTIVATION Intent für den Mobilfunkanbieter-App-Paket, das die Aktion enthält. Der Empfänger der Mobilfunkanbieter-App muss in der Manifest-Deklaration durch android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" bis Vermeiden Sie den Empfang von Intents von Nicht-LPA-Apps.)

    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);
    
  2. Die Mobilfunkanbieter-App nutzt ihre eigene Benutzeroberfläche. Zum Beispiel Logging oder HTTP-Anfragen an das Back-End des Mobilfunkanbieters senden.

  3. Die Mobilfunkanbieter-App ruft setResult(int, Intent) auf, um dem LPA zu antworten und finish().

    1. Wenn die Mobilfunkanbieter-App mit RESULT_OK antwortet, wird der LPA den Aktivierungsvorgang fortsetzt. Wenn die Mobilfunkanbieter-App feststellt, dass der Nutzer sollte einen QR-Code scannen, anstatt sich vom LPA binden zu lassen. verwendet, antwortet die Mobilfunkanbieter-App mithilfe von setResult(int, Intent) mit RESULT_OK und einer Intent-Instanz mit dem booleschen Extra android.telephony.euicc.extra.USE_QR_SCANNER auf true festgelegt. LPA prüft dann die zusätzlichen Daten und startet den QR-Scanner, anstatt die ICarrierEuiccProvisioningService-Implementierung der Mobilfunkanbieter-App.
    2. Wenn die Mobilfunkanbieter-App abstürzt oder mit RESULT_CANCELED reagiert (Dies ist der Standardantwortcode), bricht die LPA die eSIM ab. Aktivierungsablauf.
    3. Wenn die Mobilfunkanbieter-App RESULT_OK oder RESULT_CANCELED behandelt die LPA dies als Fehler.

    Aus Sicherheitsgründen sollten die LPA keine direkt akzeptierten Aktivierungscode, der im Ergebnis-Intent angegeben ist, um sicherzustellen, können Anrufer keinen Aktivierungscode von der App des Mobilfunkanbieters erhalten.

LPA-Aktivierungsvorgang in der App eines Mobilfunkanbieters starten

Ab Android 11 können Mobilfunkanbieter-Apps eUICC APIs verwenden um ein LUI für eSIM zu starten Aktivierung. Bei dieser Methode wird die Benutzeroberfläche des eSIM-Aktivierungsvorgangs des LPA angezeigt, die aktiviert werden kann dem eSIM-Profil. Der LPA sendet dann eine Nachricht, wenn das eSIM-Profil Aktivierung abgeschlossen.

  1. Die LPA muss eine Aktivität deklarieren, die einen Intent-Filter mit der Eigenschaft Aktion „android.service.euicc.action.START_EUICC_ACTIVATION“. Die Priorität des Intent-Filters auf einen Wert ungleich null gesetzt werden, falls mehrere Implementierungen auf dem Gerät vorhanden sind. Beispiel:

    <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>
    
  2. Die Mobilfunkanbieter-App nutzt ihre eigene Benutzeroberfläche. Zum Beispiel Logging oder HTTP-Anfragen an das Back-End des Mobilfunkanbieters senden.

  3. Die Mobilfunkanbieter-App muss jetzt für eine Aktivierung bereit sein durch die ICarrierEuiccProvisioningService-Implementierung programmieren. Die startet die Mobilfunkanbieter-App startActivityForResult(Intent, int) mit dem android.telephony.euicc.action.START_EUICC_ACTIVATION Aktion ausführen. Der LPA prüft auch das boolesche Extra android.telephony.euicc.extra.USE_QR_SCANNER Wenn der Wert true ist, LPA startet den QR-Scanner, damit der Nutzer den QR-Code des Profils scannen kann.

  4. Auf der LPA-Seite bindet sich der LPA an den Implementierung von ICarrierEuiccProvisioningService zum Abrufen der Aktivierung und laden Sie das entsprechende Profil herunter. Auf dem LPA werden alle erforderlichen UI-Elemente während des Downloads, z. B. ein Ladebildschirm

  5. Wenn die Aktivierung der LPA abgeschlossen ist, antwortet sie auf die die App des Mobilfunkanbieters mit einem Ergebniscode, den die App des Mobilfunkanbieters verarbeitet, onActivityResult(int, int, Intent)

    1. Wenn der LPA das neue eSIM-Profil heruntergeladen hat, antwortet mit RESULT_OK.
    2. Storniert der Nutzer die Aktivierung des eSIM-Profils auf dem LPA, antwortet mit RESULT_CANCELED.
    3. Wenn der LPA mit etwas anderem als RESULT_OK oder RESULT_CANCELED behandelt die Mobilfunkanbieter-App dies als Fehler.

    Aus Sicherheitsgründen akzeptiert die LPA keinen Aktivierungscode. direkt in den angegebenen Intent ein, um sicherzustellen, dass Nicht-LPA-Aufrufer Aktivierungscode aus der App des Mobilfunkanbieters.

Unterstützung mehrerer eSIMs

Bei Geräten mit Android 10 oder höher EuiccManager-Klasse unterstützt Geräte mit mehreren eSIMs. Geräte mit einer einzelnen eSIM, die aktualisiert werden auf Android 10 keine Änderungen an der LPA-Implementierung verknüpft die EuiccManager-Instanz automatisch mit dem standardmäßigen eUICC. Die Die standardmäßige eUICC wird von der Plattform für Geräte mit der Funk-HAL-Version bestimmt. Version 1.2 oder höher und vom LPA für Geräte mit Funk-HAL-Versionen niedriger als 1.2

Voraussetzungen

Um mehrere eSIMs zu unterstützen, muss das Gerät mehr als eine eUICC haben, die entweder ein integrierter eUICC oder ein physischer SIM-Steckplatz für austauschbare eUICCs eingefügt.

Zur Unterstützung mehrerer eSIMs ist Radio HAL Version 1.2 oder höher erforderlich. Radio HAL Empfohlen werden Version 1.4 und RadioConfig HAL Version 1.2.

Implementierung

Damit mehrere eSIMs (einschließlich austauschbarer eUICCs oder programmierbarer SIMs) unterstützt werden, LPA muss EuiccService, das die Slot-ID empfängt, die der vom Anrufer bereitgestellten Karten-ID entspricht.

Die non_removable_euicc_slots Ressource in arrays.xml ist ein Array mit Ganzzahlwerten, die die Slot-IDs der integrierten eUICCs. Sie müssen diese Ressource angeben, damit die Plattform bestimmen kann, ob eine eingefügte eUICC entfernt werden kann.

Mobilfunkanbieter-App für ein Gerät mit mehreren eSIMs

Wenn du eine Mobilfunkanbieter-App für ein Gerät mit mehreren eSIMs erstellst, verwende die createForCardId in EuiccManager ein EuiccManager-Objekt zu erstellen, das an ein die angegebene Karten-ID enthält. Die Karten-ID ist ein ganzzahliger Wert, der eine UICC eindeutig identifiziert oder eine eUICC auf dem Gerät.

Um die Karten-ID für die standardmäßige eUICC des Geräts zu erhalten, verwende die getCardIdForDefaultEuicc in TelephonyManager. Diese Methode gibt UNSUPPORTED_CARD_ID wenn die Radio-HAL-Version niedriger als 1.2 ist und UNINITIALIZED_CARD_ID wenn das Gerät die eUICC nicht gelesen hat.

Du kannst Karten-IDs auch von getUiccCardsInfo und getUiccSlotsInfo (System-API) in TelephonyManager und getCardId in SubscriptionInfo.

Wenn ein EuiccManager-Objekt mit einer bestimmten Karten-ID instanziiert wurde, werden alle Vorgänge werden mit dieser Karten-ID an die eUICC weitergeleitet. Wenn die eUICC nicht erreichbar (z. B. weil es deaktiviert oder entfernt wurde) EuiccManager nein länger funktioniert.

Sie können die folgenden Codebeispiele verwenden, um eine Mobilfunkanbieter-App zu erstellen.

Beispiel 1: Aktives Abo abrufen und EuiccManager instanziieren

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

Beispiel 2: Über UICCs iterieren und EuiccManager für eine abnehmbarer 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);
}

Zertifizierungsstufe

AOSP ist nicht mit einer LPA-Implementierung ausgestattet und es wird von Ihnen auch nicht erwartet, dass Sie haben einen LPA, der in allen Android-Versionen verfügbar ist (nicht jedes Smartphone unterstützt eSIM). Für Aus diesem Grund gibt es keine End-to-End-CTS-Testfälle. Grundlegende Testfälle sind in AOSP verfügbar, damit die eUICC-APIs verfügbar gemacht werden sind in Android-Builds gültig.

Achten Sie darauf, dass die Builds die folgenden CTS-Testfälle bestehen (für öffentliche APIs): /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts

Anbieter, die eine App des Mobilfunkanbieters implementieren, sollten ihre gewohnten Abläufe intern vornehmen. Qualitätssicherung um sicherzustellen, dass alle implementierten Funktionen wie erwartet funktionieren. Im muss die Mobilfunkanbieter-App alle Aboprofile anzeigen können. einem Anbieter gehören, ein Profil herunterladen und installieren, einen Dienst aktivieren , um zwischen Profilen zu wechseln oder Profile zu löschen.

Wenn Sie Ihren eigenen LPA erstellen, sollten Sie viel strenger vorgehen. Tests durchführen. Wenden Sie sich an Ihren Modem-, eUICC- oder eSIM-Anbieter-Anbieter SM-DP+ Anbieter und Mobilfunkanbieter, um Probleme zu lösen und die Interoperabilität innerhalb der RSP-Architektur. Eine gute Menge an manuellen Tests unvermeidlich. Für eine optimale Testabdeckung GSMA SGP.23 RSP-Testplan.