Wdrażanie IMS

Android 9 wprowadza interfejs SystemApi o nazwie ImsService, który ułatwia wdrażanie podsystemu multimedialnego 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, dostawca implementacji IMS może przekazywać platformie ważne informacje o sygnalizacji, takie jak informacje o rejestracji IMS, integracja SMS-ów przez IMS i integracja funkcji MmTel, aby umożliwić połączenia głosowe i wideo. Interfejs ImsService API jest też interfejsem Android System API, co oznacza, że można go tworzyć bezpośrednio na podstawie pakietu Android SDK, a nie na podstawie kodu źródłowego. Aplikację IMS wstępnie zainstalowaną na urządzeniu można też skonfigurować tak, aby można ją było 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 programowania. Aplikację znajdziesz w katalogu /testapps/ImsTestService.

Dokumentację interfejsu ImsService API znajdziesz w sekcji ImsService oraz w innych klasach interfejsu API.

Implementacja

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 realizowana na procesorze aplikacji, czy też jest częściowo lub w całości przeniesiona na modem. Android nie udostępnia publicznego HAL do przenoszenia zadań na procesor pasma podstawowego, więc wszelkie przenoszenie zadań musi odbywać się za pomocą rozszerzenia HAL modemu.

Zgodność ze starszymi wdrożeniami IMS

Chociaż Android 9 zawiera interfejs ImsService API, urządzenia korzystające ze starszej implementacji IMS nie obsługują tego interfejsu. W przypadku tych urządzeń starsze interfejsy AIDL i klasy opakowujące zostały przeniesione do przestrzeni nazw android.telephony.ims.compat. Podczas aktualizacji do Androida 9 starsze urządzenia muszą wykonać te czynności, aby nadal obsługiwać starszy interfejs API.

  • Zmień przestrzeń nazw implementacji ImsService, aby rozszerzyć interfejs API przestrzeni nazw android.telephony.ims.compat.
  • Zmodyfikuj definicję usługi ImsService w pliku AndroidManifest.xml, aby używać działania android.telephony.ims.compat.ImsService intent-filter zamiast działania android.telephony.ims.ImsService.

Platforma powiąże się wtedy z ImsService za pomocą warstwy zgodności udostępnionej w Androidzie 9, aby współpracować z starszą implementacją ImsService.

Rejestracja ImsService w ramach platformy

Interfejs ImsService API jest zaimplementowany jako usługa, z którą łączy się platforma Androida, aby komunikować się z implementacją IMS. Aby zarejestrować w platformie aplikację, która implementuje ImsService, 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 zaufana implementacja IMS w konfiguracji operatora lub nakładce urządzenia.

Definicja usługi

Aplikacja IMS rejestruje ImsService w ramach platformy, dodając wpis service do pliku manifestu w tym 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 i uruchamianie usługi przez telephony przed odblokowaniem urządzenia przez użytkownika. Usługa nie ma 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 uruchamianiaSzyfrowanie oparte na plikach.
  • persistent="true": umożliwia ciągłe działanie tej usługi i zapobiega jej zamknięciu przez system w celu odzyskania pamięci. Ten atrybut działa TYLKO wtedy, gdy aplikacja jest aplikacją systemową.
  • permission="android.permission.BIND_IMS_SERVICE": zapewnia, że tylko proces, któremu przyznano uprawnienie BIND_IMS_SERVICE, może powiązać się z aplikacją. Zapobiega to powiązaniu się z usługą nieuczciwej aplikacji, ponieważ tylko aplikacje systemowe mogą uzyskać to uprawnienie od platformy.

Usługa musi też określić element intent-filter z działaniem android.telephony.ims.ImsService. Dzięki temu platforma może znaleźć ImsService.

Specyfikacja funkcji IMS

Po zdefiniowaniu usługi ImsService jako usługi Androida w pliku AndroidManifest.xml musi ona określić, które funkcje IMS obsługuje. Android obsługuje obecnie funkcje MmTel i RCS, ale tylko MmTel jest zintegrowany z platformą. Chociaż w ramach platformy nie ma zintegrowanych interfejsów API RCS, zadeklarowanie jej jako funkcji ImsService ma pewne zalety.

Poniżej znajdziesz prawidłowe funkcje zdefiniowane w android.telephony.ims.ImsFeature, które może udostępniać usługa ImsService, oraz wyjaśnienie i przykład, dlaczego aplikacja IMS może chcieć zaimplementować jedną lub wszystkie z tych funkcji. Po zdefiniowaniu każdej funkcji na tej stronie opisujemy, jak ImsService deklaruje zestaw funkcji, które definiuje dla każdego gniazda SIM.

FEATURE_MMTEL

ImsService obsługuje funkcję IMS MMTEL, która obejmuje wszystkie media IMS (specyfikacje IR.92 i IR.94) z wyjątkiem połączenia alarmowego z siecią IMS PDN w celu wykonania połączenia alarmowego. Każda implementacja ImsService, która ma obsługiwać funkcje MMTEL, powinna rozszerzać klasę bazową 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 sieci IMS PDN w celu połączenia ze służbami ratunkowymi. Jeśli ta funkcja nie zostanie zadeklarowana w przypadku Twojego ImsService, platforma zawsze będzie domyślnie korzystać z funkcji Circuit Switch Fallback w przypadku służb 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ć przydatna. Platforma automatycznie wiąże się z usługą ImsService i wywołuje metodę ImsService#createRcsFeature, gdy wykryje, że pakiet powinien obsługiwać RCS. Jeśli karta SIM powiązana z usługą RCS zostanie usunięta, platforma automatycznie wywoła RcsFeature#onFeatureRemoved, a następnie wyczyści ImsService powiązany z funkcją RCS. Ta funkcja może usunąć część niestandardowej logiki wykrywania lub wiązania, którą w innym przypadku musiałaby zapewniać funkcja RCS.

Rejestracja obsługiwanych funkcji

Platforma telefoniczna najpierw wiąże się z usługą ImsService, aby za pomocą interfejsu ImsService#querySupportedImsFeatures API sprawdzić, jakie funkcje obsługuje. Gdy platforma obliczy, które funkcje będzie obsługiwać ImsService, wywoła funkcję ImsService#create[...]Feature dla każdej funkcji, za którą będzie odpowiadać ImsService. Jeśli funkcje obsługiwane przez aplikację IMS ulegną zmianie, możesz użyć ImsService#onUpdateSupportedImsFeatures, aby poinformować platformę o konieczności ponownego obliczenia obsługiwanych funkcji. Więcej informacji o inicjowaniu i wiązaniu usługi ImsService znajdziesz na poniższym diagramie.

Inicjowanie i powiązanie usługi ImsService

Rysunek 2. Inicjowanie i powiązanie usługi ImsService

Wykrywanie platformy i weryfikacja implementacji ImsService

Gdy usługa ImsService zostanie prawidłowo zdefiniowana w pliku AndroidManifest.xml, platforma musi być skonfigurowana tak, aby w odpowiednich przypadkach (bezpiecznie) łączyć się z usługą ImsService. Platforma wiąże się z 2 rodzajami usług ImsService:

  1. Usługa ImsService „zastępująca” operatora: te usługi ImsService są wstępnie załadowane na urządzenie, ale są powiązane z co najmniej jednym operatorem komórkowym i będą powiązane tylko wtedy, gdy zostanie włożona pasująca karta SIM.
  2. Domyślna usługa ImsService urządzenia: jest to domyślna usługa ImsService wczytywana na urządzenie przez producenta OEM. Powinna ona zapewniać usługi IMS we wszystkich sytuacjach, gdy usługa ImsService operatora nie jest dostępna. Jest przydatna w sytuacjach, gdy w urządzeniu nie ma karty SIM lub włożona 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 do pobrania od innych firm, więc wszystkie implementacje ImsService zdefiniowane w tym miejscu muszą być aplikacjami systemowymi i 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 pasuje do wartości CarrierConfig lub nakładki urządzenia zdefiniowanych powyżej, można powiązać 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” 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. Spowoduje to ponowne obliczenie przez platformę, które usługi ImsService są powiązane i jakie funkcje obsługują. Jeśli aplikacja IMS zaktualizuje platformę bez obsługiwanych funkcji, usługa ImsService zostanie odłączona do czasu ponownego uruchomienia telefonu lub włożenia nowej karty SIM, która pasuje do aplikacji IMS.

Priorytet powiązania w przypadku wielu usług ImsService

Platforma nie może obsługiwać powiązań ze wszystkimi możliwymi usługami ImsService, które są wstępnie załadowane na urządzeniu. Będzie się łączyć z maksymalnie 2 usługami ImsService na gniazdo SIM (po jednej usłudze ImsService dla każdej funkcji) w tej kolejności w przypadku każdej funkcji:

  1. Nazwa pakietu ImsService zdefiniowana przez wartość CarrierConfig, gdy włożona jest karta SIM.config_ims_[mmtel/rcs]_package_override_string
  2. Nazwa pakietu ImsService zdefiniowana w wartości nakładki urządzenia dla config_ims_[mmtel/rcs]_package, w tym w przypadku, gdy nie jest włożona karta SIM. Ten interfejs ImsService MUSI obsługiwać funkcję Emergency MmTel.

Nazwa pakietu ImsService musi być zdefiniowana w pliku CarrierConfig dla każdego operatora, który będzie używać tego pakietu, lub w nakładce urządzenia, jeśli usługa ImsService będzie domyślna (zgodnie z powyższym opisem).

Przyjrzyjmy się każdej funkcji z osobna. W przypadku urządzenia (z jedną lub wieloma kartami SIM) z jedną kartą SIM dostępne są 2 funkcje IMS: MMTel i RCS. Platforma spróbuje powiązać każdą funkcję w kolejności zdefiniowanej powyżej. Jeśli funkcja nie jest dostępna w przypadku usługi ImsService zdefiniowanej w zastąpieniu konfiguracji operatora, platforma powróci do domyślnej usługi ImsService. Na przykład w tabeli poniżej opisano, której funkcji IMS użyje platforma, jeśli w systemie z tymi funkcjami są zainstalowane 3 aplikacje IMS implementujące ImsServices:

  • Usługa ImsService operatora A obsługuje RCS
  • Usługa ImsService operatora B obsługuje RCS i MMTel
  • Usługa ImsService OEM obsługuje RCS i MMTel
Włożono kartę SIM Funkcja RCS Funkcja MMTel
Operator A Operator A OEM
Przewoźnik B Przewoźnik B Przewoźnik B
Brak karty SIM OEM OEM

Weryfikacja

Narzędzia do weryfikacji samej implementacji IMS nie są uwzględnione, ponieważ specyfikacje IMS są bardzo obszerne i wymagają specjalnego sprzętu weryfikacyjnego. Testy mogą tylko sprawdzić, czy platforma telefoniczna prawidłowo odpowiada na interfejs API ImsService.

Tworzenie aplikacji IMS

Podczas tworzenia aplikacji IMS, która komunikuje się ze stosem telefonicznym Androida, zalecamy określenie, że aplikacja może nasłuchiwać lub modyfikować stan instancji ImsService dołączonej do konkretnej subskrypcji operatora.

Aby odczytać 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ć stanów usług i obsługi administracyjnej specyficznych dla IMS, takich jak:

  • włączone i dostępne funkcje MMTEL lub RCS,
  • Aktualizacje, gdy zmieni się stan rejestracji IMS
  • Stan obsługi administracyjnej funkcji IMS
  • Funkcje IMS włączone przez użytkownika

Używanie ImsStateCallback

Chociaż 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 telefonii, aplikacja może napotkać nieoczekiwane wyjątki podczas próby uzyskania dostępu do interfejsów API IMS, jeśli ImsService ulegnie niewidocznemu awarii lub zostanie odłączony z powodu zmiany subskrypcji lub konfiguracji.

Na urządzeniach z Androidem 13 lub nowszym aplikacja może monitorować dostępność lub niedostępność instancji ImsService dla powiązanej subskrypcji za pomocą klasy ImsStateCallback. Podczas uzyskiwania instancji ImsMmTelManager lub ImsRcsManager zalecamy, aby aplikacja najpierw zarejestrowała wywołanie zwrotne stanu IMS za pomocą funkcji ImsMmTelManager#registerImsStateCallback lub ImsRcsManager#registerImsStateCallback. Aby nadal otrzymywać aktualizacje wywołań zwrotnych dotyczące konkretnych subskrypcji, gdy usługa ImsService będzie ponownie dostępna, aplikacja musi wyrejestrować lub odrzucić istniejące wywołania zwrotne zarejestrowane za pomocą funkcji ImsMmTelManager, ImsRcsManager lub ProvisioningManager i zarejestrować nowe wywołania zwrotne.

Jeśli subskrypcja nie obsługuje IMS, platforma wywołuje ImsStateCallback#onUnavailable z przyczyną REASON_NO_IMS_SERVICE_CONFIGURED. Oznacza to, że usługa ImsService i interfejsy API związane z IMS nie są dostępne w przypadku tej subskrypcji.

W mało prawdopodobnym przypadku awarii procesu telefonicznego aplikacja otrzymuje ImsStateCallback#onError i nie otrzymuje już aktualizacji zarejestrowanej instancji ImsStateCallback. Aby rozwiązać ten problem, ponownie zarejestruj instancję ImsStateCallback w powiązanej subskrypcji, wywołując funkcję ImsMmTelManager#registerImsStateCallback lub ImsRcsManager#registerImsStateCallback.