Wdrażanie ZSZ

W systemie Android 9 wprowadzono nowy interfejs SystemApi o nazwie ImsService , który pomaga wdrożyć podsystem multimediów IP (IMS). Interfejs API ImsService to dobrze zdefiniowany interfejs pomiędzy platformą Android a implementacją IMS dostarczoną przez dostawcę lub operatora.

Przegląd ImsService

Rysunek 1. Przegląd ImsService

Korzystając z interfejsu ImsService, wdrażający IMS może dostarczyć platformie ważne informacje sygnalizacyjne, takie jak informacje rejestracyjne IMS, integrację SMS-ów przez IMS oraz integrację funkcji MmTel w celu zapewnienia połączeń głosowych i wideo. Interfejs API ImsService jest również interfejsem API systemu Android, co oznacza, że ​​można go zbudować bezpośrednio w oparciu o pakiet SDK systemu Android, a nie o źródło. Aplikację IMS, która została wstępnie zainstalowana na urządzeniu, można również skonfigurować tak, aby można ją było aktualizować w Sklepie Play.

Przykłady i źródło

Android udostępnia aplikację na platformie AOSP, która implementuje fragmenty interfejsu API ImsService do celów testowania i programowania. Aplikację znajdziesz pod adresem /testapps/ImsTestService .

Dokumentację interfejsu API ImsService można znaleźć w ImsService oraz w innych klasach interfejsu API.

Realizacja

ImsService API to interfejs API wysokiego poziomu, który umożliwia wdrażanie 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 całości umieszczona na procesorze aplikacji, czy też jest częściowo lub całkowicie przeniesiona do modemu. Android nie zapewnia publicznej warstwy HAL do odciążania procesora pasma podstawowego, więc wszelkie odciążanie musi odbywać się przy użyciu rozszerzenia HAL do modemu.

Kompatybilność ze starszymi implementacjami IMS

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

  • 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 używać akcji filtrowania intencji android.telephony.ims.compat.ImsService zamiast akcji android.telephony.ims.ImsService .

Struktura zostanie następnie powiązana z usługą ImsService przy użyciu warstwy zgodności dostępnej w systemie Android 9 w celu współpracy ze starszą implementacją ImsService .

Rejestracja ImsService w frameworku

Interfejs API ImsService jest zaimplementowany jako usługa, z którą łączy się framework Androida w celu komunikacji z implementacją IMS. Aby zarejestrować aplikację implementującą ImsService w frameworku, potrzebne są trzy kroki. Po pierwsze, implementacja ImsService musi zarejestrować się na platformie przy użyciu AndroidManifest.xml aplikacji; po drugie, musi określić, które funkcje IMS obsługuje implementacja (MmTel lub RCS); i po trzecie, należy ją zweryfikować jako zaufaną implementację IMS w konfiguracji operatora lub nakładce urządzenia.

Definicja usługi

Aplikacja IMS rejestruje usługę ImsService w frameworku poprzez dodanie wpisu service do manifestu w następującym 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 następujące atrybuty niezbędne do prawidłowego działania:

  • directBootAware="true" : umożliwia wykrycie i uruchomienie usługi przez telephony , zanim użytkownik odblokuje urządzenie. Usługa nie może uzyskać dostępu do zaszyfrowanej pamięci urządzenia , zanim użytkownik odblokuje urządzenie. Aby uzyskać więcej informacji, zobacz Obsługa trybu bezpośredniego rozruchu i szyfrowania plików .
  • persistent="true" : Zezwala na ciągłe uruchamianie tej usługi i uniemożliwia jej zatrzymanie przez system w celu odzyskania pamięci. Ten atrybut działa TYLKO, jeśli aplikacja jest zbudowana jako aplikacja systemowa.
  • 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ę fałszywej aplikacji z usługą, ponieważ tylko aplikacje systemowe mogą uzyskać pozwolenie od platformy.

Usługa musi także określić element intent-filter za pomocą akcji android.telephony.ims.ImsService . Dzięki temu framework może znaleźć ImsService .

Specyfikacja funkcji IMS

Po zdefiniowaniu usługi ImsService jako usługi systemu Android w pliku AndroidManifest.xml usługa ImsService musi określić, które funkcje IMS obsługuje. Android obsługuje obecnie funkcje MmTel i RCS, jednak tylko MmTel jest zintegrowany z platformą. Chociaż w frameworku nie ma zintegrowanych interfejsów API RCS, nadal istnieją zalety zadeklarowania go jako funkcji ImsService.

Poniżej znajdują się prawidłowe funkcje zdefiniowane w android.telephony.ims.ImsFeature , które może zapewnić usługa ImsService, oraz wyjaśnienie i przykład, dlaczego aplikacja IMS chciałaby zaimplementować jedną lub wszystkie z tych funkcji. Po zdefiniowaniu każdej funkcji na tej stronie opisano, w jaki sposób ImsService deklaruje zestaw funkcji zdefiniowanych dla każdego gniazda SIM.

FEATURE_MMTEL

