Konfiguracja przewoźnika

Android 6.0 i nowsze obejmują możliwość uprzywilejowanych aplikacji w celu zapewnienia konfiguracji platformy dla konkretnego operatora. Ta funkcjonalność, oparta na uprawnieniach przewoźnika UICC wprowadzonych w systemie Android 5.1 (Lollipop MR1), umożliwia odejście od statycznej konfiguracji nośnej i daje operatorom i producentom OEM możliwość dynamicznego dostarczania konfiguracji nośnej do platformy za pośrednictwem zdefiniowanego interfejsu.

Prawidłowo podpisana aplikacja operatora może zostać wstępnie załadowana do obrazu systemu, zainstalowana automatycznie lub ręcznie za pośrednictwem sklepu z aplikacjami. Aplikacja wysyła zapytanie do platformy w celu skonfigurowania ustawień, w tym:

  • Sieci roamingowe / nonroamingowe
  • Wizualna poczta głosowa
  • Ustawienia sieci SMS / MMS
  • Konfiguracje VoLTE / IMS

Określenie, jakie wartości zwracać, zależy wyłącznie od aplikacji przewoźnika i może być dynamiczne na podstawie szczegółowych informacji przekazywanych do aplikacji za pośrednictwem platformy.

Kluczowe zalety tego podejścia to:

  • Konfiguracja dynamiczna - obsługa koncepcji, takich jak konfiguracja nie oparta na MCCMNC, na przykład operatorzy wirtualnych sieci komórkowych (MVNO) lub klient decyduje się na dodatkowe usługi.
  • Obsługa urządzeń sprzedawanych za pośrednictwem dowolnego kanału - na przykład telefon na otwartym rynku można automatycznie skonfigurować z odpowiednimi ustawieniami, pobierając aplikację ze sklepu z aplikacjami.
  • Bezpieczeństwo - uprawnienia do zapewnienia takiej konfiguracji mają tylko aplikacje podpisane przez operatora.
  • Zdefiniowany interfejs API - wcześniej ta konfiguracja była przechowywana głównie w wewnętrznych nakładkach XML w ramach, a nie za pośrednictwem publicznego interfejsu API. Interfejs API konfiguracji operatora w systemie Android 6.0 jest publiczny i dobrze zdefiniowany.

Jak to działa

Ładowanie config

Konfiguracja operatora dostarczana przez tę funkcję to zestaw par klucz-wartość, które zmieniają różne zachowania związane z telefonią na platformie.

Zestaw wartości dla określonego urządzenia jest określany przez odpytywanie następujących składników w kolejności:

  1. Aplikacja operatora (jest to opcjonalne, ale jest to zalecana lokalizacja dla dodatkowej konfiguracji poza tym, co istnieje w Android Open Source Project (AOSP))
  2. Aplikacja konfiguracji platformy dołączona do obrazu systemu
  3. Wartości domyślne, zakodowane na stałe w strukturze (odpowiednik zachowania przed Androidem 6.0)

Aplikacja konfiguracji platformy

Ogólna aplikacja konfiguracji platformy jest dołączona do obrazu systemu. Ta aplikacja może dostarczać wartości dla dowolnych zmiennych, których nie ma w zwykłej aplikacji przewoźnika. Aplikację konfiguracyjną platformy można znaleźć (w systemie Android 6.0) w: packages/apps/CarrierConfig

Celem tej aplikacji jest zapewnienie pewnej konfiguracji dla sieci, gdy aplikacja operatora nie jest zainstalowana, a operatorzy / producenci OEM powinni wprowadzać tylko minimalne zmiany w swoich własnych obrazach. Zamiast tego przewoźnicy powinni zapewnić oddzielną aplikację operatora do dostosowywania operatora, umożliwiając dystrybucję aktualizacji za pośrednictwem ścieżek, takich jak sklepy z aplikacjami.

Sposób nadawania uprawnień aplikacji operatora

Aplikacja przewoźnika, o której mowa, musi być podpisana tym samym certyfikatem, który znajduje się na karcie SIM, jak udokumentowano w uprawnieniach przewoźnika UICC .

Jakie informacje są przekazywane do aplikacji przewoźnika

Aplikacja przewoźnika jest dostarczana z następującymi wartościami, umożliwiając jej dynamiczne podejmowanie decyzji o tym, jakie wartości zwrócić:

  • MCK
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • Identyfikator przewoźnika

Aby uzyskać więcej informacji na temat integracji identyfikatorów przewoźników, zobacz Integracja identyfikatorów przewoźników z CarrierConfig .

Podczas wczytywania konfiguracji przewoźnika następuje

Zbudowanie listy par klucz-wartość następuje:

  • Po załadowaniu karty SIM (rozruch lub wymiana karty SIM)
  • Gdy aplikacja operatora ręcznie uruchamia ponowne załadowanie
  • Kiedy aplikacja operatora zostanie zaktualizowana

Więcej informacji można znaleźć w dokumentacji android.service.carrier.CarrierService#onLoadConfig() .

Korzystanie z config

Podczas budowania konfiguracji wartości w niej zawarte służą do ustawiania różnych wartości konfiguracji systemu, w tym:

  • Wewnętrzne ustawienia telefonii ramowej
  • Wartości konfiguracyjne zwrócone przez zestaw SDK, na przykład w SmsManager
  • Ustawienia aplikacji, takie jak wartości połączeń VVM w Dialer

Klucze konfiguracyjne

Lista kluczy jest zdefiniowana jako część publicznego zestawu SDK w android.telephony.CarrierConfigManager i nie można jej zmieniać na tym samym poziomie interfejsu API. Podsumowanie kluczy zawiera poniższa tabela.

Tworzenie aplikacji

Tworzenie aplikacji

Twoja aplikacja musi być przeznaczona na poziom interfejsu API systemu Android 6.0 (23).

Deklarowanie klasy, która zastępuje android.service.carrier.CarrierService

  1. Zastąp onLoadConfig aby zwrócić wartości, które chcesz podać na podstawie przekazanego obiektu service.carrier.CarrierIdentifier .
  2. Dodaj logikę do wywoływania notifyConfigChangedForSubId w scenariuszach, w których konfiguracja operatora może się zmieniać w czasie (na przykład, gdy użytkownik dodaje dodatkowe usługi do swojego konta).

Przykład poniżej:

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;
    }
}

Aby uzyskać więcej informacji, zobacz dokumentację android.service.carrier.CarrierService .

Nazwanie klasy w manifeście

Przykład poniżej:

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

Podpisanie aplikacji tym samym certyfikatem na karcie SIM

Aby zapoznać się z wymaganiami, zobacz Uprawnienia przewoźników UICC .

Dodawanie APN za pomocą aplikacji operatora

Aby dodać APN programowo z aplikacji operatora (na przykład podczas aktywacji karty SIM), użyj interfejsów API ContentResolver aby dodać elementy APN do dostawcy zawartości identyfikowanego przez identyfikator URI android.provider.Telephony.Carriers.CONTENT_URI . Aby uzyskać więcej informacji na temat struktury tabeli dla identyfikatora URI treści, zobacz Telephony.Carriers .

Aby uzyskać więcej informacji, zobacz APN i CarrierConfig .

Testowanie aplikacji

Po utworzeniu aplikacji konfiguracyjnej możesz przetestować swój kod za pomocą:

  • Karta SIM zawierająca ważny podpis certyfikatu
  • Urządzenie z systemem Android 6.0 lub nowszym, na przykład urządzenie z systemem Android