Android 6.0 i nowsze umożliwiają aplikacjom uprzywilejowanym konfigurowanie platformy zgodnie z ustawieniami operatora. Ta funkcja oparta na przywilejach operatora UICC wprowadzonych w Androidzie 5.1 (Lollipop MR1) umożliwia przeniesienie konfiguracji operatora z warstwowych konfiguracji statycznych i daje operatorom oraz producentom OEM możliwość dynamicznego dostarczania konfiguracji operatora na platformę za pomocą zdefiniowanego interfejsu.
Właściwie podpisaną aplikację operatora można wstępnie załadować w ramach obrazu systemu, zainstalować automatycznie lub ręcznie za pomocą sklepu z aplikacjami. Platforma wysyła zapytanie do aplikacji, aby uzyskać konfigurację ustawień, w tym:
- Sieci w roamingu/sieci bez roamingu
- Wizualna poczta głosowa
- Ustawienia sieci SMS/MMS
- Konfiguracje VoLTE/IMS
Określanie wartości zwracanych zależy wyłącznie od aplikacji operatora i może być dynamiczne na podstawie szczegółowych informacji przekazywanych do aplikacji przez platformę.
Główne zalety tego podejścia:
- Konfiguracja dynamiczna – obsługa takich koncepcji jak konfiguracja niewywodząca się z MCCMNC, na przykład operatorzy sieci komórkowych (MVNO) lub opcjonalne usługi dla klientów.
- Obsługa urządzeń sprzedawanych w dowolnym kanale sprzedaży – na przykład telefon z otwartego rynku może być automatycznie skonfigurowany z odpowiednimi ustawieniami po pobraniu aplikacji ze sklepu z aplikacjami.
- Bezpieczeństwo: uprawnienia do korzystania z 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 frameworku, a nie za pomocą publicznego interfejsu API. Interfejs API konfiguracji operatora w Androidzie 6.0 jest publiczny i dobrze zdefiniowany.
Jak to działa
Załaduj konfigurację
Konfiguracja operatora udostępniana 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 zapytanie o te komponenty w podanej kolejności:
- Aplikacja operatora (opcjonalnie, ale jest to zalecane miejsce do dodatkowej konfiguracji poza tym, co jest dostępne w ramach projektu Android Open Source Project (AOSP))
- Aplikacja konfiguracji platformy dołączona do obrazu systemu
- wartości domyślne zakodowane na stałe w ramach (odpowiadające działaniu w wersjach Androida starszych niż 6.0);
Aplikacja konfiguracji platformy
Z obrazem systemu jest połączona ogólna aplikacja konfiguracji platformy. Ta aplikacja może podawać wartości dla dowolnych zmiennych, których nie ma zwykła aplikacja operatora. Aplikację konfiguracji platformy można znaleźć (w Androidzie 6.0) w tych miejscach: packages/apps/CarrierConfig
Aplikacja ta ma na celu zapewnienie konfiguracji dla poszczególnych sieci, gdy aplikacja operatora nie jest zainstalowana. Operatorzy i producenci oryginalnego sprzętu powinni wprowadzić w niej tylko minimalne zmiany w swoich własnych obrazach. Zamiast tego operatorzy powinni udostępnić osobną aplikację operatora do personalizacji, która umożliwiłaby rozpowszechnianie aktualizacji za pomocą takich kanałów jak sklepy z aplikacjami.
Przyznawanie uprawnień aplikacji operatora
Aplikacja operatora musi być podpisana tym samym certyfikatem co karta SIM, zgodnie z dokumentacją UICC Carrier Privileges.
Jakie informacje są przekazywane do aplikacji operatora
Aplikacja operatora otrzymuje te wartości, które umożliwiają jej podejmowanie dynamicznych decyzji dotyczących zwracanych wartości:
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- Identyfikator operatora
Więcej informacji o integrowaniu identyfikatorów operatora znajdziesz w artykule Integracja identyfikatorów operatora za pomocą CarrierConfig.
Podczas wczytywania konfiguracji operatora
Lista par klucz-wartość jest tworzona w tych przypadkach:
- Gdy karta SIM jest wczytana (uruchamianie lub wymiana na gorąco karty SIM)
- gdy aplikacja operatora ręcznie powoduje ponowne wczytanie;
- Gdy aplikacja operatora zostanie zaktualizowana
Więcej informacji znajdziesz w .android.service.carrier.CarrierService#onLoadConfig()
Korzystanie z konfiguracji
Po utworzeniu konfiguracji jej wartości są używane do ustawiania różnych wartości konfiguracji systemu, w tym:
- Wewnętrzne ustawienia telefonii w ramach frameworku
- wartości konfiguracji zwracane przez pakiet SDK, np. w klasie SmsManager.
- Ustawienia aplikacji, takie jak wartości połączenia VVM w dialerze
Klucze konfiguracji
Lista kluczy jest definiowana jako część publicznego pakietu SDK w pliku android.telephony.CarrierConfigManager
i nie może się zmieniać na tym samym poziomie interfejsu API. Podsumowanie kluczy znajdziesz w tabeli poniżej.
Kompilowanie aplikacji
Tworzenie aplikacji
Aplikacja musi być kierowana na interfejs API na poziomie 23 (Android 6.0).
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ę do wywołania
notifyConfigChangedForSubId
w sytuacjach, w których konfiguracja operatora może się zmienić w czasie (na przykład, gdy użytkownik doda dodatkowe usługi do swojego konta).
Poniżej znajdziesz 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 dokumentacji referencyjnej android.service.carrier.CarrierService
.
Nazwij zajęcia w pliku manifestu.
Poniżej znajdziesz 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 UICC Carrier Privileges.
Dodawanie APN za pomocą aplikacji operatora
Aby dodać APN programowo z aplikacji operatora (np. podczas aktywacji karty SIM), użyj interfejsów
ContentResolver
API, aby dodać elementy APN do dostawcy treści zidentyfikowanego za pomocą adresu URI
android.provider.Telephony.Carriers.CONTENT_URI
.
Więcej informacji o strukturze tabeli dla URI treści znajdziesz w artykule
Telephony.Carriers
.
Więcej informacji znajdziesz w artykule APN i CarrierConfig.
Wypróbuj aplikację
Po skompilowaniu aplikacji konfiguracyjnej możesz przetestować kod:
- karta SIM z prawidłowym podpisem certyfikatu;
- urządzenie z Androidem w wersji 6.0 lub nowszej,
Konfigurowanie funkcji usługi operatora
W Androidzie funkcje usług operatora określają, czy na urządzeniu obsługiwane są usługi głosowe, wiadomości i dane. Operatorzy mogą określać możliwości usług operatora na poziomie urządzenia i poziomu subskrypcji (Android 15 lub nowszy).
Funkcje usługi na poziomie urządzenia
Możliwości usług na poziomie urządzenia są konfigurowane podczas produkcji urządzenia (nie można ich zmienić po zakończeniu produkcji). 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:
Funkcje usługi na poziomie subskrypcji
W przypadku urządzeń z Androidem 15 lub nowszym operatorzy mogą określać możliwości usług na poziomie subskrypcji. Aby określić możliwości usługi na poziomie subskrypcji, użyj interfejsu API
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
. Aby na przykład określić, że subskrypcja dotyczy tylko danych, ustaw wartość na
SubscriptionManager#SERVICE_CAPABILITY_DATA
.
Aplikacje (wstępnie załadowane aplikacje systemowe i aplikacje innych firm) mogą za pomocą metody
SubscriptionInfo.getServiceCapabilities()
zapytać operatora o możliwości usługi w ramach określonej subskrypcji. Dzięki temu deweloperzy mogą dostosować aplikacje do potrzeb użytkowników na podstawie dostępnych funkcji abonamentu. Na przykład deweloperzy aplikacji mogą zadbać o to, aby aplikacja do wybierania numerów nie pozwalała na wykonywanie połączeń, jeśli użytkownik ma subskrypcję obejmującą tylko dane.
Wycofane interfejsy API usług
Od Androida 15 aplikacja oferuje funkcje usług zarówno na poziomie urządzenia, jak i na poziomie subskrypcji. W związku z tą zmianą dotychczasowe interfejsy API funkcji na poziomie urządzenia zostały przemianowane w celu ułatwienia ich odczytania. W tabeli poniżej znajdziesz wycofane i przemianowane interfejsy API wprowadzone w Androidzie 15:
Wycofany (Android 14 lub starszy) | Android 15 lub nowszy |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |