W systemie Android 9 wprowadzono nowy interfejs SystemApi o nazwie ImsService , który pomaga wdrożyć podsystem multimediów IP (IMS). Interfejs API ImsService to dobrze zdefiniowany interfejs pomiędzy platformą Android a implementacją IMS dostarczoną przez dostawcę lub operatora.
Rysunek 1. Przegląd ImsService
Korzystając z interfejsu ImsService, osoba wdrażająca IMS może dostarczyć platformie ważne informacje sygnalizacyjne, takie jak informacje rejestracyjne IMS, integrację SMS-ów przez IMS oraz integrację funkcji MmTel w celu zapewnienia połączeń głosowych i wideo. Interfejs API ImsService jest również interfejsem API systemu Android, co oznacza, że można go zbudować bezpośrednio w oparciu o pakiet SDK systemu Android, a nie o źródło. Aplikację IMS, która została wstępnie zainstalowana na urządzeniu, można również skonfigurować tak, aby można ją było aktualizować w Sklepie Play.
Przykłady i źródło
Android udostępnia aplikację na platformie AOSP, która implementuje fragmenty interfejsu API ImsService do celów testowania i programowania. Aplikację znajdziesz pod adresem /testapps/ImsTestService .
Dokumentację interfejsu API ImsService można znaleźć w ImsService oraz w innych klasach interfejsu API.
Realizacja
ImsService API to interfejs API wysokiego poziomu, który umożliwia wdrażanie IMS na wiele sposobów, w zależności od dostępnego sprzętu. Na przykład implementacja zmienia się w zależności od tego, czy implementacja IMS jest w całości umieszczona na procesorze aplikacji, czy też jest częściowo lub całkowicie przeniesiona do modemu. Android nie zapewnia publicznej warstwy HAL do odciążania procesora pasma podstawowego, więc wszelkie odciążanie musi odbywać się przy użyciu rozszerzenia HAL do modemu.
Kompatybilność ze starszymi implementacjami IMS
Chociaż system Android 9 zawiera interfejs API ImsService, urządzenia korzystające ze starszej implementacji IMS nie są w stanie obsługiwać tego interfejsu API. W przypadku tych urządzeń starsze interfejsy AIDL i klasy opakowań zostały przeniesione do przestrzeni nazw android.telephony.ims.compat
. W przypadku aktualizacji do systemu Android 9 starsze urządzenia muszą wykonać poniższe czynności, aby nadal obsługiwać starszy interfejs API.
- Zmień przestrzeń nazw implementacji ImsService, aby rozszerzyć ją z interfejsu API przestrzeni nazw
android.telephony.ims.compat
. - Zmodyfikuj definicję usługi ImsService w pliku AndroidManifest.xml, aby używać akcji filtrowania intencji
android.telephony.ims.compat.ImsService
zamiast akcjiandroid.telephony.ims.ImsService
.
Struktura zostanie następnie powiązana z usługą ImsService przy użyciu warstwy zgodności dostępnej w systemie Android 9 w celu współpracy ze starszą implementacją ImsService
.
Rejestracja ImsService w frameworku
Interfejs API ImsService jest zaimplementowany jako usługa, z którą łączy się framework Androida w celu komunikacji z implementacją IMS. Aby zarejestrować aplikację implementującą ImsService w frameworku, potrzebne są trzy kroki. Po pierwsze, implementacja ImsService musi zarejestrować się na platformie przy użyciu AndroidManifest.xml
aplikacji; po drugie, musi określić, które funkcje IMS obsługuje implementacja (MmTel lub RCS); i po trzecie, należy ją zweryfikować jako zaufaną implementację IMS w konfiguracji operatora lub nakładce urządzenia.
Definicja usługi
Aplikacja IMS rejestruje usługę ImsService w frameworku poprzez dodanie wpisu service
do manifestu w następującym formacie:
<service
android:name="com.egcorp.ims.EgImsService"
android:directBootAware="true"
Android:persistent="true"
...
android:permission="android.permission.BIND_IMS_SERVICE" >
...
<intent-filter>
<action android:name="android.telephony.ims.ImsService" />
</intent-filter>
</service>
Definicja service
w AndroidManifest.xml
definiuje następujące atrybuty niezbędne do prawidłowego działania:
-
directBootAware="true"
: umożliwia wykrycie i uruchomienie usługi przeztelephony
, zanim użytkownik odblokuje urządzenie. Usługa nie może uzyskać dostępu do zaszyfrowanej pamięci urządzenia , zanim użytkownik odblokuje urządzenie. Aby uzyskać więcej informacji, zobacz Obsługa trybu bezpośredniego rozruchu i szyfrowania plików . -
persistent="true"
: Zezwala na ciągłe uruchamianie tej usługi i uniemożliwia jej zatrzymanie przez system w celu odzyskania pamięci. Ten atrybut działa TYLKO, jeśli aplikacja jest zbudowana jako aplikacja systemowa. -
permission="android.permission.BIND_IMS_SERVICE"
: Zapewnia, że tylko proces, któremu przyznano uprawnienieBIND_IMS_SERVICE
, może powiązać się z aplikacją. Zapobiega to powiązaniu się fałszywej aplikacji z usługą, ponieważ tylko aplikacje systemowe mogą uzyskać pozwolenie od platformy.
Usługa musi także określić element intent-filter
za pomocą akcji android.telephony.ims.ImsService
. Dzięki temu framework może znaleźć ImsService
.
Specyfikacja funkcji IMS
Po zdefiniowaniu usługi ImsService jako usługi systemu Android w pliku AndroidManifest.xml usługa ImsService musi określić, które funkcje IMS obsługuje. Android obsługuje obecnie funkcje MmTel i RCS, jednak tylko MmTel jest zintegrowany z platformą. Chociaż w frameworku nie ma zintegrowanych interfejsów API RCS, nadal istnieją zalety zadeklarowania go jako funkcji ImsService.
Poniżej znajdują się prawidłowe funkcje zdefiniowane w android.telephony.ims.ImsFeature
, które może zapewnić usługa ImsService, oraz wyjaśnienie i przykład, dlaczego aplikacja IMS chciałaby zaimplementować jedną lub wszystkie z tych funkcji. Po zdefiniowaniu każdej funkcji na tej stronie opisano, w jaki sposób ImsService
deklaruje zestaw funkcji zdefiniowanych dla każdego gniazda SIM.
FEATURE_MMTEL
ImsService
implementuje funkcję IMS MMTEL, która obsługuje wszystkie media IMS (specyfikacje IR.92 i IR.94) z wyjątkiem podłączenia awaryjnego do IMS PDN w celu połączeń alarmowych. Każda implementacja ImsService
, która chce obsługiwać funkcje MMTEL, powinna rozszerzać klasę bazową android.telephony.ims.MmTelFeature
i zwracać niestandardową implementację MmTelFeature
w ImsService#createMmTelFeature
.
FEATURE_EMERGENCY_MMTEL
Zadeklarowanie tej funkcji jedynie sygnalizuje platformie, że możliwe jest awaryjne podłączenie do IMS PDN dla służb ratunkowych. Jeśli ta funkcja nie zostanie zadeklarowana dla Twojej ImsService
, platforma zawsze będzie domyślnie korzystać z funkcji przełączania obwodów awaryjnych dla służb ratunkowych. Aby ta funkcja mogła zostać zdefiniowana, musi zostać zdefiniowana funkcja FEATURE_MMTEL
.
FEATURE_RCS
Interfejs API ImsService nie implementuje żadnych funkcji IMS RCS, ale klasa bazowa android.telephony.ims.RcsFeature
może być nadal użyteczna. Struktura automatycznie łączy się z ImsService i wywołuje ImsService#createRcsFeature
, gdy wykryje, że pakiet powinien udostępniać RCS. Jeśli karta SIM powiązana z usługą RCS zostanie usunięta, platforma automatycznie wywołuje RcsFeature#onFeatureRemoved
, a następnie czyści ImsService
powiązaną z funkcją RCS. Ta funkcja może usunąć część niestandardowej logiki wykrywania/wiązania, którą w przeciwnym razie musiałaby zapewniać funkcja RCS.
Rejestracja obsługiwanych funkcji
Struktura telefonii najpierw łączy się z usługą ImsService, aby wysyłać zapytania do obsługiwanych funkcji przy użyciu interfejsu API ImsService#querySupportedImsFeatures
. Gdy framework obliczy, które funkcje będą obsługiwane przez ImsService, wywoła ImsService#create[...]Feature
dla każdej funkcji, za którą będzie odpowiedzialna ImsService. Jeśli funkcje obsługiwane przez aplikację IMS ulegną zmianie, możesz użyć ImsService#onUpdateSupportedImsFeatures
aby zasygnalizować platformie konieczność ponownego obliczenia obsługiwanych funkcji. Więcej informacji na temat inicjalizacji i wiązania ImsService można znaleźć na poniższym diagramie.
Rysunek 2: Inicjalizacja i powiązanie ImsService
Wykrywanie frameworka i weryfikacja implementacji ImsService
Po prawidłowym zdefiniowaniu usługi ImsService w pliku AndroidManifest.xml należy skonfigurować platformę tak, aby w razie potrzeby (bezpiecznie) łączyła się z usługą ImsService. Istnieją dwa typy ImsServices, z którymi wiąże się platforma:
- „Zastąpienie” usługi ImsService przez operatora: te usługi ImsServices są wstępnie załadowane na urządzenie, ale są podłączone do jednego lub większej liczby operatorów komórkowych i zostaną powiązane dopiero po włożeniu pasującej karty SIM. Jest to konfigurowane za pomocą
-
config_ims_mmtel_package_override_string
Klucz CarrierConfig dla ImsServices wdrażających funkcje MMTEL. -
config_ims_rcs_package_override_string
dla ImsServices wdrażających funkcje RCS.
-
- Urządzenie „domyślne” ImsService: Jest to domyślna usługa ImsService ładowana na urządzenie przez producenta OEM i powinna być zaprojektowana tak, aby świadczyć usługi IMS we wszystkich sytuacjach, gdy operator ImsService nie jest dostępny i jest przydatna w sytuacjach, gdy urządzenie nie ma karty SIM włożona lub włożona karta SIM nie ma zainstalowanego operatora ImsService. Jest to definiowane w nakładce urządzenia przy użyciu następujących konfiguracji:
-
config_ims_mmtel_package
: Implementuje funkcje MMTEL -
config_ims_rcs_package
: Implementuje funkcje RCS
-
Android nie obsługuje aplikacji z implementacjami ImsService do pobrania innych firm, więc wszelkie zdefiniowane tutaj implementacje ImsService muszą być aplikacjami systemowymi i muszą znajdować się w folderze /system/priv-app/ lub /product/priv-app/, aby przyznać odpowiednie uprawnienia (mianowicie uprawnienia do telefonu, mikrofonu, lokalizacji, aparatu i kontaktów). Sprawdzając, czy nazwa pakietu implementacji IMS odpowiada zdefiniowanym powyżej wartościom CarrierConfig lub nakładki urządzenia, powiązane zostaną tylko zaufane, wstępnie zainstalowane aplikacje.
Dostosowywanie
Aplikacje implementujące ImsService są powiązane tylko z urządzeniami, na których są skonfigurowane jako „zastępujące” ImsService operatora lub „domyślne” konfiguracje ImsService urządzenia dla funkcjonalności MMTEL lub RCS. Usługa ImsService umożliwia także dynamiczne włączanie i wyłączanie obsługiwanych przez nią funkcji IMS (MMTEL i RCS) poprzez aktualizacje przy użyciu metody ImsService#onUpdateSupportedImsFeatures
. Powoduje to, że struktura ponownie oblicza, które usługi ImsServices są powiązane i jakie funkcje obsługują. Jeśli aplikacja IMS zaktualizuje środowisko bez obsługiwanych funkcji, usługa ImsService zostanie odłączona do czasu ponownego uruchomienia telefonu lub włożenia nowej karty SIM pasującej do aplikacji IMS.
Priorytet wiązania dla wielu usług ImsService
Struktura nie obsługuje powiązania ze wszystkimi możliwymi usługami ImsServices, które są wstępnie załadowane na urządzenie i powiąże maksymalnie dwie usługi ImsServices na każde gniazdo SIM (jedna usługa ImsService dla każdej funkcji) w następującej kolejności w zależności od funkcji:
- Nazwa pakietu ImsService zdefiniowana przez wartość CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
gdy włożona jest karta SIM. - Nazwa pakietu ImsService zdefiniowana w wartości nakładki urządzenia dla
config_ims_[mmtel/rcs]_package
łącznie z przypadkiem, gdy nie ma włożonej karty SIM. Ta usługa ImsService MUSI obsługiwać funkcję Emergency MmTel.
Musisz albo mieć zdefiniowaną nazwę pakietu swojej usługi ImsService w CarrierConfig dla każdego przewoźnika, który będzie korzystał z tego pakietu, albo w nakładce urządzenia, jeśli Twoja usługa ImsService będzie domyślna, zgodnie z definicją powyżej.
Podzielmy to dla każdej funkcji. W przypadku urządzenia (single lub multi-SIM) z załadowaną pojedynczą kartą SIM możliwe są dwie funkcje IMS: MMTel i RCS. Struktura spróbuje powiązać każdą funkcję w kolejności określonej powyżej, a jeśli funkcja nie jest dostępna dla usługi ImsService zdefiniowanej w zastąpieniu konfiguracji operatora, struktura powróci do domyślnej usługi ImsService. Na przykład poniższa tabela opisuje, z której funkcji IMS będzie korzystać platforma, biorąc pod uwagę trzy aplikacje IMS implementujące usługi ImsServices zainstalowane w systemie z następującymi funkcjami:
- Przewoźnik ImsService obsługuje RCS
- Carrier B ImsService obsługuje RCS i MMTel
- OEM ImsService obsługuje RCS i MMTel
Włożona karta SIM | Funkcja RCS | Funkcja MMTel |
---|---|---|
Przewoźnik A | Przewoźnik A | OEM |
Przewoźnik B | Przewoźnik B | Przewoźnik B |
Brak karty SIM | OEM | OEM |
Walidacja
Nie uwzględniono narzędzi do weryfikacji samej implementacji IMS, ponieważ specyfikacje IMS są niezwykle obszerne i wymagają specjalnego sprzętu weryfikacyjnego. Testy mogą jedynie sprawdzić, czy środowisko telefonii prawidłowo reaguje na interfejs API ImsService.
Opracuj aplikację IMS
Podczas tworzenia aplikacji IMS współpracującej ze stosem telefonicznym systemu Android zalecamy określenie, że aplikacja może nasłuchiwać lub modyfikować stan instancji ImsService dołączonej do subskrypcji określonego operatora.
Aby odsłuchać lub zmodyfikować stan ImsService dla funkcji MMTEL i RCS, użyj klasy ImsManager
w celu uzyskania instancji klasy ImsMmTelManager
, ImsRcsManager
lub klasy ProvisioningManager
specyficznej dla IMS. Aplikacja może następnie nasłuchiwać specyficznych dla IMS stanów usług i udostępniania, takich jak:
- Funkcje MMTEL lub RCS, które są włączone i dostępne
- Aktualizuje się, gdy zmienia się stan rejestracji IMS
- Stan udostępniania funkcji IMS
- Funkcje IMS włączone przez użytkownika
Użyj ImsStateCallback
Chociaż ImsService jest usługą powiązaną na stałe, powiązana usługa może ulec zmianie, gdy aktywna stanie się nowa karta SIM lub wbudowana subskrypcja lub gdy zmieni się konfiguracja operatora. Ponieważ usługa ImsService nie jest częścią procesu telefonii, w aplikacji mogą wystąpić nieprzewidziane wyjątki podczas próby uzyskania dostępu do interfejsów API IMS, jeśli usługa ImsService w niewidoczny sposób ulega awarii lub jest niezwiązana z powodu zmiany subskrypcji lub konfiguracji.
Na urządzeniach z systemem Android 13 lub nowszym, aby monitorować, czy instancja ImsService dla powiązanej subskrypcji jest dostępna czy niedostępna, aplikacja może użyć klasy ImsStateCallback
. W przypadku pobierania instancji ImsMmTelManager
lub ImsRcsManager
zalecamy, aby aplikacja najpierw zarejestrowała się w celu wywołania zwrotnego stanu IMS przy użyciu ImsMmTelManager#registerImsStateCallback
lub ImsRcsManager#registerImsStateCallback
. Aby nadal otrzymywać aktualizacje wywołań zwrotnych dla określonych subskrypcji, gdy usługa ImsService stanie się ponownie dostępna, aplikacja musi wyrejestrować lub odrzucić istniejące wywołania zwrotne zarejestrowane za pośrednictwem ImsMmTelManager
, ImsRcsManager
lub ProvisioningManager
; i zarejestruj nowe wywołania zwrotne.
Jeśli istnieje subskrypcja, która nie obsługuje IMS, struktura wywołuje ImsStateCallback#onUnavailable
z przyczyną REASON_NO_IMS_SERVICE_CONFIGURED
. Oznacza to, że ImsService i interfejsy API związane z IMS nie są dostępne w ramach subskrypcji.
W mało prawdopodobnym przypadku awarii procesu telefonii aplikacja odbiera ImsStateCallback#onError
i nie otrzymuje już aktualizacji zarejestrowanej instancji ImsStateCallback
. Aby wyjść z tego stanu, zarejestruj ponownie instancję ImsStateCallback
dla powiązanej subskrypcji, wywołując ImsMmTelManager#registerImsStateCallback
lub ImsRcsManager#registerImsStateCallback
.