Konfiguracja operatora

Android 6.0 i nowsze wersje umożliwiają uprzywilejowanym aplikacjom dostarczanie platformie konfiguracji specyficznej dla operatora. Ta funkcja, oparta na uprawnieniach operatora UICC wprowadzonych w Androidzie 5.1 (Lollipop MR1), umożliwia przeniesienie konfiguracji operatora z nakładek konfiguracji statycznej i daje operatorom oraz producentom OEM możliwość dynamicznego dostarczania konfiguracji operatora na platformę za pomocą zdefiniowanego interfejsu.

Prawidłowo podpisana aplikacja operatora może być wstępnie załadowana w obrazie systemu, zainstalowana automatycznie lub zainstalowana ręcznie ze sklepu z aplikacjami. Platforma wysyła do aplikacji zapytanie o konfigurację ustawień, takich jak:

  • Sieci w roamingu i poza nim
  • Wizualna poczta głosowa
  • Ustawienia sieci SMS/MMS
  • Konfiguracje VoLTE/IMS

Decyzja o tym, jakie wartości mają być zwracane, należy w całości do aplikacji operatora i może być dynamiczna w zależności od szczegółowych informacji przekazywanych do aplikacji przez platformę.

Główne zalety tego podejścia to:

  • Konfiguracja dynamiczna – obsługa koncepcji takich jak konfiguracja niepochodząca z MCCMNC, np. wirtualni operatorzy sieci komórkowych (MVNO) lub zgoda klienta na korzystanie z dodatkowych usług.
  • Obsługa urządzeń sprzedawanych w dowolnym kanale – na przykład telefon kupiony na otwartym rynku można automatycznie skonfigurować za pomocą odpowiednich ustawień, pobierając aplikację ze sklepu z aplikacjami.
  • Bezpieczeństwo – uprawnienia do udostępniania tej 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 platformy, a nie za pomocą publicznego interfejsu API. Interfejs Carrier Config API w Androidzie 6.0 jest publiczny i dobrze zdefiniowany.

Jak to działa

Wczytywanie konfiguracji

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 konkretnego urządzenia jest określany przez wysyłanie zapytań do tych komponentów w tej kolejności:

  1. Aplikacja operatora (opcjonalna, ale zalecana w przypadku dodatkowej konfiguracji wykraczającej poza zakres Android Open Source Project (AOSP)).
  2. Aplikacja do konfiguracji platformy dołączona do obrazu systemu
  3. Wartości domyślne zakodowane na stałe w platformie (odpowiadające działaniu sprzed Androida 6.0)

Aplikacja do konfiguracji platformy

W obrazie systemu jest dostępna ogólna aplikacja do konfiguracji platformy. Ta aplikacja może podawać wartości wszystkich zmiennych, których nie podaje zwykła aplikacja przewoźnika. Aplikację do konfiguracji platformy (w Androidzie 6.0) znajdziesz w tym miejscu: packages/apps/CarrierConfig

Ta aplikacja ma na celu zapewnienie pewnej konfiguracji sieci, gdy aplikacja operatora nie jest zainstalowana. Operatorzy i producenci OEM powinni wprowadzać w niej tylko minimalne zmiany w swoich obrazach. Zamiast tego operatorzy powinni udostępniać osobną aplikację operatora, która umożliwia dostosowywanie przez nich urządzeń i dystrybuowanie aktualizacji za pomocą takich kanałów jak sklepy z aplikacjami.

Jak przyznawane są uprawnienia aplikacji operatora

Aplikacja operatora musi być podpisana tym samym certyfikatem, który znajduje się na karcie SIM, zgodnie z dokumentacją w UICC Carrier Privileges.

Jakie informacje są przekazywane do aplikacji przewoźnika

Aplikacja przewoźnika otrzymuje te wartości, co umożliwia jej dynamiczne podejmowanie decyzji o tym, jakie wartości ma zwracać:

  • MCC
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • Identyfikator operatora

Więcej informacji o integrowaniu identyfikatorów przewoźników znajdziesz w artykule Integrowanie identyfikatorów przewoźników z CarrierConfig.

Kiedy następuje wczytywanie konfiguracji operatora

Lista par klucz-wartość jest tworzona:

  • Po załadowaniu karty SIM (uruchomieniu lub wymianie karty SIM podczas pracy urządzenia)
  • Gdy aplikacja przewoźnika ręcznie wywoła ponowne wczytanie
  • Gdy aplikacja przewoźnika zostanie zaktualizowana

Więcej informacji znajdziesz w  android.service.carrier.CarrierService#onLoadConfig() dokumentacji.

