Android 6.0 i nowsze wersje umożliwiają aplikacjom uprzywilejowanym zapewnianie platformie konfiguracji specyficznej dla operatora. Ta funkcjonalność, oparta na uprawnieniach operatora UICC wprowadzonych w systemie Android 5.1 (Lollipop MR1), umożliwia odejście konfiguracji operatora od nakładek konfiguracji statycznej i daje operatorom i producentom OEM możliwość dynamicznego dostarczania konfiguracji operatora na platformę za pośrednictwem zdefiniowanego interfejsu.
Prawidłowo podpisana aplikacja operatora może zostać wstępnie załadowana w obrazie systemu, zainstalowana automatycznie lub zainstalowana ręcznie za pośrednictwem sklepu z aplikacjami. Aplikacja jest proszona przez platformę o zapewnienie konfiguracji ustawień, w tym:
- Sieci roamingowe/nieroamingowe
- Wizualna poczta głosowa
- Ustawienia sieciowe SMS/MMS
- Konfiguracje VoLTE/IMS
Określenie, jakie wartości mają zostać zwrócone, zależy wyłącznie od aplikacji operatora i może być dynamiczne w oparciu o szczegółowe informacje przekazywane do aplikacji za pośrednictwem platformy.
Najważniejsze zalety tego podejścia to:
- Konfiguracja dynamiczna — obsługa koncepcji takich jak konfiguracja wywodząca się z technologii innej niż MCCMNC, na przykład operatorzy wirtualnych sieci komórkowych (MVNO) lub możliwość wyboru przez klienta dodatkowych usług.
- Obsługa urządzeń sprzedawanych dowolnym kanałem — na przykład telefon z otwartym rynkiem może zostać automatycznie skonfigurowany z odpowiednimi ustawieniami, pobierając aplikację ze sklepu z aplikacjami.
- Bezpieczeństwo – uprawnienia do udostępniania tej konfiguracji mają tylko aplikacje podpisane przez operatora.
- Zdefiniowany interfejs API — poprzednio ta konfiguracja była przechowywana głównie w wewnętrznych nakładkach XML w ramach platformy, a nie za pośrednictwem publicznego interfejsu API. Interfejs API konfiguracji operatora w systemie Android 6.0 jest publiczny i dobrze zdefiniowany.
Jak to działa
Ładowanie konfiguracji
Konfiguracja operatora dostarczana przez tę funkcję to zestaw par klucz-wartość, które zmieniają różne zachowania związane z telefonią na platformie.
Zbiór wartości dla konkretnego urządzenia jest ustalany poprzez odpytanie w kolejności następujących komponentów:
- Aplikacja operatora (jest to opcjonalna, ale jest to zalecana lokalizacja dodatkowej konfiguracji wykraczającej poza tę, która istnieje w projekcie Android Open Source Project (AOSP))
- Aplikacja do konfiguracji platformy dołączona do obrazu systemu
- Wartości domyślne, zakodowane na stałe w frameworku (równoważne zachowaniu przed Androidem 6.0)
Aplikacja do konfiguracji platformy
Do obrazu systemu dołączona jest ogólna aplikacja do konfiguracji platformy. Ta aplikacja może dostarczać wartości dowolnych zmiennych, których nie udostępnia zwykła aplikacja operatora. Aplikację do konfiguracji platformy można znaleźć (w systemie Android 6.0) w: packages/apps/CarrierConfig
Celem tej aplikacji jest zapewnienie konfiguracji dla poszczególnych sieci, gdy aplikacja operatora nie jest zainstalowana, a przewoźnicy/producenci OEM powinni wprowadzać jedynie minimalne zmiany w swoich własnych obrazach. Zamiast tego przewoźnicy powinni udostępnić oddzielną aplikację operatora, umożliwiającą personalizację operatora, umożliwiając dystrybucję aktualizacji za pośrednictwem takich kanałów, jak sklepy z aplikacjami.
Jak uprawnienia są przyznawane aplikacji operatora
Dana aplikacja operatora musi być podpisana tym samym certyfikatem, który znajduje się na karcie SIM, zgodnie z dokumentacją dotyczącą uprawnień operatora UICC .
Jakie informacje są przekazywane do aplikacji operatora
Aplikacja operatora jest dostarczana z następującymi wartościami, dzięki czemu może podejmować dynamiczną decyzję, jakie wartości zwrócić:
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- Identyfikator przewoźnika
Aby uzyskać więcej informacji na temat integrowania identyfikatorów przewoźników, zobacz Integrowanie identyfikatorów przewoźników z CarrierConfig .
Podczas ładowania następuje konfiguracja przewoźnika
Budowanie listy par klucz-wartość następuje:
- Po załadowaniu karty SIM (rozruch lub wymiana karty SIM podczas pracy)
- Gdy aplikacja operatora ręcznie uruchamia ponowne ładowanie
- Gdy aplikacja operatora zostanie zaktualizowana
Więcej szczegółów znajdziesz w dokumentacji android.service.carrier.CarrierService#onLoadConfig()
.
Korzystanie z konfiguracji
Po zbudowaniu konfiguracji wartości w niej zawarte służą do ustawienia różnych wartości konfiguracji systemu, w tym:
- Wewnętrzne ramy ustawień telefonicznych
- Wartości konfiguracyjne zwrócone przez SDK, na przykład w SmsManager
- Ustawienia aplikacji, takie jak wartości połączenia VVM w Dialerze
Klucze konfiguracyjne
Lista kluczy jest zdefiniowana jako część publicznego zestawu SDK w android.telephony.CarrierConfigManager
i nie można jej zmieniać w ramach tego samego poziomu API. W poniższej tabeli znajdziesz podsumowanie kluczy.
Tworzenie aplikacji
Tworzenie aplikacji
Twoja aplikacja musi być dostosowana do poziomu API systemu Android 6.0 (23).
Deklarowanie klasy, 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ę, aby wywołać
notifyConfigChangedForSubId
w scenariuszach, w których konfiguracja operatora może zmieniać się w czasie (na przykład gdy użytkownik doda dodatkowe usługi do swojego konta).
Przykład znajduje się 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; } }
Aby uzyskać więcej informacji, zobacz dokumentację android.service.carrier.CarrierService
.
Nazywanie klasy w manifeście
Przykład znajduje się 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>
Podpisanie aplikacji tym samym certyfikatem na karcie SIM
Aby zapoznać się z wymaganiami, zobacz uprawnienia przewoźnika UICC .
Dodawanie APN za pomocą aplikacji operatora
Aby programowo dodać nazwy APN z aplikacji operatora (na przykład podczas aktywacji karty SIM), użyj interfejsów API ContentResolver
w celu dodania elementów APN do dostawcy treści identyfikowanego przez identyfikator URI android.provider.Telephony.Carriers.CONTENT_URI
. Aby uzyskać więcej informacji na temat struktury tabeli dla identyfikatora URI zawartości, zobacz Telephony.Carriers
.
Aby uzyskać więcej informacji, zobacz APN i CarrierConfig .
Testowanie aplikacji
Po zbudowaniu aplikacji konfiguracyjnej możesz przetestować swój kod za pomocą:
- Karta SIM zawierająca ważny podpis certyfikatu
- Urządzenie z systemem Android 6.0 lub nowszym, na przykład urządzenie z Androidem