Android 6.0 i nowsze umożliwiają aplikacjom uprzywilejowanym konfigurowanie platformy zgodnie z ustawieniami operatora. Ta funkcja oparta na uprawnieniach operatora UICC wprowadzonych w Androidzie 5.1 (Lollipop MR1) umożliwia przeniesienie konfiguracji operatora z warstwowych konfiguracji statycznych i daje operatorom oraz OEM-om możliwość dynamicznego dostarczania konfiguracji operatora do platformy 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ę.
Najważniejsze zalety tego podejścia to:
- Konfiguracja dynamiczna – obsługa konfiguracji takich jak konfiguracja wywodząca się z MCKMNC, np. operatorzy wirtualnych sieci komórkowych (MVNO) lub klienci akceptują usługi dodatkowe.
- Obsługa urządzeń sprzedawanych w dowolnym kanale sprzedaży – na przykład telefon z otwartego rynku może być automatycznie skonfigurowany za pomocą odpowiednich ustawień 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
Ładowanie konfiguracji
Konfiguracja operatora udostępniana przez tę funkcję to zbiór par klucz-wartość, które zmieniają różne zachowania związane z telefonami na platformie.
Zbiór wartości dla danego urządzenia jest określany przez zapytania dotyczące tych komponentów w 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 platformie (odpowiednik działania sprzed Androida 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ę do konfiguracji platformy znajdziesz (w Androidzie 6.0) w folderze: packages/apps/CarrierConfig
Aplikacja ta ma na celu zapewnienie konfiguracji dla poszczególnych sieci, gdy aplikacja operatora nie jest zainstalowana. Operatorzy i producenci OEM powinni wprowadzić w niej tylko minimalne zmiany w swoich własnych obrazach. Zamiast tego operatorzy powinni udostępniać osobną aplikację operatora, aby umożliwić jego dostosowywanie, umożliwiając rozpowszechnianie aktualizacji za pomocą kanałów, takich jak sklepy z aplikacjami.
Sposób przyznawania uprawnień aplikacji operatora
Aplikacja operatora, której dotyczy problem, musi być podpisana tym samym certyfikatem, który znajduje się na karcie SIM, zgodnie z uprawnieniami operatora UICC.
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
- Identyfikator GID2
- Identyfikator operatora
Więcej informacji o integrowaniu identyfikatorów operatorów znajdziesz w artykule o integrowaniu identyfikatorów operatorów z usługą CarrierConfig.
Podczas wczytywania konfiguracji operatora
Lista par klucz-wartość tworzy się:
- Po załadowaniu karty SIM (uruchamianie lub zamiana karty SIM z pamięci)
- Gdy aplikacja operatora ręcznie rozpoczyna ponowne załadowanie
- Kiedy aplikacja operatora jest aktualizowana
Więcej informacji znajdziesz w android.service.carrier.CarrierService#onLoadConfig()
dokumentacji.
Korzystanie z konfiguracji
Po utworzeniu konfiguracji jej wartości są używane do ustawiania różnych wartości konfiguracji systemu, takich jak:
- Ustawienia telefonii wewnętrznej
- Wartości konfiguracyjne zwrócone przez SDK, np. w SmsManager
- Ustawienia aplikacji, takie jak wartości połączeń VVM w Telefonie
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.
Utwórz aplikację
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 zwracać wartości, które chcesz uzupełnić, na podstawie wartości uznanego 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 dokumencie 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 Uprawnienia operatora UICC.
Dodawanie APN za pomocą aplikacji operatora
Aby dodawać 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 o APN i CarrierConfig.
Wypróbuj aplikację
Po skompilowaniu aplikacji konfiguracyjnej możesz przetestować kod:
- karta SIM zawierająca prawidłowy podpis certyfikatu;
- Urządzenie z Androidem 6.0 lub nowszym, na przykład urządzenie z Androidem
Konfigurowanie funkcji usługi operatora
W Androidzie funkcje usług operatora określają, czy na urządzeniu są obsługiwane usługi głosowe, wiadomości i dane. Operatorzy mogą określać możliwości usług operatora na urządzeniu na poziomie urządzenia i subskrypcji (Android 15 lub nowszy).
Możliwości usług na poziomie urządzenia
Funkcje 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ą następujących zastąpień zasobów systemowych:
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 usługi 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 abonament dotyczy tylko danych, ustaw wartość na
SubscriptionManager#SERVICE_CAPABILITY_DATA
.
Aplikacje (wstępnie załadowane aplikacje systemowe i aplikacje innych firm) mogą wysyłać zapytania o możliwości usług operatora w przypadku określonej subskrypcji za pomocą metody
SubscriptionInfo.getServiceCapabilities()
. Dzięki temu deweloperzy aplikacji mogą dostosowywać sposób, w jaki użytkownicy korzystają z aplikacji, zgodnie z możliwościami dostępnymi w ramach subskrypcji. Deweloperzy aplikacji mogą na przykład upewnić się, że aplikacja telefonu nie zezwala na nawiązywanie połączeń, jeśli użytkownik ma subskrypcję tylko do transmisji danych.
Wycofane interfejsy API funkcji usługi
Począwszy od Androida 15, Android udostępnia funkcje na poziomie urządzenia i 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 tej tabeli znajdziesz interfejsy API, które zostały wycofane i przemianowane w Androidzie 15:
Wycofane (Android 14 lub starszy) | Odpowiednik (Android 15 lub nowszy) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |