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.
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łaniaandroid.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 service
w AndroidManifest.xml
określa te atrybuty, które są niezbędne do prawidłowego działania:
directBootAware="true"
: umożliwia wykrywanie i uruchamianie usługi przeztelephony
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 uruchamiania i Szyfrowanie 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 uprawnienieBIND_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ę MmTelFeature
w ImsService#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.
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:
- 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.
- Konfiguruje się to za pomocą
config_ims_mmtel_package_override_string
Klucz CarrierConfig dla usług IMS implementujących funkcje MMTEL.config_ims_rcs_package_override_string
w przypadku usług ImsServices implementujących funkcje RCS.
- 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:
config_ims_mmtel_package
: wdraża funkcje MMTEL;config_ims_rcs_package
: wdraża funkcje RCS;
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:
- Nazwa pakietu ImsService zdefiniowana przez wartość CarrierConfig, gdy włożona jest karta SIM.
config_ims_[mmtel/rcs]_package_override_string
- 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
.