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 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:

  1. Die App des Mobilfunkanbieters (optional, aber empfohlener Ort für zusätzliche Konfigurationen, die über das Android Open Source Project (AOSP) hinausgehen)
  2. Die im System-Image enthaltene Plattformkonfigurations-App
  3. 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.

  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 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()