Anbieterkonfiguration

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:

  1. Die App des Mobilfunkanbieters (optional, aber empfohlener Speicherort für zusätzliche Konfigurationen, die nicht im Android Open Source Project (AOSP) enthalten sind)
  2. Die mit dem System-Image gebündelte App zur Plattformkonfiguration
  3. 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

  1. Überschreiben Sie onLoadConfig, um die Werte zurückzugeben, die Sie basierend auf dem übergebenen service.carrier.CarrierIdentifier-Objekt angeben möchten.
  2. 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()