Wdrażanie IMS

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.

Omówienie ImsService

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 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 na procesorze aplikacji, czy jest częściowo lub całkowicie przeniesiona 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żywać działania android.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 działania. 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 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 serviceAndroidManifest.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 przez telephony, 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 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 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 uprawnienie BIND_IMS_SERVICE, może nawiązywać połączenie z aplikacją. Zapobiega to wiązaniu się z usługą przez aplikację niepożądaną, 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. 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 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ę MmTelFeatureImsService#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 deklarowana w przypadku Twojego ImsService, platforma zawsze domyślnie użyje przełączania obwodów w przypadku usług alarmowych. 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 obsługiwać 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

Najpierw łączy się z usługą ImsService, aby zapytać 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ć 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.

Inicjowanie i wiązanie ImsService

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 typy usług ImsServices, z którymi framework się wiąże:

  1. „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ą
  2. „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:

Android nie obsługuje aplikacji z implementacjami ImsService innych firm, które można pobrać, dlatego 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, pozwala ograniczyć 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, 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 wiązania w przypadku wielu usług ImsService

Platforma nie może obsługiwać wiązania z wszystkimi możliwymi usługami Ims, które są wstępnie załadowane na urządzeniu. Będzie wiązać się z maksymalnie 2 usługami Ims na jeden slot karty SIM (po jednej usłudze Ims na każdą funkcję) w tym porządku:

  1. Nazwa pakietu ImsService zdefiniowana przez wartość CarrierConfigconfig_ims_[mmtel/rcs]_package_override_string, gdy w urządzeniu jest włożona karta SIM.
  2. 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 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 opisano, której funkcji IMS będzie używać platforma, biorąc pod uwagę 3 aplikacje IMS implementujące 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 interfejs ImsService API.

Tworzenie aplikacji IMS

Podczas tworzenia aplikacji IMS, która będzie współpracować z poziomem telefonii 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 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#onUnavailablez powodemREASON_NO_IMS_SERVICE_CONFIGURED. Oznacza to, że ImsService i interfejsy API związane z IMS są niedostępne dla tej subskrypcji.

W nieprawdopodobnym przypadku awarii procesu telefonii aplikacja otrzymujeImsStateCallback#onErrori 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.