Android 6.0 und höher bieten die Möglichkeit, dass berechtigte Apps die Plattform anbieterspezifisch konfigurieren. Diese Funktion basiert auf den UICC-Berechtigungen für Mobilfunkanbieter, die in Android 5.1 (Lollipop MR1) eingeführt wurden. So kann die Mobilfunkanbieterkonfiguration von den statischen Konfigurations-Overlays entfernt werden. Mobilfunkanbieter und OEMs können die Mobilfunkanbieterkonfiguration dann über eine definierte Schnittstelle dynamisch für die Plattform bereitstellen.
Eine ordnungsgemäß signierte Mobilfunkanbieter-App kann entweder im System-Image vorinstalliert, automatisch installiert oder manuell über einen App-Shop installiert werden. Die Plattform fragt die App zur Konfiguration der folgenden Einstellungen ab:
- Roaming-/Nicht-Roaming-Netzwerke
- Visuelle Mailbox
- SMS/MMS-Netzwerkeinstellungen
- VoLTE/IMS-Konfigurationen
Welche Werte zurückgegeben werden, liegt ausschließlich in der Verantwortung der Mobilfunkanbieter-App und kann dynamisch auf der Grundlage detaillierter Informationen erfolgen, die über die Plattform an die App übergeben werden.
Die wichtigsten Vorteile dieses Ansatzes sind:
- Dynamische Konfiguration: Unterstützung von Konzepten wie der nicht von MCCMNC abgeleiteten Konfiguration, z. B. von mobilen virtuellen Netzwerkbetreibern (MVNOs) oder Kunden, die zusätzliche Dienste aktivieren.
- Unterstützung für Geräte, die über jeden Kanal verkauft werden: Beispielsweise kann ein Smartphone, das im freien Markt gekauft wurde, 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 innerhalb des Frameworks 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 besteht aus einer Reihe von Schlüssel/Wert-Paaren, mit denen verschiedene telefonbezogene Verhaltensweisen auf der Plattform geändert werden.
Die Werte für ein bestimmtes Gerät werden durch Abfragen der folgenden Komponenten in der Reihenfolge ermittelt:
- Die App des Mobilfunkanbieters (optional, aber empfohlener Ort für zusätzliche Konfigurationen, die über das Android Open Source Project (AOSP) hinausgehen)
- Die im System-Image enthaltene Plattformkonfigurations-App
- Im Framework hartcodierte Standardwerte (entspricht dem Verhalten vor Android 6.0)
Die Plattformkonfigurations-App
Eine generische Plattformkonfigurations-App ist im System-Image enthalten. Diese App kann Werte für alle Variablen liefern, die die reguläre App des Mobilfunkanbieters nicht liefert. Die Plattformkonfigurations-App finden Sie unter Android 6.0 unter: packages/apps/CarrierConfig
Diese App dient der netzwerkspezifischen Konfiguration, wenn keine Mobilfunkanbieter-App installiert ist. Mobilfunkanbieter und OEMs sollten in ihren eigenen Images nur minimale Änderungen daran vornehmen. Stattdessen sollten Mobilfunkanbieter eine separate App für die Anpassung durch den Mobilfunkanbieter bereitstellen, damit Updates über Kanäle wie App-Shops 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-Berechtigungen für Mobilfunkanbieter beschrieben.
Welche Informationen werden an die Mobilfunkanbieter-App übergeben?
Die Mobilfunk-App 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 zur Integration von Mobilfunkanbieter-IDs findest du unter Mobilfunkanbieter-IDs in CarrierConfig einbinden.
Beim Laden der Mobilfunkanbieterkonfiguration
Die Liste der Schlüssel/Wert-Paare wird in folgenden Fällen erstellt:
- Wenn die SIM geladen wird (Starten oder Hot-Swap der SIM)
- Wenn die App des Mobilfunkanbieters manuell ein Aktualisieren auslöst
- Wenn die App des Mobilfunkanbieters aktualisiert wird
Weitere Informationen finden Sie in der Referenz
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 Telefonieeinstellungen des Frameworks
- Vom SDK zurückgegebene Konfigurationswerte, z. B. in SmsManager
- App-Einstellungen wie VVM-Verbindungswerte im Dialer
Konfigurationsschlüssel
Die Liste der Schlüssel wird als Teil des öffentlichen SDKs in android.telephony.CarrierConfigManager
definiert und kann sich innerhalb derselben API-Ebene nicht ändern. In der Tabelle unten finden Sie eine Zusammenfassung der Tasten.
App erstellen
App erstellen
Ihre App muss auf die API-Ebene 23 von Android 6.0 ausgerichtet sein.
Deklarieren Sie eine Klasse, die android.service.carrier.CarrierService überschreibt.
- Überschreiben Sie
onLoadConfig
, um die Werte zurückzugeben, die Sie basierend auf dem übergebenenservice.carrier.CarrierIdentifier
-Objekt angeben möchten. - Füge Logik hinzu, um
notifyConfigChangedForSubId
in Szenarien aufzurufen, in denen sich die Mobilfunkanbieterkonfiguration im Laufe der Zeit ändern kann (z. B. wenn der Nutzer seinem Konto zusätzliche Dienste hinzufügt).
Hier ein Beispiel:
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
.
Geben Sie im Manifest einen Namen für die Klasse an.
Hier ein Beispiel:
<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>
Signieren Sie die App mit demselben Zertifikat auf der SIM-Karte.
Weitere Informationen zu den Anforderungen finden Sie unter UICC-Berechtigungen des Mobilfunkanbieters.
APNs mit einer Mobilfunkanbieter-App hinzufügen
Wenn Sie APNs programmatisch über eine Mobilfunkanbieter-App hinzufügen möchten (z. B. während der SIM-Aktivierung), verwenden Sie
ContentResolver
APIs, um einem Inhaltsanbieter, der über den URI
android.provider.Telephony.Carriers.CONTENT_URI
identifiziert wird, APN-Elemente hinzuzufügen.
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
Unter Android wird mit den Funktionen von Mobilfunkdiensten angegeben, ob Sprach-, Messaging- und Datendienste auf einem Gerät unterstützt werden. Mobilfunkanbieter können die Funktionen des Mobilfunkdienstes für ein Gerät auf Geräteebene und auf 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 nach der Herstellung nicht mehr geändert werden. Mobilfunkanbieter können Funktionen auf Geräteebene ü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 du beispielsweise angeben möchtest, dass ein Abo nur Daten enthält, setze den Wert auf
SubscriptionManager#SERVICE_CAPABILITY_DATA
.
Apps (vorinstallierte System-Apps und Drittanbieter-Apps) können die Mobilfunkdienstfunktionen für ein bestimmtes Abo über die Methode
SubscriptionInfo.getServiceCapabilities()
abfragen. So können App-Entwickler die Nutzerfreundlichkeit von Apps anhand der verfügbaren Funktionen für das Abo anpassen. App-Entwickler können beispielsweise dafür sorgen, dass die Telefonanruf-App keine Anrufe zulässt, wenn der Nutzer ein reines Datentarif-Abo hat.
Verworfene APIs für Dienstfunktionen
Ab Android 15 bietet Android sowohl Dienstfunktionen auf Geräteebene als auch auf Aboebene. Aufgrund dieser Änderung wurden die vorhandenen APIs für Funktionen auf Geräteebene umbenannt, um die Lesbarkeit zu verbessern. In der folgenden Tabelle sind die eingestellten APIs und die in Android 15 umbenannten APIs aufgeführt:
Eingestellt (Android 14 oder niedriger) | Äquivalent (Android 15 oder höher) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |