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 Anwendung wird von der Plattform abgefragt, um Einstellungen für folgende Einstellungen zu konfigurieren:
- 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 alle Kanäle verkauft werden: Beispielsweise kann ein Open-Market-Smartphone 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.
- Defined API: Bisher wurde diese Konfiguration hauptsächlich in internen XML-Overlays innerhalb des Frameworks und nicht über eine öffentliche API gespeichert. Die Konfigurations-API für Mobilfunkanbieter in Android 6.0 ist öffentlich und klar definiert.
Funktionsweise
Konfiguration laden
Die Mobilfunkanbieter-Konfiguration dieser Funktion besteht aus einer Reihe von Schlüssel/Wert-Paaren, die verschiedene Telefoniefunktionen auf der Plattform ändern.
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 Speicherort für zusätzliche Konfigurationen, die nicht im Android Open Source Project (AOSP) enthalten sind)
- Die mit dem System-Image gebündelte App zur Plattformkonfiguration
- Im Framework hartcodierte Standardwerte (entspricht dem Verhalten vor Android 6.0)
Die Plattformkonfigurations-App
Eine generische Plattformkonfigurationsanwendung ist mit dem System-Image gebündelt. Diese App kann Werte für alle Variablen bereitstellen, die die reguläre Mobilfunkanbieter-App nicht unterstützt. Die App für die Plattformkonfiguration (in Android 6.0) finden Sie hier: 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 gewähren Sie einer Mobilfunkanbieter-App Berechtigungen
Die betreffende Mobilfunkanbieter-App muss mit demselben Zertifikat signiert sein, das sich auf der SIM-Karte befindet, wie unter UICC-Berechtigungen für Mobilfunkanbieter beschrieben.
Welche Informationen an die App des Mobilfunkanbieters übergeben werden
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 zum Einbinden von Mobilfunkanbieter-IDs finden Sie unter Mobilfunkanbieter-IDs in CarrierConfig einbinden.
Beim Laden der Mobilfunkanbieter-Konfiguration
Die Liste der Schlüssel/Wert-Paare wird erstellt:
- Wenn die SIM-Karte geladen wird (Starten oder Hot-Swap der SIM-Karte)
- Wenn die App des Mobilfunkanbieters manuell ein Aktualisieren auslöst
- Wenn die Mobilfunkanbieter-App aktualisiert wird
Weitere Informationen finden Sie in der Referenz zu
android.service.carrier.CarrierService#onLoadConfig()
.
Konfiguration verwenden
Bei der Erstellung der Konfiguration 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 Telefon
Konfigurationsschlüssel
Die Liste der Schlüssel wird als Teil des öffentlichen SDK in android.telephony.CarrierConfigManager
definiert und kann auf derselben API-Ebene nicht geändert werden. Eine Zusammenfassung der Schlüssel finden Sie in der folgenden Tabelle.
App erstellen
App erstellen
Deine App muss auf das Android 6.0 API-Level (23) ausgerichtet sein.
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 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 der Klasse im Manifest einen Namen.
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>
App mit demselben Zertifikat auf der SIM signieren
Weitere Informationen zu den Anforderungen finden Sie unter UICC-Mobilfunkanbieterberechtigungen.
APNs mit einer Mobilfunkanbieter-App hinzufügen
Wenn Sie APNs programmatisch über eine Mobilfunkanbieter-App hinzufügen möchten, z. B. bei der SIM-Aktivierung, können Sie
ContentResolver
APIs verwenden, um einem durch den URI
android.provider.Telephony.Carriers.CONTENT_URI
identifizierten Inhaltsanbieter 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
Wenn Sie Ihre Konfigurations-App erstellt haben, können Sie den Code folgendermaßen testen:
- Eine SIM mit einer gültigen Zertifikatssignatur
- Ein Gerät mit Android 6.0 oder höher, z. B. ein Android-Gerät
Funktionen des Mobilfunkanbieterdienstes festlegen
In Android geben die Dienstfunktionen des Mobilfunkanbieters an, ob Sprach-, Messaging- und Datendienste auf einem Gerät unterstützt werden. Mobilfunkanbieter können die Funktionen des Mobilfunkanbieters für ein Gerät auf Geräteebene und auf Aboebene (Android 15 oder höher) angeben.
Dienstfunktionen auf Geräteebene
Dienstfunktionen auf Geräteebene werden konfiguriert, wenn ein Gerät hergestellt wird (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:
Abo-Dienste
Bei Geräten mit Android 15 oder höher können Mobilfunkanbieter die Dienstfunktionen des Geräts auf Aboebene angeben. Wenn du Dienstfunktionen auf Aboebene angeben möchtest, verwende die
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
API. Wenn Sie beispielsweise angeben möchten, dass ein Abo nur für Daten vorgesehen ist, legen Sie den Wert auf
SubscriptionManager#SERVICE_CAPABILITY_DATA
fest.
Apps (vorinstallierte System-Apps und Drittanbieter-Apps) können die Funktionen des Mobilfunkanbieters 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 Telefon-App keine Anrufe zulässt, wenn der Nutzer ein reines Datenabo hat.
Verworfene APIs für Dienstfunktionen
Ab Android 15 bietet Android Dienstfunktionen sowohl auf Geräte- als auch auf Aboebene. Aufgrund dieser Änderung wurden die vorhandenen APIs für Funktionen auf Geräteebene zur besseren Lesbarkeit umbenannt. 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() |