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:
- Aplikacja operatora (opcjonalna, ale zalecana lokalizacja dodatkowej konfiguracji poza tym, co znajduje się w projekcie Android Open Source Project (AOSP)).
- Aplikacja konfiguracji platformy dołączona do obrazu systemu.
- 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
- Zastąp
onLoadConfig, aby zwracać wartości, które chcesz dostarczyć na podstawie przekazanego obiektuservice.carrier.CarrierIdentifier. - Dodaj logikę wywoływania
notifyConfigChangedForSubIdw 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() |