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:
- Aplikacja operatora (opcjonalna, ale zalecana w przypadku dodatkowej konfiguracji wykraczającej poza zakres Android Open Source Project (AOSP)).
- Aplikacja do konfiguracji platformy dołączona do obrazu systemu
- 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
- Zastąp
onLoadConfig
, aby zwrócić wartości, które chcesz podać na podstawie przekazanego obiektuservice.carrier.CarrierIdentifier
. - 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
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
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_ARRAY
API. 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() |