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.
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:
- Der Betreiber signiert das APK der Mobilfunkanbieter-App. die apksigner hängt das Public-Key-Zertifikat an das APK an.
Der Betreiber/SM-DP+ bereitet ein Profil und dessen Metadaten vor, darunter ein Formular zur Kontowiederherstellung. enthält:
- Signatur (SHA-1 oder SHA-256) des Public-Key-Zertifikats der Mobilfunkanbieter-App (erforderlich)
- Paketname der Mobilfunkanbieter-App (dringend empfohlen)
Die Mobilfunkanbieter-App versucht, einen eUICC-Vorgang mit der
EuiccManager
API auszuführen.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.
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.
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:
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 durchandroid: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);
Die Mobilfunkanbieter-App nutzt ihre eigene Benutzeroberfläche. Zum Beispiel Logging oder HTTP-Anfragen an das Back-End des Mobilfunkanbieters senden.
Die Mobilfunkanbieter-App ruft
setResult(int, Intent)
auf, um dem LPA zu antworten undfinish()
.- 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 vonsetResult(int, Intent)
mitRESULT_OK
und einerIntent
-Instanz mit dem booleschen Extraandroid.telephony.euicc.extra.USE_QR_SCANNER
auftrue
festgelegt. LPA prüft dann die zusätzlichen Daten und startet den QR-Scanner, anstatt dieICarrierEuiccProvisioningService
-Implementierung der Mobilfunkanbieter-App. - Wenn die Mobilfunkanbieter-App abstürzt oder mit
RESULT_CANCELED
reagiert (Dies ist der Standardantwortcode), bricht die LPA die eSIM ab. Aktivierungsablauf. - Wenn die Mobilfunkanbieter-App
RESULT_OK
oderRESULT_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.
- Wenn die Mobilfunkanbieter-App mit
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.
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>
Die Mobilfunkanbieter-App nutzt ihre eigene Benutzeroberfläche. Zum Beispiel Logging oder HTTP-Anfragen an das Back-End des Mobilfunkanbieters senden.
Die Mobilfunkanbieter-App muss jetzt für eine Aktivierung bereit sein durch die
ICarrierEuiccProvisioningService
-Implementierung programmieren. Die startet die Mobilfunkanbieter-AppstartActivityForResult(Intent, int)
mit demandroid.telephony.euicc.action.START_EUICC_ACTIVATION
Aktion ausführen. Der LPA prüft auch das boolesche Extraandroid.telephony.euicc.extra.USE_QR_SCANNER
Wenn der Werttrue
ist, LPA startet den QR-Scanner, damit der Nutzer den QR-Code des Profils scannen kann.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 LadebildschirmWenn 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)
- Wenn der LPA das neue eSIM-Profil heruntergeladen hat,
antwortet mit
RESULT_OK
. - Storniert der Nutzer die Aktivierung des eSIM-Profils auf dem LPA,
antwortet mit
RESULT_CANCELED
. - Wenn der LPA mit etwas anderem als
RESULT_OK
oderRESULT_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.
- Wenn der LPA das neue eSIM-Profil heruntergeladen hat,
antwortet mit
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.