ImsService implementuje funkcję IMS MMTEL, która obsługuje wszystkie media IMS (specyfikacje IR.92 i IR.94) z wyjątkiem podłączenia awaryjnego do IMS PDN w celu połączeń alarmowych. Każda implementacja ImsService , która chce 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 jedynie sygnalizuje platformie, że możliwe jest awaryjne podłączenie do IMS PDN dla służb ratunkowych. Jeśli ta funkcja nie zostanie zadeklarowana dla Twojej ImsService , platforma zawsze będzie domyślnie korzystać z funkcji przełączania obwodów awaryjnych dla służb ratunkowych. Aby ta funkcja mogła zostać zdefiniowana, musi zostać zdefiniowana funkcja FEATURE_MMTEL .

FEATURE_RCS

Interfejs API ImsService nie implementuje żadnych funkcji IMS RCS, ale klasa bazowa android.telephony.ims.RcsFeature może być nadal użyteczna. Struktura automatycznie łączy się z ImsService i wywołuje ImsService#createRcsFeature , gdy wykryje, że pakiet powinien udostępniać RCS. Jeśli karta SIM powiązana z usługą RCS zostanie usunięta, platforma automatycznie wywołuje RcsFeature#onFeatureRemoved , a następnie czyści ImsService powiązaną z funkcją RCS. Ta funkcja może usunąć część niestandardowej logiki wykrywania/wiązania, którą w przeciwnym razie musiałaby zapewniać funkcja RCS.

Rejestracja obsługiwanych funkcji

Struktura telefonii najpierw łączy się z usługą ImsService, aby wysyłać zapytania do obsługiwanych funkcji przy użyciu interfejsu API ImsService#querySupportedImsFeatures . Gdy framework obliczy, które funkcje będą obsługiwane przez ImsService, wywoła ImsService#create[...]Feature dla każdej funkcji, za którą będzie odpowiedzialna ImsService. Jeśli funkcje obsługiwane przez aplikację IMS ulegną zmianie, możesz użyć ImsService#onUpdateSupportedImsFeatures aby zasygnalizować platformie konieczność ponownego obliczenia obsługiwanych funkcji. Więcej informacji na temat inicjalizacji i wiązania ImsService można znaleźć na poniższym diagramie.

Inicjowanie i wiązanie ImsService

Rysunek 2: Inicjalizacja i powiązanie ImsService

Wykrywanie frameworka i weryfikacja implementacji ImsService

Po prawidłowym zdefiniowaniu usługi ImsService w pliku AndroidManifest.xml należy skonfigurować platformę tak, aby w razie potrzeby (bezpiecznie) łączyła się z usługą ImsService. Istnieją dwa typy ImsServices, z którymi wiąże się platforma:

  1. „Zastąpienie” usługi ImsService przez operatora: te usługi ImsServices są wstępnie załadowane na urządzenie, ale są podłączone do jednego lub większej liczby operatorów komórkowych i zostaną powiązane dopiero po włożeniu pasującej karty SIM. Jest to konfigurowane za pomocą
  2. Urządzenie „domyślne” ImsService: Jest to domyślna usługa ImsService ładowana na urządzenie przez producenta OEM i powinna być zaprojektowana tak, aby świadczyć usługi IMS we wszystkich sytuacjach, gdy operator ImsService nie jest dostępny i jest przydatna w sytuacjach, gdy urządzenie nie ma karty SIM włożona lub włożona karta SIM nie ma zainstalowanego operatora ImsService. Jest to definiowane w nakładce urządzenia przy użyciu następujących konfiguracji:

Android nie obsługuje aplikacji z implementacjami ImsService do pobrania innych firm, więc wszelkie zdefiniowane tutaj implementacje ImsService muszą być aplikacjami systemowymi i muszą 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 odpowiada zdefiniowanym powyżej wartościom CarrierConfig lub nakładki urządzenia, powiązane zostaną 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” konfiguracje ImsService urządzenia dla funkcjonalności MMTEL lub RCS. Usługa ImsService umożliwia także dynamiczne włączanie i wyłączanie obsługiwanych przez nią funkcji IMS (MMTEL i RCS) poprzez aktualizacje przy użyciu metody ImsService#onUpdateSupportedImsFeatures . Powoduje to, że struktura ponownie oblicza, które usługi ImsServices są powiązane i jakie funkcje obsługują. Jeśli aplikacja IMS zaktualizuje środowisko bez obsługiwanych funkcji, usługa ImsService zostanie odłączona do czasu ponownego uruchomienia telefonu lub włożenia nowej karty SIM pasującej do aplikacji IMS.

Priorytet wiązania dla wielu usług ImsService

Struktura nie obsługuje powiązania ze wszystkimi możliwymi usługami ImsServices, które są wstępnie załadowane na urządzenie i powiąże maksymalnie dwie usługi ImsServices na każde gniazdo SIM (jedna usługa ImsService dla każdej funkcji) w następującej kolejności w zależności od funkcji:

  1. Nazwa pakietu ImsService zdefiniowana przez wartość CarrierConfig config_ims_[mmtel/rcs]_package_override_string gdy włożona jest karta SIM.
  2. Nazwa pakietu ImsService zdefiniowana w wartości nakładki urządzenia dla config_ims_[mmtel/rcs]_package łącznie z przypadkiem, gdy nie ma włożonej karty SIM. Ta usługa ImsService MUSI obsługiwać funkcję Emergency MmTel.

