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 przekazywanie platformie 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 klasach 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 urządzenia, aby umożliwić platformie wiązanie się z implementacją
DomainSelectionService
.Obsługa wymaganych interfejsów radio HAL dla funkcji wyboru domeny.
Ta sekcja zawiera więcej informacji na temat tych kroków.
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 działał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 rozruchu i Szyfrowanie na podstawie plików.persistent="true"
: umożliwia trwałe działanie usługi i nie może zostać zatrzymana przez system w celu odzyskania pamięci. Ten atrybut działa tylko wtedy, gdy aplikacja została utworzona jako aplikacja systemowa.permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE"
: zapewnia, że tylko proces, któremu przyznano uprawnienieBIND_DOMAIN_SELECTION_SERVICE
, może się związać z aplikacją. Zapobiega to wiązaniu się złośliwej aplikacji z usługą, 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 urządzenia
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
) dla 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 odpowiada wartości nakładki na urządzeniu, aby zapewnić, że powiązane są 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
.