Android 9 wprowadza nowy interfejs SystemApi o nazwie ImsService, który ułatwia implementację IMS (IP Multimedia Subsystem). 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 połączeń głosowych i wideo. ImsService API jest także interfejsem Android System API, co oznacza, że można go utworzyć bezpośrednio w pakiecie Android SDK, a nie w źródle. 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 AOSP aplikację, która implementuje część interfejsu ImsService API do celów testowych i programistycznych. Aplikację znajdziesz w katalogu /testapps/ImsTestService.
Dokumentację interfejsu ImsService API znajdziesz w klasie ImsService i innych klasach w tym interfejsie.
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 wykonywana przez procesor aplikacji, czy też częściowo lub w pełni przeciążona 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 API.
W przypadku tych urządzeń starsze interfejsy AIDL i klasy opakowują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ć ją z interfejsu API przestrzeni nazw
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ą parametru AndroidManifest.xml
aplikacji. Po drugie musi określić funkcje IMS obsługiwane przez implementację (MmTel lub RCS). Po trzecie musi zostać zweryfikowana jako zaufana implementacja IMS w konfiguracji operatora lub na nakładce na urządzeniu.
Definicja usługi
Aplikacja IMS rejestruje usługę ImsService w ramach platformy, 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
określa 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 pamięci zaszyfrowanej na urządzeniu, dopóki użytkownik nie odblokuje urządzenia. Więcej informacji znajdziesz w artykułach Wsparcie dla trybu bezpośredniego uruchamiania i Szyfrowanie plików.persistent="true"
: umożliwia ciągłe działanie usługi bez możliwości jej zakończenia 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_IMS_SERVICE"
: zapewnia, że tylko proces, któremu przyznano uprawnienieBIND_IMS_SERVICE
, może nawiązywać połączenie z aplikacją. Zapobiega to wiązaniu się z usługą przez aplikację nieuprawnioną, ponieważ tylko aplikacje systemowe mogą uzyskać uprawnienie w ramach tej funkcji.
Usługa musi też określić element intent-filter
z działaniem android.telephony.ims.ImsService
. Dzięki temu framework może 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 ramami. Chociaż w ramach nie ma interfejsów API RCS, deklarowanie ich jako funkcji usługi ImsService nadal przynosi korzyści.
Poniżej znajdziesz prawidłowe funkcje zdefiniowane w android.telephony.ims.ImsFeature
, jakie może wykonać usługa ImsService, oraz wyjaśnienie i przykład, dlaczego aplikacja IMS może wdrożyć jedną lub wszystkie z tych funkcji. Po zdefiniowaniu każdej 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 nie zadeklarujesz tej funkcji w urządzeniu ImsService
, platforma zawsze będzie domyślnie używać funkcji rezerwowej przełącznika obwodu na potrzeby służb ratunkowych. Aby zdefiniować tę funkcję, musisz zdefiniować funkcję FEATURE_MMTEL
.
FEATURE_RCS
Interfejs ImsService API nie implementuje żadnych funkcji IMS RCS, ale klasa bazowa android.telephony.ims.RcsFeature
może być nadal przydatna. Gdy wykryje, że pakiet powinien obsługiwać RCS, framework automatycznie łączy się z usługą ImsService i wywołuje funkcję ImsService#createRcsFeature
. Jeśli karta SIM powiązana z usługą RCS zostanie usunięta, platforma automatycznie wywołuje metodę RcsFeature#onFeatureRemoved
, a następnie usuwa ImsService
powiązane z funkcją RCS. Ta funkcja może wyeliminować część logiki wykrywania lub wiązania, która jest wymagana w przypadku funkcji RCS.
Rejestrowanie obsługiwanych funkcji
Platforma telekomunikacyjna najpierw łączy się z usługą ImsService, aby wysyłać zapytania o obsługiwane przez nią funkcje 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ć parametru ImsService#onUpdateSupportedImsFeatures
, aby zasygnalizować platformie, że obsługiwane funkcje zostaną ponownie obliczone. Więcej informacji o inicjalizacji i wiązaniu usługi ImsService znajdziesz na poniższym diagramie.
Rysunek 2. Inicjalizacja 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ą powiązane z jednym lub większą liczbą operatorów komórkowych i będą dostępne tylko wtedy, gdy włożysz odpowiednią kartę SIM. Do konfigurowania służy:
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. Definiuje się to w nakładce na urządzeniu przy użyciu tych konfiguracji:
config_ims_mmtel_package
: obsługuje funkcje MMTEL.config_ims_rcs_package
: wprowadza funkcje RCS
Android nie obsługuje aplikacji z implementacjami ImsService pobranymi przez inne firmy, dlatego wszelkie zdefiniowane tutaj implementacje ImsService muszą być aplikacjami systemowymi i muszą znajdować się w folderze /system/priv-app/ lub /product/priv-app/, by przyznać odpowiednie uprawnienia (czyli uprawnienia do 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, pozwala ograniczyć się tylko do zaufanych, wstępnie zainstalowanych aplikacji.
Dostosowywanie
Aplikacje z włączoną usługą ImsService są powiązane tylko na urządzeniach, na których skonfigurowano funkcję „Zastąpienie” ImsService lub jeśli skonfigurowano ustawienie ImsService urządzenia w przypadku 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
. Powoduje to ponowne obliczenie, które ImsServices są powiązane i obsługiwane funkcje. Jeśli aplikacja IMS zaktualizuje framework bez obsługiwanych funkcji, usługa ImsService będzie odłączona, dopóki nie zrestartujesz telefonu lub nie włożysz nowej karty SIM odpowiadającej aplikacji IMS.
Priorytet powiązania dla 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 jest włożona karta SIM. - Nazwa pakietu ImsService zdefiniowana w wartości nakładki urządzenia
config_ims_[mmtel/rcs]_package
, łącznie z sytuacją, gdy nie włożono karty SIM. Ta usługa ImsService MUSI obsługiwać funkcję MmTel w trybie alarmowym.
Musisz albo określić nazwę pakietu ImsService w konfiguracji operatora, dla każdego przewoźnika używającego tego pakietu, lub w nakładce na urządzeniu, jeśli ImsService jest usługą domyślną (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 wykonać wią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 opisujemy, której funkcji IMS będzie używać platforma w przypadku 3 aplikacji IMS implementujących ImsServices, zainstalowanych w systemie z tymi funkcjami:
- Operator A ImsService obsługuje RCS
- Operator B ImsService 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 | Przewoźnik B |
Brak karty SIM | OEM | OEM |
Weryfikacja
Narzędzia do weryfikacji implementacji IMS nie są uwzględnione, ponieważ specyfikacje IMS są bardzo duże i wymagają specjalnego sprzętu do weryfikacji. Testy mogą tylko potwierdzić, że framework telefonii odpowiada prawidłowo na wywołania interfejsu ImsService API.
Programowanie aplikacji IMS
Podczas tworzenia aplikacji IMS, która współpracuje ze stosem usług telefonicznych na Androidzie, zalecamy określenie, że aplikacja może nasłuchiwać lub modyfikować stan instancji ImsService powiązanej z abonamentem konkretnego operatora.
Aby nasłuchiwać lub modyfikować stan ImsService na potrzeby funkcji MMTEL i RCS, użyj klasy ImsManager
, aby pobrać instancję klasy ImsMmTelManager
, ImsRcsManager
lub specyficznej dla 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 zmienia się stan rejestracji IMS
- Stan obsługi administracyjnej funkcji IMS
- Funkcje IMS włączone przez użytkownika
Używanie ImsStateCallback
Chociaż usługa ImsService jest usługą z trwałym powiązaniem, usługa, do której 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.
Aby sprawdzić, czy instancja ImsService powiązanej z subskrypcją jest dostępna na urządzeniach z Androidem 13 lub nowszym, aplikacja może używać klasy ImsStateCallback
. Przy pobieraniu instancji ImsMmTelManager
lub ImsRcsManager
zalecamy, aby aplikacja najpierw zarejestrowała się dla wywołania zwrotnego stanu IMS za pomocą 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 powodem REASON_NO_IMS_SERVICE_CONFIGURED
.
Oznacza to, że ImsService ani związane z IMS interfejsy API nie są dostępne w przypadku tej 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
.