Musisz albo mieć zdefiniowaną nazwę pakietu swojej usługi ImsService w CarrierConfig dla każdego przewoźnika, który będzie korzystał z tego pakietu, albo w nakładce urządzenia, jeśli Twoja usługa ImsService będzie domyślna, zgodnie z definicją powyżej.

Podzielmy to dla każdej funkcji. W przypadku urządzenia (single lub multi-SIM) z załadowaną pojedynczą kartą SIM możliwe są dwie funkcje IMS: MMTel i RCS. Struktura spróbuje powiązać każdą funkcję w kolejności określonej powyżej, a jeśli funkcja nie jest dostępna dla usługi ImsService zdefiniowanej w zastąpieniu konfiguracji operatora, struktura powróci do domyślnej usługi ImsService. Na przykład poniższa tabela opisuje, z której funkcji IMS będzie korzystać platforma, biorąc pod uwagę trzy aplikacje IMS implementujące usługi ImsServices zainstalowane w systemie z następującymi funkcjami:

  • Przewoźnik ImsService obsługuje RCS
  • Carrier B ImsService obsługuje RCS i MMTel
  • OEM ImsService obsługuje RCS i MMTel
Włożona karta SIM Funkcja RCS Funkcja MMTel
Przewoźnik A Przewoźnik A OEM
Przewoźnik B Przewoźnik B Przewoźnik B
Brak karty SIM OEM OEM

Walidacja

Nie uwzględniono narzędzi do weryfikacji samej implementacji IMS, ponieważ specyfikacje IMS są niezwykle obszerne i wymagają specjalnego sprzętu weryfikacyjnego. Testy mogą jedynie sprawdzić, czy środowisko telefonii prawidłowo reaguje na interfejs API ImsService.

Opracuj aplikację IMS

Podczas tworzenia aplikacji IMS współpracującej ze stosem telefonicznym systemu Android zalecamy określenie, że aplikacja może nasłuchiwać lub modyfikować stan instancji ImsService dołączonej do subskrypcji określonego operatora.

Aby odsłuchać 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ć specyficznych dla IMS stanów usług i udostępniania, takich jak:

  • Funkcje MMTEL lub RCS, które są włączone i dostępne
  • Aktualizuje się, gdy zmienia się stan rejestracji IMS
  • Stan udostępniania funkcji IMS
  • Funkcje IMS włączone przez użytkownika

Użyj ImsStateCallback

Chociaż ImsService jest usługą powiązaną na stałe, powiązana usługa może ulec zmianie, gdy aktywna stanie się nowa karta SIM lub wbudowana subskrypcja lub gdy zmieni się konfiguracja operatora. Ponieważ usługa ImsService nie jest częścią procesu telefonii, w aplikacji mogą wystąpić nieprzewidziane wyjątki podczas próby uzyskania dostępu do interfejsów API IMS, jeśli usługa ImsService w niewidoczny sposób ulegnie awarii lub zostanie niezwiązana z powodu zmiany subskrypcji lub konfiguracji.

Na urządzeniach z systemem Android 13 lub nowszym, aby monitorować, czy instancja ImsService dla powiązanej subskrypcji jest dostępna czy niedostępna, aplikacja może użyć klasy ImsStateCallback . W przypadku pobierania instancji ImsMmTelManager lub ImsRcsManager zalecamy, aby aplikacja najpierw zarejestrowała się w celu wywołania zwrotnego stanu IMS przy użyciu ImsMmTelManager#registerImsStateCallback lub ImsRcsManager#registerImsStateCallback . Aby nadal otrzymywać aktualizacje wywołań zwrotnych dla określonych subskrypcji, gdy usługa ImsService stanie się ponownie dostępna, aplikacja musi wyrejestrować lub odrzucić istniejące wywołania zwrotne zarejestrowane za pośrednictwem ImsMmTelManager , ImsRcsManager lub ProvisioningManager ; i zarejestruj nowe wywołania zwrotne.

Jeśli istnieje subskrypcja, która nie obsługuje IMS, struktura wywołuje ImsStateCallback#onUnavailable z przyczyną REASON_NO_IMS_SERVICE_CONFIGURED . Oznacza to, że ImsService i interfejsy API związane z IMS nie są dostępne w ramach subskrypcji.

W mało prawdopodobnym przypadku awarii procesu telefonii aplikacja odbiera ImsStateCallback#onError i nie otrzymuje już aktualizacji zarejestrowanej instancji ImsStateCallback . Aby wyjść z tego stanu, zarejestruj ponownie instancję ImsStateCallback dla powiązanej subskrypcji, wywołując ImsMmTelManager#registerImsStateCallback lub ImsRcsManager#registerImsStateCallback .