W Androidzie 9 wprowadziliśmy nowy interfejs SystemApi o nazwie ImsService , który pomoże Ci wdrożyć podsystem multimedialny IP (IMS). ImsService API to dobrze zdefiniowany interfejs między platformą Androida a dostawcą lub IMS udostępniany przez operatora.
Rysunek 1. Omówienie usługi ImsService
Za pomocą interfejsu ImsService Implementator IMS może dostarczyć ważne przekazywanie informacji platformie, takich jak dane rejestracyjne IMS, SMS-y integracji komunikatora i MmTel, a także integracji funkcji MmTel w celu dostarczania połączeń głosowych i wideo połączenia. ImsService API jest również interfejsem Android System API, co oznacza, że może utworzonych w pakiecie SDK na Androida, a nie w źródle. komunikatora Aplikacja wstępnie zainstalowana na urządzeniu można też skonfigurować tak, być aktualizowany.
Przykłady i źródło
W usłudze AOSP na Androida dostępna jest aplikacja, która wykorzystuje fragmenty Interfejs ImsService API do testowania i programowania. Dodatkowe informacje na temat aplikację na /testapps/ImsTestService
Dokumentację interfejsu ImsService API znajdziesz w ImsService a także w innych klasach w interfejsie API.
Implementacja
ImsService API to interfejs API wysokiego poziomu, który pozwala wdrażać IMS na wiele sposobów, w zależności od dostępnego sprzętu. Na przykład wprowadzenie zmiany w zależności od tego, czy implementacja IMS jest w pełni związana z aplikacją, lub jest częściowo lub całkowicie odciążony od modemu. Android nie udostępniać publicznej zawartości HAL do odciążania procesora pasma podstawowego, więc muszą zostać przeciążone za pomocą rozszerzenia HAL do modemu.
Zgodność ze starszymi implementacjami IMS
Chociaż Android 9 obejmuje interfejs ImsService API,
urządzenia korzystające ze starszej implementacji IMS nie będą obsługiwać tego interfejsu API.
W przypadku tych urządzeń starsze interfejsy AIDL i klasy kodu zostały przeniesione
do przestrzeni nazw android.telephony.ims.compat
. Po przejściu na Androida
9, starsze urządzenia muszą wykonać te czynności, aby kontynuować
i stara wersja interfejsu API.
- Zmień przestrzeń nazw implementacji ImsService, aby rozszerzyć ją z
Interfejs API przestrzeni nazw
android.telephony.ims.compat
. - Zmodyfikuj definicję usługi ImsService w pliku AndroidManifest.xml, aby używać atrybutu
android.telephony.ims.compat.ImsService
działanie filtra intencji, a nie działanieandroid.telephony.ims.ImsService
.
Platforma połączy się z ImsService za pomocą warstwy zgodności
są dostępne w Androidzie 9 i działają ze starszymi
Implementacja ImsService
.
Rejestracja ImsService za pomocą platformy
Interfejs ImsService API jest implementowany jako usługa, której platforma Android
wiąże się z, aby komunikować się z implementacją IMS. Wystarczą 3 kroki:
konieczne do zarejestrowania aplikacji, która implementuje ImsService za pomocą
platformy. Po pierwsze, implementacja ImsService musi zarejestrować się w parametrze
platformy korzystającej z elementu AndroidManifest.xml
aplikacji; po drugie,
określać, które funkcje IMS są obsługiwane przez implementację (MmTel lub RCS); Po trzecie,
musi zostać zweryfikowany jako zaufany dostawca IMS u operatora
konfiguracji lub nakładki urządzenia.
Definicja usługi
Aplikacja IMS rejestruje usługę ImsService za pomocą platformy, dodając do niej
service
wpis w 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
definiuje te elementy
Atrybuty, które są niezbędne do prawidłowego działania:
directBootAware="true"
: umożliwia wykrywanie i uruchamianie usługi przeztelephony
, zanim użytkownik odblokuje urządzenie. Usługa nie ma dostępu szyfrowane urządzenie, zanim użytkownik odblokuje urządzenie. Więcej Więcej informacji zawiera Obsługa trybu bezpośredniego rozruchu oraz Szyfrowanie oparte na plikach.persistent="true"
: umożliwia trwałe uruchamianie tej usługi, zabitego przez system, żeby odzyskać pamięć. Ten atrybut działa TYLKO wtedy, gdy atrybut jest przeznaczona do aplikacji systemowej.permission="android.permission.BIND_IMS_SERVICE"
: zapewnia, że tylko proces, do którego przyznano uprawnienieBIND_IMS_SERVICE
, może powiązane z aplikacją. Zapobiega to wiązaniu się nieuczciwej aplikacji z usługi, ponieważ tylko aplikacje systemowe mogą otrzymać te uprawnienia platformy.
Usługa musi również określać 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 dla Androida w AndroidManifest.xml, ImsService musi określać, które funkcje IMS są obsługiwane. Android obecnie obsługuje funkcje MmTel i RCS, ale tylko MmTel zintegrowane z platformą. Chociaż nie ma zintegrowanych interfejsów RCS API platformy, nadal ma on zalety zadeklarowanie go jako funkcji ImsService
Poniżej znajdują się prawidłowe funkcje zdefiniowane w android.telephony.ims.ImsFeature
, które:
ImsService może podać
i wyjaśnić, dlaczego dany komunikator
będzie stosować jedną lub wszystkie
z tych funkcji. Po każdym
funkcja jest zdefiniowana, ale na tej stronie znajdziesz informacje o tym, jak ImsService
deklaruje zestaw
właściwości każdego gniazda karty SIM.
FUNKCJA_MMTEL
ImsService
implementuje funkcję IMS MMTEL, która obsługuje
wszystkie multimedia IMS (specyfikacje IR.92 i IR.94) oprócz sytuacji awaryjnych
IMS PDN na potrzeby połączeń alarmowych. Każda implementacja ImsService
, która chce
obsługujące funkcje MMTEL powinny rozszerzyć
android.telephony.ims.MmTelFeature
klasy bazowej i zwracają niestandardową
Wdrożenie MmTelFeature
w:
ImsService#createMmTelFeature
FEATURE_EMERGENCY_MMTEL
Zadeklarowanie tej funkcji spowoduje tylko przekazanie przez platformę informacji, które w sytuacji awaryjnej dołączają do
IMS PDN na potrzeby służb ratunkowych jest możliwy. Jeśli ta funkcja nie została zadeklarowana dla
ImsService
, platforma zawsze będzie domyślnie używać awaryjnego przełącznika obwodu
służb ratunkowych. W przypadku tego elementu należy zdefiniować funkcję FEATURE_MMTEL
do zdefiniowania.
FUNKCJA_RCS
Interfejs ImsService API nie implementuje żadnych funkcji RCS IMS, ale
Klasa bazowa android.telephony.ims.RcsFeature
może być nadal przydatna. Struktura
automatycznie łączy się z ImsService i wywołuje ImsService#createRcsFeature
gdy wykryje, że przesyłka powinna obsługiwać protokół RCS. Jeśli powiązana karta SIM
gdy usługa RCS zostanie usunięta, platforma automatycznie wywoła
RcsFeature#onFeatureRemoved
, a następnie czyści powiązane dane (ImsService
)
z funkcją RCS. Ta funkcja może usunąć niektóre niestandardowe
lub logikę wykrywania bądź wiązania, którą musiałaby zapewnić funkcja RCS.
Rejestracja obsługiwanych funkcji
Platforma telekomunikacyjna najpierw łączy się z ImsService, aby umożliwić wysyłanie zapytań o funkcje,
który obsługuje interfejs ImsService#querySupportedImsFeatures
API. Po
oblicza funkcje obsługiwane przez ImsService,
ImsService#create[...]Feature
dla każdej funkcji, którą będzie ImsService
za który ponosimy odpowiedzialność. Jeśli funkcje obsługiwane przez aplikację IMS ulegną zmianie,
za pomocą pola ImsService#onUpdateSupportedImsFeatures
może zasygnalizować platformę
i przeliczyć obsługiwane funkcje. Więcej informacji znajdziesz na schemacie poniżej
na zainicjowaniu i powiązaniu usługi ImsService.
Rysunek 2. Inicjowanie i powiązanie ImsService
Wykrywanie i weryfikacja platformy ImsService
Po prawidłowym zdefiniowaniu ImsService w pliku AndroidManifest.xml atrybut należy skonfigurować (bezpiecznie) powiązanie platformy z ImsService, gdy odpowiednie. Platforma łączy 2 typy ImsServices:
- „Zastąp” operatora ImsService: te usługi ImsServices są wstępnie wczytywane na
jest połączone z co najmniej jednym operatorem i będzie
wiązane po włożeniu odpowiedniej karty SIM. Do konfiguracji służy
config_ims_mmtel_package_override_string
Klucz CarrierConfig na potrzeby usług ImsServices z implementacją funkcji MMTEL.config_ims_rcs_package_override_string
w usługach ImsServices z obsługą funkcji RCS.
- Urządzenie „domyślne” ImsService: domyślna wczytywana usługa ImsService
przez OEM i powinien być zaprojektowany do świadczenia usług IMS.
w przypadku, gdy usługa ImsService nie jest dostępna i przydaje się
sytuacje, gdy w urządzeniu nie ma karty SIM ani karty SIM
nie ma zainstalowanej usługi ImsService operatora. To jest
zdefiniowane w nakładce urządzenia przy użyciu następujących konfiguracji:
config_ims_mmtel_package
: Implementuje funkcje MMTELconfig_ims_rcs_package
: Implementuje funkcje RCS.
Android nie obsługuje aplikacji, w których można pobrać usługę ImsService innej firmy więc wszystkie zdefiniowane tutaj implementacje ImsService są być aplikacjami systemowymi i muszą znajdować się w katalogu /system/priv-app/ lub /product/priv-app/, aby przyznać odpowiednie uprawnienia (np. telefon, dostęp do mikrofonu, lokalizacji, aparatu i kontaktów). Poprzez sprawdzenie, czy nazwa pakietu implementacji IMS jest zgodna z kartą CarrierConfig lub urządzeniem zdefiniowanych powyżej wartości nakładanych, tylko zaufane, wstępnie zainstalowane aplikacje związane.
Dostosowywanie
Aplikacje implementujące ImsService są powiązane tylko na urządzeniach, na których
są skonfigurowane jako „zastąpienie” operatora. ImsService lub urządzenie „default”
Konfiguracje ImsService na potrzeby funkcji MMTEL lub RCS.
ImsService umożliwia również korzystanie z obsługiwanych funkcji IMS (MMTEL i RCS)
można włączać i wyłączać dynamicznie za pomocą aktualizacji
Metoda ImsService#onUpdateSupportedImsFeatures
. Powoduje to, że platforma
ponownie obliczać, które ImsServices są powiązane i obsługiwane funkcje. Jeśli
Aplikacja IMS aktualizuje platformę bez obsługiwanych funkcji, ImsService
powiązanie zostanie usunięte do czasu ponownego uruchomienia telefonu lub włożenia nowej karty SIM;
pasuje do aplikacji IMS.
Priorytet powiązania dla wielu usług ImsService
Platforma nie obsługuje powiązań ze wszystkimi możliwymi usługami ImsServices, które są wstępnie załadowana na urządzenie i powiązana z maksymalnie 2 usługami ImsServices na gniazdo karty SIM (jedna usługa ImsService na każdą funkcję) w następującej kolejności, z uwzględnieniem poszczególnych cech:
- Nazwa pakietu ImsService zdefiniowana przez wartość CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
, gdy w urządzeniu jest karta SIM wstawione. - Nazwa pakietu ImsService zdefiniowana w wartości nakładki na urządzeniu dla
config_ims_[mmtel/rcs]_package
w tym w przypadku, gdy nie ma karty SIM włożono kartę. Ta usługa ImsService MUSI obsługiwać funkcję połączeń alarmowych.
Musisz mieć nazwę pakietu ImsService zdefiniowaną w CarrierConfig dla każdego przewoźnika, który użyje danego pakietu, lub w na urządzeniu, jeśli usługa ImsService będzie domyślna, zgodnie z definicją powyżej.
Przeanalizujmy każdą z tych cech. Do urządzenia (pojedyncza lub z wieloma kartami SIM) w przypadku jednej karty SIM są dostępne 2 funkcje IMS: MMTel i RCS. Platforma spróbuje utworzyć powiązanie w określonej powyżej kolejności dla każdej funkcji oraz jeśli funkcja nie jest dostępna dla usługi ImsService zdefiniowanej u operatora przesłonięcie konfiguracji, platforma w zastępstwie będzie korzystać z domyślnej usługi ImsService. Na przykład w tabeli poniżej opisano, z której funkcji IMS będzie korzystać platforma użycie danych z 3 aplikacji IMS implementujących funkcje ImsServices zainstalowane w systemie z tymi funkcjami:
- Operator A ImsService obsługuje RCS
- Operator B ImsService obsługuje RCS i MMTel
- ImsService OEM obsługuje RCS i MMTel
Włożono kartę 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 |
Weryfikacja
Narzędzia do weryfikacji samej implementacji IMS nie zostały uwzględnione, są bardzo duże i wymagają specjalnego sprzętu do weryfikacji. mogą jedynie sprawdzić, czy platforma telefoniczna prawidłowo reaguje na Interfejs API ImsService.
Programowanie aplikacji IMS
Podczas tworzenia aplikacji IMS, która współpracuje ze stosem telefonów z Androidem, zalecamy określenie, że aplikacja może nasłuchiwać lub modyfikować stan Instancja ImsService dołączona do subskrypcji określonego operatora.
Aby nasłuchiwać lub modyfikować stan ImsService na potrzeby funkcji MMTEL i RCS, użyj
ImsManager
klasy, aby pobrać instancję
ImsMmTelManager
,
ImsRcsManager
lub konkretnego komunikatora
ProvisioningManager
zajęcia. Aplikacja może wtedy nasłuchiwać stanów usługi i udostępniania specyficznych dla IMS
Na przykład:
- Włączone i dostępne funkcje MMTEL i RCS
- Aktualizacje po zmianie stanu rejestracji IMS
- Stan obsługi administracyjnej funkcji IMS
- Funkcje IMS włączone przez użytkownika
Użyj funkcji ImsStateCallback
Chociaż ImsService jest trwale powiązaną usługą, która Wartość granica może się zmienić, gdy nowa karta SIM lub osadzona subskrypcja stanie się aktywna lub gdy konfiguracja operatora się zmieni. Ponieważ ImsService nie jest częścią przez telefon, w aplikacji mogą wystąpić nieprzewidziane wyjątki aby uzyskać dostęp do interfejsów IMS, jeśli usługa ImsService ulegnie niewidocznej awarii lub będzie niepowiązana z powodu subskrypcji lub konfiguracji.
na urządzeniach z Androidem 13 lub nowszym w celu monitorowania
czy instancja ImsService dla powiązanej subskrypcji jest
dostępna lub niedostępna, aplikacja może używać
ImsStateCallback
zajęcia. Gdy pobieramy instancję 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ć aktualizacje oddzwaniania dla konkretnych subskrypcji, gdy
Usługa ImsService stanie się ponownie dostępna. Aplikacja musi wyrejestrować lub odrzucić istniejącą
wywołania zwrotne zarejestrowane przez ImsMmTelManager
, ImsRcsManager
lub
ProvisioningManager
; i rejestrować nowe wywołania zwrotne.
Jeśli istnieje subskrypcja, która nie obsługuje IMS, platforma wywołuje
ImsStateCallback#onUnavailable
podając przyczynę,
REASON_NO_IMS_SERVICE_CONFIGURED
Oznacza to, że ImsService ani związane z IMS interfejsy API nie są dostępne dla
subskrypcji.
W mało prawdopodobnym przypadku awarii procesu telefonicznego aplikacja odbiera
ImsStateCallback#onError
i nie otrzymuje już aktualizacji w zarejestrowanej instancji ImsStateCallback
.
Aby rozwiązać problem po spełnieniu tego warunku, ponownie zarejestruj instancję ImsStateCallback
dla
powiązanej subskrypcji, wywołując
ImsMmTelManager#registerImsStateCallback
.
lub
ImsRcsManager#registerImsStateCallback