Carrier-Konfiguration

Android 6.0 und höher bieten die Möglichkeit für privilegierte Apps, eine anbieterspezifische Konfiguration für die Plattform bereitzustellen. Diese Funktionalität, die auf den in Android 5.1 (Lollipop MR1) eingeführten UICC-Trägerprivilegien basiert, ermöglicht die Verlagerung der Netzbetreiberkonfiguration von den statischen Konfigurationsüberlagerungen und gibt Netzbetreibern und OEMs die Möglichkeit, der Plattform über eine definierte Schnittstelle dynamisch Netzbetreiberkonfigurationen bereitzustellen.

Eine ordnungsgemäß signierte Betreiber-App kann entweder im Systemabbild vorinstalliert, automatisch installiert oder manuell über einen App Store installiert werden. Die App wird von der Plattform abgefragt, um Konfigurationen für Einstellungen bereitzustellen, darunter:

  • Roaming-/Nicht-Roaming-Netzwerke
  • Visuelle Voicemail
  • SMS/MMS-Netzwerkeinstellungen
  • VoLTE/IMS-Konfigurationen

Die Festlegung, welche Werte zurückgegeben werden sollen, liegt vollständig bei der Carrier-App und kann dynamisch auf der Grundlage detaillierter Informationen erfolgen, die über die Plattform an die App übermittelt werden.

Die Hauptvorteile dieses Ansatzes sind:

  • Dynamische Konfiguration – Unterstützung für Konzepte wie nicht von MCCMNC abgeleitete Konfigurationen, zum Beispiel mobile virtuelle Netzwerkbetreiber (MVNOs) oder Kunden, die sich für zusätzliche Dienste entscheiden.
  • Unterstützung für Geräte, die über jeden Kanal verkauft werden – beispielsweise kann ein Telefon auf dem freien Markt automatisch mit den richtigen Einstellungen konfiguriert werden, indem eine App aus einem App Store heruntergeladen wird.
  • Sicherheit – Die Berechtigung zur Bereitstellung dieser Konfiguration wird nur Apps gewährt, die vom Netzbetreiber signiert sind.
  • Definierte API – Bisher wurde diese Konfiguration hauptsächlich in internen XML-Overlays innerhalb des Frameworks und nicht über eine öffentliche API gespeichert. Die Carrier-Konfigurations-API in Android 6.0 ist öffentlich und klar definiert.

Wie es funktioniert

Laden der Konfiguration

Die von dieser Funktion bereitgestellte Trägerkonfiguration besteht aus einer Reihe von Schlüssel-Wert-Paaren, die verschiedene telefoniebezogene Verhaltensweisen auf der Plattform ändern.

Der Wertesatz für ein bestimmtes Gerät wird ermittelt, indem die folgenden Komponenten der Reihe nach abgefragt werden:

  1. Die Carrier-App (dies ist optional, aber der empfohlene Speicherort für zusätzliche Konfigurationen, die über das hinausgehen, was im Android Open Source Project (AOSP) vorhanden ist)
  2. Die mit dem Systemabbild gebündelte Plattformkonfigurations-App
  3. Standardwerte, fest im Framework codiert (entspricht dem Verhalten vor Android 6.0)

Die Plattformkonfigurations-App

Eine generische Plattformkonfigurations-App ist im Systemabbild enthalten. Diese App kann Werte für alle Variablen bereitstellen, die die reguläre Carrier-App nicht bereitstellt. Die Plattformkonfigurations-App finden Sie (in Android 6.0) unter: packages/apps/CarrierConfig

Der Zweck dieser App besteht darin, eine Konfiguration pro Netzwerk bereitzustellen, wenn keine Netzbetreiber-App installiert ist und Netzbetreiber/OEMs in ihren eigenen Bildern nur minimale Änderungen daran vornehmen sollten. Stattdessen sollten Netzbetreiber eine separate Netzbetreiber-App für die Netzbetreiberanpassung bereitstellen, sodass Updates über Kanäle wie App-Stores verteilt werden können.

Wie Privilegien einer Mobilfunkanbieter-App gewährt werden

Die betreffende Mobilfunkanbieter-App muss mit demselben Zertifikat signiert sein, das sich auf der SIM-Karte befindet, wie in UICC Carrier Privileges dokumentiert.

Welche Informationen werden an die Carrier-App weitergegeben?

Die Carrier-App wird mit folgenden Werten versorgt und kann so dynamisch entscheiden, welche Werte zurückgegeben werden sollen:

  • MCC
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • Träger-ID

Weitere Informationen zur Integration von Carrier-IDs finden Sie unter Carrier-IDs mit CarrierConfig integrieren .

Beim Laden erfolgt die Carrier-Konfiguration

Der Aufbau der Liste der Schlüssel-Wert-Paare erfolgt wie folgt:

  • Wenn die SIM-Karte geladen ist (Booten oder SIM-Hot-Swap)
  • Wenn die Carrier-App manuell ein Neuladen auslöst
  • Wenn die Mobilfunkanbieter-App aktualisiert wird

Weitere Informationen finden Sie in der Referenz zu android.service.carrier.CarrierService#onLoadConfig() .

Mit der config

Wenn die Konfiguration erstellt wird, werden die darin enthaltenen Werte verwendet, um verschiedene Werte der Systemkonfiguration festzulegen, darunter:

  • Interne Framework-Telefonieeinstellungen
  • Vom SDK zurückgegebene Konfigurationswerte, beispielsweise in SmsManager
  • App-Einstellungen wie VVM-Verbindungswerte im Dialer

Konfigurationsschlüssel

Die Liste der Schlüssel ist als Teil des öffentlichen SDK in android.telephony.CarrierConfigManager definiert und kann innerhalb derselben API-Ebene nicht geändert werden. Eine Zusammenfassung der Schlüssel finden Sie in der folgenden Tabelle.

Erstellen der App

Erstellen der App

Ihre App muss auf die API-Ebene Android 6.0 (23) ausgerichtet sein.

Deklarieren einer 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 bereitstellen möchten.
  2. Fügen Sie Logik hinzu, um notifyConfigChangedForSubId in Szenarien aufzurufen, in denen sich die Netzbetreiberkonfiguration im Laufe der Zeit ändern kann (z. B. wenn der Benutzer seinem Konto zusätzliche Dienste hinzufügt).

Ein Beispiel ist unten:

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 Einzelheiten finden Sie in der Referenz zu android.service.carrier.CarrierService .

Benennen der Klasse im Manifest

Ein Beispiel ist unten:

<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

Die Anforderungen finden Sie unter UICC Carrier Privileges .

APNs mit einer Mobilfunkanbieter-App hinzufügen

Um APNs programmgesteuert über eine Mobilfunkanbieter-App hinzuzufügen (z. B. während der SIM-Aktivierung), verwenden Sie ContentResolver APIs , um APN-Elemente zu einem Inhaltsanbieter 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 .

Testen der App

Wenn Sie Ihre Konfigurations-App erstellt haben, können Sie Ihren Code testen mit:

  • Eine SIM-Karte mit einer gültigen Zertifikatsignatur
  • Ein Gerät mit Android 6.0 und höher, beispielsweise ein Android-Gerät