Na urządzeniach z Androidem 15 lub nowszym możesz zaimplementować wybór domeny między usługą IMS a usługami starszymi w sieciach komutowanych komutacyjnie za pomocą interfejsu API systemu DomainSelectionService
. DomainSelectionService
to dobrze zdefiniowany interfejs między platformą Android a implementacją wyboru domen udostępnioną przez dostawcę. Ten interfejs umożliwia dostawcy przesyłanie do platformy informacji sygnalizacyjnych, takich jak domena, w której realizowane są wychodzące połączenia telefoniczne i SMS-y, oraz preferowany typ sieci w skanowaniu sieci.
Rysunek 1. Schemat architektury funkcji wyboru domeny
Przykłady i źródło
Android udostępnia implementację referencyjną funkcji wyboru domeny w AOSP (TelephonyDomainSelectionService
). Szczegółową dokumentację interfejsu DomainSelectionService
znajdziesz w klasie DomainSelectionService
i innych klasach interfejsu API.
Implementacja
Aby wdrożyć funkcję wyboru domeny na urządzeniu z Androidem, wykonaj te czynności:
Utwórz aplikację do wybierania domen. Usługa musi być zdefiniowana w pliku
AndroidManifest.xml
.Dodaj konfigurację do nakładki na urządzenie, aby umożliwić platformie wiązanie się z implementacją
DomainSelectionService
.Obsługa wymaganych interfejsów radio HAL dla funkcji wyboru domeny.
W tej sekcji znajdziesz więcej informacji o tych krokach.
Dodawanie wpisu usługi w pliku AndroidManifest.xml
Aby aplikacja do wyboru domeny zarejestrowała usługę DomainSelectionService
w ramach platformy, dodaj w pliku manifestu wpis usługi w takim formacie:
<service
android:name="com.example.domainselection.DomainSelectionService"
android:directBootAware="true"
android:persistent="true"
…
android:permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE"
…
<intent-filter>
<action android:name="android.telephony.DomainSelectionService"/>
</intent-filter>
…
</service>
Aby funkcja wyboru domeny mogła działać, definicja usługi w pliku AndroidManifest.xml
musi zawierać te atrybuty:
directBootAware="true"
: umożliwia wykrywanie usługi i jej uruchamianie przez telefonię przed odblokowaniem urządzenia przez użytkownika. Usługa nie może uzyskać dostępu do pamięci zaszyfrowanej na urządzeniu, dopóki użytkownik nie odblokuje urządzenia. Więcej informacji znajdziesz w artykułach Obsługa trybu bezpośredniego uruchamiania i Szyfrowanie na poziomie pliku.persistent="true"
: pozwala na ciągłe działanie usługi i uniemożliwia jej zabicie przez system w celu odzyskania pamięci. Ten atrybut działa tylko, jeśli aplikacja jest tworzona jako aplikacja systemowa.permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE"
: zapewnia, że tylko proces, któremu przyznano uprawnienieBIND_DOMAIN_SELECTION_SERVICE
, może się z nią powiązać. Zapobiega to wiązaniu się z usługą przez aplikację niepożądaną, ponieważ tylko aplikacje systemowe mogą uzyskać uprawnienie w ramach tej platformy.
Usługa musi też określić element intent-filter
z działaniem android.telephony.DomainSelectionService
. Dzięki temu framework może znaleźć usługę DomainSelectionService
.
Definiowanie konfiguracji w nakładce na urządzeniu
Aby platforma mogła bezpiecznie połączyć się z usługą DomainSelectionService
, dodaj do nakładki urządzenia tę konfigurację:
config_domain_selection_service_component_name
: nazwa komponentu (spłaszczony ciąg znakówComponentName
) usługiDomainSelectionService
.
Android nie obsługuje aplikacji z do pobrania DomainSelectionService
implementacji innych firm, dlatego aplikacja do wyboru domeny musi być aplikacją systemową znajdującą się w folderze /system_ext/priv-app/
lub /product/priv-app/
. Platforma sprawdza, czy nazwa pakietu implementacji jest zgodna z wartością nakładki urządzenia, aby mieć pewność, że są wywoływane tylko zaufane, wstępnie zainstalowane aplikacje.
Obsługa interfejsów radia HAL
Aby włączyć funkcję wyboru domeny, obsługuj te wymagane interfejsy HAL radia:
-
void setEmergencyMode(int serial, EmergencyMode emcModeType); void triggerEmergencyNetworkScan(int serial, EmergencyNetworkScanTrigger request); void cancelEmergencyNetworkScan(int serial, boolean resetScan); void exitEmergencyMode(int serial);
-
void emergencyNetworkScanResult(RadioIndicationType type, EmergencyRegResult result);
Weryfikacja
Aby sprawdzić, czy framework telefonii odpowiada prawidłowo na interfejs DomainSelectionService
, uruchom testy CTS w DomainSelectionServiceTestOnMockModem
.