Używanie konfiguracji

Gdy konfiguracja jest gotowa, zawarte w niej wartości są używane do ustawiania różnych wartości konfiguracji systemu, w tym:

  • Ustawienia telefonii w ramach wewnętrznych
  • wartości konfiguracji zwracane przez pakiet SDK, np. w klasie SmsManager;
  • Ustawienia aplikacji, takie jak wartości połączenia VVM w aplikacji Telefon

Klucze konfiguracji

Lista kluczy jest zdefiniowana w publicznym pakiecie SDK w android.telephony.CarrierConfigManager i nie może się zmieniać w ramach tego samego poziomu interfejsu API. Podsumowanie kluczy znajdziesz w tabeli poniżej.

Tworzenie aplikacji

Tworzenie aplikacji

Aplikacja musi być kierowana na poziom interfejsu API Androida 6.0 (23).

Zadeklaruj klasę, 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ę wywołującą notifyConfigChangedForSubId w sytuacjach, w których konfiguracja operatora może się zmieniać z czasem (np. gdy użytkownik dodaje do konta dodatkowe usługi).

Przykład:

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

Więcej informacji znajdziesz w android.service.carrier.CarrierService.

Nazwij zajęcia w manifeście

Przykład:

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

Podpisz aplikację tym samym certyfikatem na karcie SIM.

Wymagania znajdziesz w artykule Uprawnienia operatora UICC.

Dodawanie APN-ów za pomocą aplikacji operatora

Aby dodać APN programowo z aplikacji operatora (np. podczas aktywacji karty SIM), użyj ContentResolverinterfejsów API, aby dodać elementy APN do dostawcy treści zidentyfikowanego przez URI android.provider.Telephony.Carriers.CONTENT_URI. Więcej informacji o strukturze tabeli dla identyfikatora URI treści znajdziesz w  Telephony.Carriers.

Więcej informacji znajdziesz w sekcji APN i CarrierConfig.

Wypróbuj aplikację

Po utworzeniu aplikacji do konfiguracji możesz przetestować kod za pomocą:

  • karta SIM zawierająca prawidłowy podpis certyfikatu,
  • urządzenie z Androidem 6.0 lub nowszym, np. urządzenie z Androidem;

Ustawianie możliwości usługi przewoźnika

W Androidzie funkcje usług operatora określają, czy na urządzeniu są obsługiwane usługi głosowe, przesyłanie wiadomości i dane. Operatorzy mogą określać możliwości usług operatora dla urządzenia na poziomie urządzenia i na poziomie subskrypcji (Android 15 lub nowszy).

Funkcje usługi na poziomie urządzenia

Funkcje usług na poziomie urządzenia są konfigurowane podczas produkcji urządzenia (nie można ich zmienić po wyprodukowaniu). Operatorzy mogą określać możliwości na poziomie urządzenia, zastępując te zasoby systemowe:

Aplikacje mogą wysyłać zapytania o możliwości usług na poziomie urządzenia za pomocą tych interfejsów API:

Funkcje usługi na poziomie subskrypcji

W przypadku urządzeń z Androidem 15 lub nowszym operatorzy mogą określać możliwości urządzenia na poziomie subskrypcji. Aby określić możliwości usługi na poziomie subskrypcji, użyj interfejsu CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAYAPI. Aby na przykład określić, że abonament dotyczy tylko danych, ustaw wartość na SubscriptionManager#SERVICE_CAPABILITY_DATA.

Aplikacje (wstępnie załadowane aplikacje systemowe i aplikacje innych firm) mogą sprawdzać możliwości usług operatora w przypadku określonej subskrypcji za pomocą metody SubscriptionInfo.getServiceCapabilities(). Dzięki temu deweloperzy aplikacji mogą dostosowywać interfejs aplikacji do dostępnych funkcji abonamentu. Na przykład deweloperzy aplikacji mogą zadbać o to, aby aplikacja do wybierania numerów nie umożliwiała wykonywania połączeń, jeśli użytkownik korzysta z abonamentu tylko na transmisję danych.

Wycofane interfejsy API funkcji usługi

Od Androida 15 Android udostępnia funkcje usług na poziomie urządzenia i subskrypcji. W związku z tą zmianą dotychczasowe interfejsy API dotyczące funkcji na poziomie urządzenia zostały zmienione, aby były bardziej czytelne. W tabeli poniżej znajdziesz listę wycofanych interfejsów API i interfejsów API o zmienionych nazwach, które zostały wprowadzone w Androidzie 15:

Wycofane (Android 14 lub starszy) Odpowiednik (Android 15 lub nowszy)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()