Konfiguracja operatora

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

Prawidłowo podpisana aplikacja operatora może być preinstalowana w obrazie systemu, instalowana automatycznie lub instalowana ręcznie ze sklepu z aplikacjami. Platforma wysyła do aplikacji zapytanie o konfigurację ustawień, w tym:

  • sieci w roamingu i poza nim,
  • wizualną pocztę głosową,
  • ustawienia sieci SMS/MMS,
  • konfiguracje VoLTE/IMS.

Decyzja o tym, jakie wartości mają być zwracane, należy wyłącznie do aplikacji operatora i może być dynamiczna na podstawie szczegółowych informacji przekazywanych do aplikacji przez platformę.

Główne korzyści tego podejścia:

  • Konfiguracja dynamiczna – obsługa takich koncepcji jak konfiguracja niepochodząca z MCCMNC, np. wirtualni operatorzy sieci komórkowych (MVNO) lub zgoda klienta na dodatkowe usługi.
  • Obsługa urządzeń sprzedawanych w dowolnym kanale – np. telefon z otwartego rynku można automatycznie skonfigurować za pomocą odpowiednich ustawień, pobierając aplikację ze sklepu z aplikacjami.
  • Bezpieczeństwo – uprawnienia do dostarczania tej konfiguracji są przyznawane tylko aplikacjom podpisanym 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 API konfiguracji operatora 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 danego urządzenia jest określany przez wysyłanie zapytań do tych komponentów w podanej kolejności:

  1. Aplikacja operatora (opcjonalna, ale zalecana lokalizacja dodatkowej konfiguracji poza tym, co znajduje się w projekcie Android Open Source Project (AOSP)).
  2. Aplikacja konfiguracji platformy dołączona do obrazu systemu.
  3. Wartości domyślne zakodowane w platformie (odpowiednik zachowania sprzed Androida 6.0).

Aplikacja konfiguracji platformy

Do obrazu systemu dołączona jest ogólna aplikacja konfiguracji platformy. Ta aplikacja może dostarczać wartości dla wszystkich zmiennych, których nie dostarcza zwykła aplikacja operatora. Aplikację konfiguracji platformy można znaleźć (w Androidzie 6.0) w lokalizacji: packages/apps/CarrierConfig.

Celem tej aplikacji jest zapewnienie pewnej konfiguracji dla każdej sieci, gdy nie jest zainstalowana aplikacja operatora. Operatorzy i producenci OEM powinni wprowadzać w swoich obrazach tylko minimalne zmiany. Zamiast tego operatorzy powinni udostępniać oddzielną aplikację operatora do dostosowywania, co umożliwi rozpowszechnianie 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 opisem w sekcji Uprawnienia operatora UICC.

Jakie informacje są przekazywane do aplikacji operatora

Aplikacja operatora otrzymuje te wartości, co umożliwia jej dynamiczne podejmowanie decyzji o tym, jakie wartości mają być zwracane:

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

Więcej informacji o integracji identyfikatorów operatorów znajdziesz w artykule Integrating carrier IDs with CarrierConfig.

Kiedy następuje wczytywanie konfiguracji operatora

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

  • gdy karta SIM jest wczytywana (podczas uruchamiania lub wymiany karty SIM na gorąco),
  • gdy aplikacja operatora ręcznie wywoła ponowne wczytanie,
  • gdy aplikacja operatora zostanie zaktualizowana.

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

Korzystanie z konfiguracji

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

  • wewnętrznych ustawień telefonicznych platformy,
  • wartości konfiguracji zwracanych przez pakiet SDK, np. w SmsManager,
  • ustawień aplikacji, takich jak wartości połączenia VVM w aplikacji Telefon.

Klucze konfiguracji

Lista kluczy jest zdefiniowana jako część publicznego pakietu 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

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

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

  1. Zastąp onLoadConfig, aby zwracać wartości, które chcesz dostarczyć na podstawie przekazanego obiektu service.carrier.CarrierIdentifier.
  2. Dodaj logikę wywoływania 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 znajdziesz 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;
    }
}

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

Nadawanie nazwy klasy w pliku manifestu

Przykład znajdziesz 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>

Podpisywanie aplikacji tym samym certyfikatem na karcie SIM

Wymagania znajdziesz w sekcji Uprawnienia operatora UICC.

Dodawanie APN za pomocą aplikacji operatora

Aby programowo dodać APN z aplikacji operatora (np. podczas aktywacji karty SIM ), użyj ContentResolver interfejsó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 dokumentacji Telephony.Carriers.

Więcej informacji znajdziesz w artykule APN and CarrierConfig.

Testowanie aplikacji

Gdy utworzysz aplikację konfiguracji, możesz przetestować kod za pomocą:

  • karty SIM zawierającej prawidłowy podpis certyfikatu,
  • urządzenia z Androidem 6.0 lub nowszym, np. urządzenia z Androidem.

Ustawianie możliwości usługi operatora

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

Możliwości usługi na poziomie urządzenia

Możliwości usługi 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 za pomocą tych zastąpień zasobów systemowych:

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

Możliwości usługi na poziomie subskrypcji

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

Aplikacje (preinstalowane aplikacje systemowe i aplikacje innych firm) mogą wysyłać zapytania o możliwości usługi operatora dla określonej subskrypcji za pomocą SubscriptionInfo.getServiceCapabilities() metody. Umożliwia to programistom dostosowywanie interfejsu aplikacji do dostępnych możliwości subskrypcji. Programiści mogą na przykład zadbać o to, aby aplikacja Telefon nie pozwalała na wykonywanie połączeń, jeśli użytkownik korzysta z subskrypcji tylko na dane.

Wycofane interfejsy API możliwości usługi

Od Androida 15 Android udostępnia możliwości usługi na poziomie urządzenia i subskrypcji. Z tego powodu dotychczasowe interfejsy API możliwości 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 wprowadzonych w Androidzie 15:

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