In Android 6.0 und höher können privilegierte Apps anbieterspezifische Konfigurationen für die Plattform bereitstellen. Diese Funktion basiert auf den UICC-Carrier-Berechtigungen, die in Android 5.1 (Lollipop MR1) eingeführt wurden. Sie ermöglicht es, die Carrier-Konfiguration von den statischen Konfigurations-Overlays zu trennen. Außerdem können Carrier und OEMs die Carrier-Konfiguration über eine definierte Schnittstelle dynamisch für die Plattform bereitstellen.
Eine ordnungsgemäß signierte Carrier-App kann entweder im System-Image vorinstalliert, automatisch installiert oder manuell über einen App-Store installiert werden. Die Plattform fragt die App ab, um die Konfiguration für Einstellungen abzurufen, darunter:
- Roaming-/Nicht-Roaming-Netzwerke
- Visuelle Mailbox
- Netzwerkeinstellungen für SMS/MMS
- VoLTE-/IMS-Konfigurationen
Die Entscheidung, welche Werte zurückgegeben werden, liegt vollständig bei der App des Mobilfunkanbieters und kann dynamisch sein, basierend auf detaillierten Informationen, die über die Plattform an die App übergeben werden.
Die wichtigsten Vorteile dieses Ansatzes sind:
- Dynamische Konfiguration: Unterstützung von Konzepten wie Konfigurationen, die nicht von MCCMNC abgeleitet werden, z. B. mobile virtuelle Netzwerkbetreiber (MVNOs) oder die Einwilligung von Kunden in zusätzliche Dienste.
- Unterstützung für Geräte, die über einen beliebigen Kanal verkauft werden: Ein im freien Handel erhältliches Smartphone kann beispielsweise automatisch mit den richtigen Einstellungen konfiguriert werden, indem eine App aus einem App-Shop heruntergeladen wird.
- Sicherheit: Das Recht, diese Konfiguration bereitzustellen, wird nur Apps gewährt, die vom Mobilfunkanbieter signiert wurden.
- Definierte API: Bisher wurde diese Konfiguration hauptsächlich in internen XML-Overlays im Framework und nicht über eine öffentliche API gespeichert. Die Carrier Config API in Android 6.0 ist öffentlich und gut definiert.
Funktionsweise
Konfiguration laden
Die von dieser Funktion bereitgestellte Mobilfunkanbieterkonfiguration ist eine Reihe von Schlüssel/Wert-Paaren, die verschiedene telefoniebezogene Verhaltensweisen auf der Plattform ändern.
Die Werte für ein bestimmtes Gerät werden durch Abfragen der folgenden Komponenten in der angegebenen Reihenfolge ermittelt:
- Die App des Mobilfunkanbieters (optional, aber der empfohlene Ort für zusätzliche Konfigurationen, die über das Android Open Source Project (AOSP) hinausgehen)
- Die im Systemimage enthaltene Plattformkonfigurations-App
- Standardwerte, die im Framework hartcodiert sind (entspricht dem Verhalten vor Android 6.0)
Die Plattformkonfigurations-App
Eine allgemeine App zur Plattformkonfiguration ist im System-Image enthalten. Diese App kann Werte für alle Variablen liefern, die die reguläre Carrier-App nicht enthält. Die App „Plattformkonfiguration“ finden Sie unter Android 6.0 unter packages/apps/CarrierConfig
.
Diese App dient dazu, eine netzwerkspezifische Konfiguration bereitzustellen, wenn keine Mobilfunkanbieter-App installiert ist. Mobilfunkanbieter und OEMs sollten nur minimale Änderungen an ihren eigenen Images vornehmen. Stattdessen sollten Mobilfunkanbieter die separate Mobilfunkanbieter-App für die Anpassung bereitstellen, damit Updates über Kanäle wie App-Stores verteilt werden können.
So wird einer Mobilfunkanbieter-App eine Berechtigung erteilt
Die betreffende Mobilfunkanbieter-App muss mit demselben Zertifikat signiert sein, das sich auf der SIM-Karte befindet, wie in UICC Carrier Privileges beschrieben.
Welche Informationen werden an die Mobilfunkanbieter-App weitergegeben?
Die App des Mobilfunkanbieters erhält die folgenden Werte, sodass sie dynamisch entscheiden kann, welche Werte zurückgegeben werden sollen:
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- Mobilfunkanbieter-ID
Weitere Informationen zum Einbinden von Mobilfunkanbieter-IDs finden Sie unter Mobilfunkanbieter-IDs in CarrierConfig einbinden.
Wann die Carrier-Konfiguration geladen wird
Die Liste der Schlüssel/Wert-Paare wird so erstellt:
- Wenn die SIM geladen wird (beim Booten oder beim Hot-Swap der SIM)
- Wenn die App des Mobilfunkanbieters manuell ein Neuladen auslöst
- Wann die App des Mobilfunkanbieters aktualisiert wird
Weitere Informationen finden Sie in der Referenz zu
android.service.carrier.CarrierService#onLoadConfig()
.
Konfiguration verwenden
Wenn die Konfiguration erstellt wird, werden die darin enthaltenen Werte verwendet, um verschiedene Werte der Systemkonfiguration festzulegen, darunter:
- Interne Framework-Telefonieeinstellungen
- Von SDK zurückgegebene Konfigurationswerte, z. B. in SmsManager
- App-Einstellungen wie VVM-Verbindungswerte im Dialer
Konfigurationsschlüssel
Die Liste der Schlüssel ist Teil des öffentlichen SDK in android.telephony.CarrierConfigManager
und kann sich innerhalb desselben API-Levels nicht ändern. Eine Zusammenfassung der Schlüssel finden Sie in der Tabelle unten.
App erstellen
App erstellen
Ihre App muss auf das Android 6.0-API-Level (23) ausgerichtet sein.
Eine Klasse deklarieren, die android.service.carrier.CarrierService überschreibt
- Überschreiben Sie
onLoadConfig
, um die Werte zurückzugeben, die Sie basierend auf dem übergebenenservice.carrier.CarrierIdentifier
-Objekt bereitstellen möchten. - Fügen Sie Logik hinzu, um
notifyConfigChangedForSubId
in Szenarien aufzurufen, in denen sich die Konfiguration des Mobilfunkanbieters im Laufe der Zeit ändern kann (z. B. wenn der Nutzer seinem Konto zusätzliche Dienste hinzufügt).
Ein Beispiel ist unten aufgeführt:
public class SampleCarrierConfigService extends CarrierService { private static final String TAG = "SampleCarrierConfigService"; public SampleCarrierConfigService() { Log.d(TAG, "Service created"); } @Override public PersistableBundle onLoadConfig(CarrierIdentifier id) { Log.d(TAG, "Config being fetched"); PersistableBundle config = new PersistableBundle(); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL, true); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false); config.putInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT, 6); // Check CarrierIdentifier and add more config if needed… return config; } }
Weitere Informationen finden Sie in der Referenz zu android.service.carrier.CarrierService
.
Klasse im Manifest benennen
Ein Beispiel ist unten aufgeführt:
<service android:name=".SampleCarrierConfigService" android:label="@string/service_name" android:permission="android.permission.BIND_CARRIER_SERVICES"> <intent-filter> <action android:name="android.service.carrier.CarrierService"/></intent-filter> </service>
App mit demselben Zertifikat auf der SIM-Karte signieren
Informationen zu den Anforderungen finden Sie unter UICC Carrier Privileges.
APNs mit einer Mobilfunkanbieter-App hinzufügen
Wenn Sie APNs programmatisch über eine Carrier-App hinzufügen möchten (z. B. während der SIM-Aktivierung), verwenden Sie die
ContentResolver
-APIs, um APN-Elemente zu einem Content-Provider hinzuzufügen, der durch den URI
android.provider.Telephony.Carriers.CONTENT_URI
identifiziert wird.
Weitere Informationen zur Tabellenstruktur für den Inhalts-URI finden Sie unter
Telephony.Carriers
.
Weitere Informationen finden Sie unter APN und CarrierConfig.
App testen
Nachdem Sie Ihre Konfigurations-App erstellt haben, können Sie Ihren Code mit folgenden Tools testen:
- Eine SIM-Karte mit einer gültigen Zertifikatsignatur
- Ein Gerät mit Android 6.0 oder höher, z. B. ein Android-Gerät
Funktionen des Mobilfunkanbieterdienstes festlegen
In Android beschreiben die Funktionen des Mobilfunkanbieters, ob Sprach-, Messaging- und Datendienste auf einem Gerät unterstützt werden. Mobilfunkanbieter können die Funktionen des Mobilfunkanbieterdienstes für ein Gerät auf Geräte- und Aboebene angeben (Android 15 oder höher).
Dienstfunktionen auf Geräteebene
Dienstfunktionen auf Geräteebene werden bei der Herstellung eines Geräts konfiguriert und können danach nicht mehr geändert werden. Mobilfunkanbieter können Gerätefunktionen über die folgenden Überschreibungen von Systemressourcen angeben:
Apps können die Dienstfunktionen auf Geräteebene über die folgenden APIs abfragen:
Dienstfunktionen auf Aboebene
Bei Geräten mit Android 15 oder höher können Mobilfunkanbieter die Dienstfunktionen des Geräts auf Aboebene angeben. Verwenden Sie die
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
API, um Dienstfunktionen auf Aboebene anzugeben. Wenn Sie beispielsweise angeben möchten, dass ein Abo nur Daten umfasst, legen Sie den Wert auf
SubscriptionManager#SERVICE_CAPABILITY_DATA
fest.
Apps (vorinstallierte System-Apps und Drittanbieter-Apps) können die Funktionen des Mobilfunkanbieterdienstes für ein bestimmtes Abo über die Methode
SubscriptionInfo.getServiceCapabilities()
abfragen. So können App-Entwickler die Nutzerfreundlichkeit von Apps basierend auf den verfügbaren Funktionen für das Abo anpassen. App-Entwickler können beispielsweise dafür sorgen, dass die Dialer-App keine Anrufe zulässt, wenn der Nutzer ein reines Datenabo hat.
Veraltete APIs für Dienstfunktionen
Ab Android 15 bietet Android sowohl Dienstfunktionen auf Geräte- als auch auf Aboebene. Aufgrund dieser Änderung wurden die vorhandenen APIs für Gerätefunktionen umbenannt, um die Lesbarkeit zu verbessern. In der folgenden Tabelle sind die eingestellten APIs und die in Android 15 eingeführten umbenannten APIs aufgeführt:
Eingestellt (Android 14 oder niedriger) | Entspricht (Android 15 oder höher) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |