Android 9 wprowadza interfejs SystemApi o nazwie ImsService, który ułatwia implementację multimedialnego podsystemu IP (IMS). Interfejs ImsService API to dobrze zdefiniowany interfejs między platformą Android a implementacją IMS dostarczoną przez dostawcę lub operatora.
Rysunek 1. Omówienie ImsService
Korzystając z interfejsu ImsService, implementator IMS może przekazywać platformie ważne informacje o sygnalizacji, takie jak informacje o rejestracji IMS, SMS-y w ramach integracji IMS oraz integracja funkcji MmTel, aby umożliwić prowadzenie rozmów głosowych i wideo. Interfejs ImsService API jest też interfejsem Android System API, co oznacza, że można go skompilować bezpośrednio z pakietu SDK Androida, a nie z źródła. Aplikację IMS, która została wstępnie zainstalowana na urządzeniu, można skonfigurować tak, aby można było ją aktualizować w Sklepie Play.
Przykłady i źródło
Android udostępnia w ramach AOSP aplikację, która implementuje części interfejsu ImsService API na potrzeby testowania i tworzenia. Aplikację znajdziesz w katalogu /testapps/ImsTestService.
Dokumentację interfejsu ImsService API znajdziesz w klasie ImsService i innych klasach w tym interfejsie API.
Implementacja
Interfejs ImsService API to interfejs API wysokiego poziomu, który umożliwia implementację 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 pełni przetwarzana przez procesor aplikacji, czy też jest częściowo lub całkowicie przenoszona do modemu. Android nie udostępnia publicznego interfejsu HAL do przenoszenia zadań na procesor pasma podstawowego, dlatego wszelkie przenoszenie zadań musi odbywać się za pomocą rozszerzenia interfejsu HAL do modemu.
Zgodność ze starszymi implementacjami IMS
Chociaż Android 9 zawiera interfejs ImsService API, urządzenia korzystające ze starszej implementacji IMS nie mogą korzystać z tego interfejsu.
W przypadku tych urządzeń starsze interfejsy AIDL i klasy otulające zostały przeniesione do przestrzeni nazw android.telephony.ims.compat
. Aby starsze urządzenia mogły nadal korzystać z obsługi starszego interfejsu API, po przejściu na Androida 9 należy wykonać te czynności.
- Zmień przestrzeń nazw implementacji ImsService, aby rozszerzyć interfejs API
android.telephony.ims.compat
. - Zmodyfikuj definicję usługi ImsService w pliku AndroidManifest.xml, aby zamiast działania
android.telephony.ims.ImsService
użyć działaniaandroid.telephony.ims.compat.ImsService
intent-filter.
Następnie framework połączy się z usługą ImsService za pomocą warstwy zgodności udostępnionej w Androidzie 9, aby współpracować ze starszą implementacjąImsService
.
Rejestracja ImsService w ramach frameworku
Interfejs ImsService API jest implementowany jako usługa, do której framework Androida się łączy, aby komunikować się z implementacją IMS. Aby zarejestrować aplikację, która implementuje interfejs ImsService w ramach frameworku, musisz wykonać 3 kroki. Po pierwsze, implementacja ImsService musi zarejestrować się na platformie za pomocą AndroidManifest.xml
aplikacji. Po drugie, musi określić, które funkcje IMS obsługuje (MmTel lub RCS). Po trzecie, musi zostać zweryfikowana jako zaufane wdrożenie IMS w konfiguracji operatora lub nakładce na urządzeniu.
Definicja usługi
Aplikacja IMS rejestruje ImsService w ramach frameworku, dodając do pliku manifestu wpis service
w takim 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 te atrybuty, które są niezbędne do prawidłowego działania:
directBootAware="true"
: umożliwia wykrywanie usługi i jej uruchamianie przeztelephony
, zanim użytkownik odblokuje urządzenie. Usługa nie może uzyskać dostępu do zaszyfrowanej pamięci urządzenia, dopóki użytkownik nie odblokuje urządzenia. Więcej informacji znajdziesz w artykułach Obsługa trybu bezpośredniego uruchamiania i Szyfrowanie plików.persistent="true"
: umożliwia ciągłe działanie usługi bez możliwości jej zabicia przez system w celu odzyskania pamięci. Ten atrybut działa TYLKO wtedy, gdy aplikacja jest tworzona jako aplikacja systemowa.permission="android.permission.BIND_IMS_SERVICE"
: zapewnia, że tylko proces, któremu przyznano uprawnienieBIND_IMS_SERVICE
, może się wią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.ims.ImsService
. Pozwala to frameworkowi znaleźć ImsService
.
Specyfikacja funkcji IMS
Po zdefiniowaniu usługi ImsService jako usługi na Androida w pliku AndroidManifest.xml należy określić, które funkcje IMS obsługuje. Android obsługuje obecnie funkcje MmTel i RCS, ale tylko MmTel jest zintegrowany z ramówką. Chociaż w ramach nie ma interfejsów API RCS, deklarowanie ich jako funkcji usługi ImsService ma swoje zalety.
Poniżej znajdziesz listę prawidłowych funkcji zdefiniowanych w interfejsie android.telephony.ims.ImsFeature
, które może udostępniać usługa ImsService, a także wyjaśnienie i przykład, dlaczego aplikacja IMS może chcieć zaimplementować jedną lub wszystkie z tych funkcji. Po zdefiniowaniu poszczególnych funkcji ta strona opisuje, jak ImsService
deklaruje zestaw funkcji zdefiniowanych dla każdego gniazda karty SIM.
FEATURE_MMTEL
ImsService
implementuje funkcję IMS MMTEL, która obejmuje obsługę wszystkich mediów IMS (specyfikacje IR.92 i IR.94), z wyjątkiem połączenia alarmowego do PDN IMS na potrzeby połączeń alarmowych. Każda implementacja ImsService
, która ma obsługiwać funkcje MMTEL, powinna rozszerzać klasę podstawową android.telephony.ims.MmTelFeature
i zwracać niestandardową implementację MmTelFeature
w ImsService#createMmTelFeature
.
FEATURE_EMERGENCY_MMTEL
Zadeklarowanie tej funkcji sygnalizuje tylko platformie, że możliwe jest dołączenie do PDN IMS w przypadku usług ratunkowych. Jeśli ta funkcja nie jest zadeklarowana w Twoim ImsService
, platforma zawsze domyślnie użyje przełączania obwodów w przypadku usług ratunkowych. Aby zdefiniować tę funkcję, musisz zdefiniować funkcję FEATURE_MMTEL
.
FEATURE_RCS
Interfejs API ImsService nie implementuje żadnych funkcji IMS RCS, ale klasa bazowa android.telephony.ims.RcsFeature
może być nadal przydatna. Framework automatycznie łączy się z usługą ImsService i wywołuje funkcję ImsService#createRcsFeature
, gdy wykryje, że pakiet powinien udostępniać RCS. Jeśli karta SIM powiązana z usługą RCS zostanie usunięta, framework automatycznie wywoła funkcję RcsFeature#onFeatureRemoved
, a następnie usunie element ImsService
powiązany z funkcją RCS. Ta funkcja może wyeliminować część logiki wykrywania lub wiązania, która w przeciwnym razie musiałaby być udostępniana przez funkcję RCS.
Rejestrowanie obsługiwanych funkcji
Framework telefonii najpierw łączy się z usługą ImsService, aby zapytać o funkcje, które obsługuje za pomocą interfejsu API ImsService#querySupportedImsFeatures
. Po obliczeniu przez framework funkcji obsługiwanych przez ImsService wywołuje on funkcję ImsService#create[...]Feature
dla każdej funkcji, za którą odpowiada ImsService. Jeśli funkcje obsługiwane przez aplikację IMS ulegną zmianie, możesz użyć ImsService#onUpdateSupportedImsFeatures
, aby zasygnalizować platformie ponowne obliczenie obsługiwanych funkcji. Więcej informacji o inicjalizacji i wiązaniu usługi ImsService znajdziesz na poniższym diagramie.
Rysunek 2. Inicjowanie i wiązanie ImsService
Wykrywanie i weryfikacja implementacji ImsService w ramach frameworku
Po prawidłowym zdefiniowaniu usługi ImsService w pliku AndroidManifest.xml należy skonfigurować platformę tak, aby w odpowiednich przypadkach (w bezpieczny sposób) wiązała się ona z tą usługą. Istnieją 2 rodzaje usług ImsServices, z którymi framework się wiąże:
- „Zastąpienie” przez operatora ImsService: te usługi są wstępnie wczytane na urządzeniu, ale są przypisane do co najmniej 1 operatora telefonii komórkowych i będą dostępne tylko po włożeniu odpowiedniej karty SIM. Konfiguracja odbywa się za pomocą
config_ims_mmtel_package_override_string
Klucz CarrierConfig dla ImsServices implementujących funkcje MMTEL.config_ims_rcs_package_override_string
w przypadku ImsServices implementujących funkcje RCS.
- „Domyślna” usługa ImsService na urządzeniu: jest to domyślna usługa ImsService wczytana na urządzenie przez producenta OEM, która powinna zapewniać usługi IMS we wszystkich sytuacjach, gdy usługa ImsService operatora jest niedostępna. Jest ona przydatna w sytuacjach, gdy w urządzeniu nie ma karty SIM lub gdy karta SIM nie ma zainstalowanej usługi ImsService operatora. Jest to zdefiniowane w nakładce urządzenia za pomocą tych konfiguracji:
config_ims_mmtel_package
: wdrożono funkcje MMTELconfig_ims_rcs_package
: wprowadza funkcje RCS
Android nie obsługuje aplikacji z implementacjami ImsService innych firm, więc wszystkie zdefiniowane tutaj implementacje ImsService muszą być aplikacjami systemowymi i znajdować się w folderze /system/priv-app/ lub /product/priv-app/, aby przyznać odpowiednie uprawnienia (dotyczące telefonu, mikrofonu, lokalizacji, aparatu i kontaktów). Sprawdzanie, czy nazwa pakietu implementacji IMS jest zgodna z definiowanymi powyżej wartościami CarrierConfig lub overlay urządzenia, ogranicza się tylko do zaufanych, wstępnie zainstalowanych aplikacji.
Dostosowywanie
Aplikacje korzystające z usługi ImsService są powiązane tylko na urządzeniach, na których są skonfigurowane jako „zastąpienie” usługi ImsService przez operatora lub „domyślna” konfiguracja usługi ImsService dla funkcji MMTEL lub RCS.
Usługa ImsService umożliwia też dynamiczne włączanie i wyłączanie obsługiwanych przez nią funkcji IMS (MMTEL i RCS) za pomocą aktualizacji przy użyciu metody ImsService#onUpdateSupportedImsFeatures
. Spowoduje to ponowne obliczenie przez framework, które usługi ImsServices są powiązane i które funkcje obsługują. Jeśli aplikacja IMS zaktualizuje framework bez obsługiwanych funkcji, ImsService zostanie odłączony, dopóki telefon nie zostanie ponownie uruchomiony lub nie zostanie włożona nowa karta SIM odpowiadająca aplikacji IMS.
Priorytet wiązania w przypadku wielu usług ImsService
Platforma nie może obsługiwać wiązania z wszystkimi możliwymi usługami ImsService wstępnie załadowanymi na urządzeniu. Będzie wiązać się z maksymalnie 2 usługami ImsService na jeden slot karty SIM (po jednej usłudze ImsService na każdą funkcję) w takim porządku:
- Nazwa pakietu ImsService zdefiniowana przez wartość CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
, gdy w urządzeniu jest włożona karta SIM. - Nazwa pakietu ImsService zdefiniowana w wartości nakładki urządzenia dla
config_ims_[mmtel/rcs]_package
, w tym w przypadku, gdy nie ma włożonej karty SIM. Ta usługa ImsService MUSI obsługiwać funkcję MmTel w trybie alarmowym.
Musisz mieć nazwę pakietu usługi ImsService zdefiniowaną w CarrierConfig dla każdego operatora, który będzie używać tego pakietu, lub w nakładce urządzenia, jeśli usługa ImsService ma być domyślna, zgodnie z definicją powyżej.
Przyjrzyjmy się teraz poszczególnym funkcjom. W przypadku urządzenia (z jedną lub wieloma kartami SIM) z włożoną jedną kartą SIM dostępne są 2 funkcje IMS: MMTel i RCS. Platforma spróbuje utworzyć powiązanie w kolejności zdefiniowanej powyżej dla każdej funkcji. Jeśli funkcja jest niedostępna dla usługi ImsService zdefiniowanej w ustawieniu zastępczym konfiguracji operatora, platforma użyje domyślnej usługi ImsService. Na przykład w tabeli poniżej opisano, której funkcji IMS będzie używać platforma, biorąc pod uwagę 3 aplikacje IMS z implementacją ImsServices zainstalowane w systemie z tymi funkcjami:
- Operator A ImsService obsługuje RCS
- Aplikacja ImsService operatora B obsługuje RCS i MMTel
- OEM ImsService obsługuje RCS i MMTel
Karta SIM została włożona | Funkcja RCS | Funkcja MMTel |
---|---|---|
Operator A | Operator A | OEM |
Operator B | Operator B | Operator B |
Brak karty SIM | OEM | OEM |
Weryfikacja
Nie obejmuje to narzędzi do weryfikacji implementacji IMS, ponieważ specyfikacje IMS są bardzo obszerne i wymagają specjalnego sprzętu do weryfikacji. Testy mogą tylko potwierdzić, że framework telefonii odpowiada prawidłowo na wywołania interfejsu API usługi ImsService.
Tworzenie aplikacji IMS
Podczas tworzenia aplikacji IMS, która będzie współpracować z komunikacją telefoniczną w Androidzie, zalecamy określenie, że aplikacja może odbierać lub modyfikować stan instancji usługi ImsService, która jest dołączona do konkretnej subskrypcji u operatora.
Aby odczytać lub zmodyfikować stan ImsService w przypadku funkcji MMTEL i RCS, użyj klasy ImsManager
, aby uzyskać instancję klasy ImsMmTelManager
,
ImsRcsManager
lub klasy IMS ProvisioningManager
. Aplikacja może wtedy nasłuchiwać stanów usługi i obsługi administracyjnej dotyczących IMS, takich jak:
- Funkcje MMTEL lub RCS, które są włączone i dostępne
- Aktualizuje się, gdy stan rejestracji IMS ulega zmianie.
- Stan obsługi administracyjnej funkcji IMS
- Funkcje IMS włączone przez użytkownika
Używanie ImsStateCallback
Chociaż usługa ImsService jest usługą trwale powiązaną, usługa, która jest powiązana, może się zmienić, gdy nowa karta SIM lub wbudowana subskrypcja stanie się aktywna lub gdy zmieni się konfiguracja operatora. Ponieważ ImsService nie jest częścią procesu telefonicznego, podczas próby uzyskania dostępu do interfejsów IMS aplikacja może napotkać nieoczekiwane wyjątki, jeśli ImsService nieoczekiwanie się zawiesi lub zostanie odłączony z powodu zmiany subskrypcji lub konfiguracji.
Na urządzeniach z Androidem 13 lub nowszym aplikacja może używać klasy ImsStateCallback
, aby sprawdzać, czy instancja ImsService powiązana z powiązanym abonamentem jest dostępna czy niedostępna. Podczas uzyskiwania wystąpienia funkcji ImsMmTelManager
lub ImsRcsManager
zalecamy, aby aplikacja najpierw zarejestrowała się do wywołania zwrotnego stanu IMS za pomocą funkcji ImsMmTelManager#registerImsStateCallback
lub ImsRcsManager#registerImsStateCallback
.
Aby nadal otrzymywać powiadomienia o połączeniu zwrotnym dotyczące konkretnej subskrypcji, gdy usługa ImsService znów będzie dostępna, aplikacja musi anulować rejestrację lub odrzucić istniejące wywołania zwrotne zarejestrowane za pomocą funkcji ImsMmTelManager
, ImsRcsManager
lub ProvisioningManager
oraz zarejestrować nowe wywołania zwrotne.
Jeśli subskrypcja nie obsługuje IMS, framework wywołuje funkcję ImsStateCallback#onUnavailable
z argumentem REASON_NO_IMS_SERVICE_CONFIGURED
.
Oznacza to, że usługa ImsService i interfejsy IMS nie są dostępne w ramach subskrypcji.
W nieprawdopodobnym przypadku awarii procesu telefonii aplikacja otrzymuje ImsStateCallback#onError
i nie otrzymuje już aktualizacji zarejestrowanego wystąpienia ImsStateCallback
.
Aby rozwiązać ten problem, ponownie zarejestruj instancję ImsStateCallback
dla powiązanej subskrypcji, wywołując funkcję ImsMmTelManager#registerImsStateCallback
lub ImsRcsManager#registerImsStateCallback
.