Android 6.0 i nowsze zawierają możliwość uprzywilejowanych aplikacji w celu zapewnienia konfiguracji specyficznej dla operatora na platformie. Ta funkcjonalność, oparta na uprawnieniach przewoźnika UICC wprowadzonych w systemie Android 5.1 (Lollipop MR1), umożliwia odsunięcie konfiguracji operatora od nakładek konfiguracji statycznej i daje operatorom i producentom OEM możliwość dynamicznego dostarczania konfiguracji operatora do platformy za pośrednictwem zdefiniowanego interfejsu.
Prawidłowo podpisana aplikacja operatora może być wstępnie załadowana do obrazu systemu, zainstalowana automatycznie lub ręcznie zainstalowana za pośrednictwem sklepu z aplikacjami. Platforma wysyła do aplikacji zapytania o konfigurację ustawień, w tym:
- Sieci roamingowe/bez roamingu
- Wizualna poczta głosowa
- Ustawienia sieci SMS/MMS
- Konfiguracje VoLTE/IMS
Określenie, jakie wartości mają zostać zwrócone, zależy wyłącznie od aplikacji przewoźnika i może być dynamiczne na podstawie szczegółowych informacji przekazywanych do aplikacji za pośrednictwem platformy.
Kluczowe zalety tego podejścia to:
- Konfiguracja dynamiczna — obsługa takich koncepcji, jak konfiguracja niepochodząca z MCCMNC, na przykład operatorzy wirtualnych sieci komórkowych (MVNO) lub klienci decydują się na dodatkowe usługi.
- Obsługa urządzeń sprzedawanych za pośrednictwem dowolnego kanału — na przykład telefon z otwartego rynku można automatycznie skonfigurować z odpowiednimi ustawieniami, pobierając aplikację ze sklepu z aplikacjami.
- Bezpieczeństwo — uprawnienia do udostępniania 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 struktury, 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 określany przez odpytywanie następujących komponentów w kolejności:
- Aplikacja operatora (jest to opcjonalne, ale jest to zalecana lokalizacja dla dodatkowej konfiguracji poza tym, co istnieje w projekcie Android Open Source Project (AOSP))
- Aplikacja do konfiguracji platformy dołączona do obrazu systemu
- Wartości domyślne, zakodowane na sztywno w strukturze (odpowiednik zachowania sprzed Androida 6.0)
Aplikacja do konfiguracji platformy
Ogólna aplikacja do konfiguracji platformy jest dołączona do obrazu systemu. Ta aplikacja może dostarczać wartości dla dowolnych zmiennych, których nie ma w zwykłej aplikacji operatora. Aplikację do konfiguracji platformy można znaleźć (w systemie Android 6.0) w: packages/apps/CarrierConfig
Celem tej aplikacji jest zapewnienie pewnej konfiguracji sieciowej, gdy aplikacja operatora nie jest zainstalowana, a operatorzy/producenci OEM powinni wprowadzać tylko minimalne zmiany we własnych obrazach. Zamiast tego przewoźnicy powinni udostępnić osobną aplikację operatora do dostosowywania operatora, umożliwiającą dystrybucję aktualizacji za pośrednictwem takich dróg, jak sklepy z aplikacjami.
Jak uprawnienia są przyznawane aplikacji operatora
Dana aplikacja przewoźnika musi być podpisana tym samym certyfikatem, który znajduje się na karcie SIM, co zostało udokumentowane w uprawnieniach przewoźnika UICC .
Jakie informacje są przekazywane do aplikacji przewoźnika
Aplikacja przewoźnika jest dostarczana z następującymi wartościami, dzięki czemu może podejmować dynamiczną decyzję, jakie wartości zwrócić:
- MCK
- MNC
- SPN
- IMSI
- GID1
- GID2
- Identyfikator przewoźnika
Aby uzyskać więcej informacji na temat integrowania identyfikatorów operatorów, zobacz Integrowanie identyfikatorów operatorów z CarrierConfig .
Podczas ładowania konfiguracji przewoźnika występuje
Budowanie listy par klucz-wartość następuje:
- Gdy karta SIM jest załadowana (rozruch lub wymiana karty SIM na gorąco)
- Gdy aplikacja przewoźnika ręcznie uruchomi przeładowanie
- Gdy aplikacja operatora zostanie zaktualizowana
Więcej informacji można znaleźć w dokumentacji android.service.carrier.CarrierService#onLoadConfig()
.
Korzystanie z konfiguracji
Gdy konfiguracja jest budowana, wartości w niej zawarte służą do ustawiania różnych wartości konfiguracji systemu, w tym:
- Wewnętrzne ustawienia telefonii szkieletowej
- Zwracane przez SDK wartości konfiguracyjne, na przykład w SmsManager
- Ustawienia aplikacji, takie jak wartości połączenia VVM w Dialer
Klawisze konfiguracyjne
Lista kluczy jest zdefiniowana jako część publicznego zestawu SDK w android.telephony.CarrierConfigManager
i nie można jej zmieniać na tym samym poziomie interfejsu API. Poniższa tabela zawiera zestawienie kluczy.
Budowanie aplikacji
Tworzenie aplikacji
Twoja aplikacja musi być kierowana na poziom interfejsu API Androida 6.0 (23).
Deklarowanie klasy, która nadpisuje 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ływać
notifyConfigChangedForSubId
w scenariuszach, w których konfiguracja operatora może się zmieniać 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; } }
Więcej informacji można znaleźć w dokumentacji 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 SIM
Aby zapoznać się z wymaganiami, zobacz Uprawnienia przewoźnika UICC .
Dodawanie APN za pomocą aplikacji operatora
Aby programowo dodać APN z aplikacji operatora (na przykład podczas aktywacji karty SIM), użyj interfejsów API ContentResolver
, aby dodać elementy APN do dostawcy zawartoś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 systemem Android