In Android 9 wird die neue SystemApi-Schnittstelle ImsService eingeführt, die Sie bei der Implementierung des IP Multimedia Subsystem (IMS) unterstützt. Die ImsService API ist eine klar definierte Schnittstelle zwischen der Android-Plattform und einer vom Anbieter oder Mobilfunkanbieter bereitgestellten IMS-Implementierung.
Abbildung 1. ImsService – Übersicht
Über die ImsService-Schnittstelle kann der IMS-Implementierer der Plattform wichtige Signalisierungsinformationen zur Verfügung stellen, z. B. IMS-Registrierungsinformationen, SMS über IMS-Integration und MmTel-Funktionsintegration für Sprach- und Videoanrufe. Die ImsService API ist auch eine Android System API, d. h., sie kann direkt für das Android SDK und nicht für die Quelle erstellt werden. Eine IMS-App, die auf dem Gerät vorinstalliert ist, kann auch so konfiguriert werden, dass sie über den Play Store aktualisiert werden kann.
Beispiele und Quelle
Android bietet eine App in AOSP, die Teile der ImsService API zu Test- und Entwicklungszwecken implementiert. Sie finden die App unter /testapps/ImsTestService.
Die Dokumentation für die ImsService API finden Sie unter ImsService und in den anderen Klassen in der API.
Implementierung
Die ImsService API ist eine allgemeine API, mit der Sie IMS je nach verfügbarer Hardware auf viele Arten implementieren können. Die Implementierung ändert sich beispielsweise, je nachdem, ob die IMS-Implementierung vollständig auf dem App-Prozessor ausgeführt wird oder teilweise oder vollständig an das Modem ausgelagert wird. Android bietet keine öffentliche HAL für das Offloading an den Basebandprozessor. Daher muss das Offloading über Ihre HAL-Erweiterung an das Modem erfolgen.
Kompatibilität mit älteren IMS-Implementierungen
Obwohl Android 9 die ImsService API enthält, können Geräte mit einer älteren IMS-Implementierung die API nicht unterstützen.
Für diese Geräte wurden die älteren AIDL-Schnittstellen und Wrapper-Klassen in den Namespace android.telephony.ims.compat
verschoben. Wenn Sie auf Android 9 aktualisieren, müssen Sie auf älteren Geräten Folgendes tun, damit die ältere API weiterhin unterstützt wird.
- Ändern Sie den Namespace der ImsService-Implementierung so, dass er von der
android.telephony.ims.compat
-Namespace-API abgeleitet wird. - Ändern Sie die Dienstdefinition „ImsService“ in AndroidManifest.xml, sodass die Intent-Filter-Aktion
android.telephony.ims.compat.ImsService
anstelle der Aktionandroid.telephony.ims.ImsService
verwendet wird.
Das Framework bindet dann über die in Android 9 bereitgestellte Kompatibilitätsebene an den ImsService, um mit der alten ImsService
-Implementierung zu funktionieren.
ImsService-Registrierung beim Framework
Die ImsService API wird als Dienst implementiert, an den das Android-Framework gebunden wird, um mit der IMS-Implementierung zu kommunizieren. Es sind drei Schritte erforderlich, um eine App zu registrieren, die einen ImsService implementiert. Erstens muss sich die ImsService-Implementierung mit der AndroidManifest.xml
der App bei der Plattform registrieren. Zweitens muss sie definieren, welche IMS-Funktionen die Implementierung unterstützt (MmTel oder RCS). Drittens muss sie entweder in der Mobilfunkanbieterkonfiguration oder im Geräte-Overlay als vertrauenswürdige IMS-Implementierung bestätigt werden.
Dienstdefinition
Die IMS-App registriert einen ImsService beim Framework, indem sie dem Manifest einen service
-Eintrag im folgenden Format hinzufügt:
<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>
Die service
-Definition in AndroidManifest.xml
definiert die folgenden Attribute, die für den ordnungsgemäßen Betrieb erforderlich sind:
directBootAware="true"
: Ermöglicht es, dass der Dienst vontelephony
erkannt und ausgeführt wird, bevor der Nutzer das Gerät entsperrt. Der Dienst kann nicht auf geräteverschlüsselte Speicher zugreifen, bevor der Nutzer das Gerät entsperrt. Weitere Informationen finden Sie unter Unterstützung des Direct Boot-Modus und Dateibasierte Verschlüsselung.persistent="true"
: Ermöglicht die dauerhafte Ausführung dieses Dienstes, der nicht vom System beendet wird, um Arbeitsspeicher freizugeben. Dieses Attribut funktioniert NUR, wenn die App als System-App erstellt wurde.permission="android.permission.BIND_IMS_SERVICE"
: Damit wird sichergestellt, dass nur ein Prozess, dem die BerechtigungBIND_IMS_SERVICE
gewährt wurde, an die App gebunden werden kann. So wird verhindert, dass eine schädliche App an den Dienst gebunden wird, da nur System-Apps vom Framework die Berechtigung erteilt werden kann.
Der Dienst muss außerdem das Element intent-filter
mit der Aktion android.telephony.ims.ImsService
angeben. Dadurch kann das Framework die ImsService
finden.
IMS-Funktionsspezifikation
Nachdem der ImsService in AndroidManifest.xml als Android-Dienst definiert wurde, muss der ImsService angeben, welche IMS-Funktionen er unterstützt. Android unterstützt derzeit die MmTel- und RCS-Funktionen. Allerdings ist nur MmTel in das Framework eingebunden. Obwohl keine RCS APIs in das Framework eingebunden sind, bietet es dennoch Vorteile, sie als Feature von ImsService zu deklarieren.
Im Folgenden finden Sie die gültigen, in android.telephony.ims.ImsFeature
definierten Funktionen, die ein ImsService bereitstellen kann, sowie eine Erklärung und ein Beispiel dafür, warum eine IMS-Anwendung eine oder alle dieser Funktionen implementieren sollte. Nachdem die einzelnen Funktionen definiert wurden, wird auf dieser Seite beschrieben, wie die ImsService
die Funktionen deklariert, die sie für den jeweiligen SIM-Steckplatz definiert.
FEATURE_MMTEL
Die ImsService
implementiert die IMS-MMTEL-Funktion, die Unterstützung für alle IMS-Medien (IR.92- und IR.94-Spezifikationen) enthält, mit Ausnahme der Notfallverknüpfung mit dem IMS-PDN für Notrufe. Jede Implementierung von ImsService
, die die MMTEL-Funktionen unterstützen soll, sollte die Basisklasse android.telephony.ims.MmTelFeature
erweitern und eine benutzerdefinierte MmTelFeature
-Implementierung in ImsService#createMmTelFeature
zurückgeben.
FEATURE_EMERGENCY_MMTEL
Durch die Deklaration dieser Funktion wird nur der Plattform signalisiert, dass ein Notfall an die IMS-PDN für Rettungsdienste angehängt werden kann. Wenn diese Funktion für ImsService
nicht deklariert ist, verwendet die Plattform für Rettungsdienste immer standardmäßig den Circuit Switch Fallback. Das Feature FEATURE_MMTEL
muss definiert werden, damit dieses Feature definiert werden kann.
FEATURE_RCS
Die ImsService API implementiert keine IMS-RCS-Funktionen, die Basisklasse android.telephony.ims.RcsFeature
kann aber dennoch nützlich sein. Das Framework verbindet sich automatisch mit dem ImsService und ruft ImsService#createRcsFeature
auf, wenn erkannt wird, dass das Paket RCS bereitstellen soll. Wenn die mit dem RCS-Dienst verknüpfte SIM-Karte entfernt wird, ruft das Framework automatisch RcsFeature#onFeatureRemoved
auf und bereinigt dann die mit der RCS-Funktion verknüpfte ImsService
. Diese Funktion kann einen Teil der benutzerdefinierten Erkennungs- oder Bindungslogik entfernen, die ein RCS-Feature andernfalls bereitstellen müsste.
Registrierung unterstützter Funktionen
Das Telefonie-Framework bindet sich zuerst an den ImsService, um die von ihm unterstützten Funktionen mithilfe der ImsService#querySupportedImsFeatures
API abzufragen. Nachdem das Framework berechnet hat, welche Features der ImsService unterstützt, wird für jede Funktion, für die der ImsService verantwortlich ist, ImsService#create[...]Feature
aufgerufen. Wenn sich die von der IMS-Anwendung unterstützten Features ändern, können Sie mit ImsService#onUpdateSupportedImsFeatures
signalisieren, dass das Framework die unterstützten Features neu berechnen soll. Weitere Informationen zur Initialisierung und Bindung des ImsService findest du im folgenden Diagramm.
Abbildung 2:ImsService-Initialisierung und -Bindung
Framework-Erkennung und ‑Überprüfung einer ImsService-Implementierung
Nachdem der ImsService in AndroidManifest.xml richtig definiert wurde, muss die Plattform so konfiguriert werden, dass sie bei Bedarf (sicher) an den ImsService gebunden wird. Es gibt zwei Arten von ImsServices, an die das Framework gebunden ist:
- ImsService vom Mobilfunkanbieter überschrieben: Diese ImsServices sind auf dem Gerät vorinstalliert, aber mit einem oder mehreren Mobilfunkanbietern verknüpft und werden nur dann gebunden, wenn eine passende SIM-Karte eingelegt wird. Dies wird mithilfe der
config_ims_mmtel_package_override_string
CarrierConfig-Schlüssel für ImsServices, die MMTEL-Funktionen implementieren.config_ims_rcs_package_override_string
für ImsServices, die RCS-Funktionen implementieren.
- „Standard“-ImsService des Geräts: Dies ist der Standard-ImsService, der vom OEM auf das Gerät geladen wird. Er sollte so konzipiert sein, dass IMS-Dienste in allen Situationen zur Verfügung gestellt werden, in denen der ImsService des Mobilfunkanbieters nicht verfügbar ist. Er ist nützlich in Situationen, in denen auf dem Gerät keine SIM-Karte eingelegt ist oder auf der eingelegten SIM-Karte kein ImsService des Mobilfunkanbieters installiert ist. Das wird im Geräte-Overlay mit den folgenden Konfigurationen definiert:
config_ims_mmtel_package
: Implementiert MMTEL-Funktionenconfig_ims_rcs_package
: Implementiert RCS-Funktionen
Android unterstützt keine Apps mit herunterladbaren ImsService-Implementierungen von Drittanbietern. Alle hier definierten ImsService-Implementierungen müssen daher System-Apps sein und sich im Ordner „/system/priv-app/“ oder „/product/priv-app/“ befinden, um die entsprechenden Berechtigungen (Telefon, Mikrofon, Standort, Kamera und Kontakte) zu gewähren. Durch die Überprüfung, ob der Paketname der IMS-Implementierung mit den oben definierten CarrierConfig- oder Geräte-Overlay-Werten übereinstimmt, werden nur vertrauenswürdige, vorinstallierte Apps gebunden.
Personalisierung
Apps, die einen ImsService implementieren, sind nur auf Geräten gebunden, auf denen sie als „Überschreibung“ des ImsService des Mobilfunkanbieters oder als „Standard“-ImsService-Konfiguration des Geräts für MMTEL- oder RCS-Funktionen konfiguriert sind.
Mit dem ImsService können die unterstützten IMS-Funktionen (MMTEL und RCS) auch dynamisch mithilfe von Updates mit der Methode ImsService#onUpdateSupportedImsFeatures
aktiviert oder deaktiviert werden. Dadurch wird das Framework veranlasst, neu zu berechnen, welche ImsServices gebunden sind und welche Funktionen sie unterstützen. Wenn die IMS-App das Framework aktualisiert und keine Funktionen unterstützt werden, wird die Bindung von ImsService aufgehoben, bis das Smartphone neu gestartet oder eine neue SIM-Karte eingelegt wird, die der IMS-App entspricht.
Bindungspriorität für mehrere ImsService
Das Framework kann die Bindung an alle möglichen ImsServices nicht unterstützen, die vorab auf dem Gerät geladen sind, und bindet bis zu zwei ImsServices pro SIM-Steckplatz (einen ImsService für jede Funktion) in der folgenden Reihenfolge pro Feature:
- Der ImsService-Paketname, der vom CarrierConfig-Wert
config_ims_[mmtel/rcs]_package_override_string
definiert wird, wenn eine SIM-Karte eingelegt ist. - Der ImsService-Paketname, der im Geräte-Overlay-Wert für
config_ims_[mmtel/rcs]_package
definiert ist, einschließlich des Falls, dass keine SIM-Karte eingelegt ist. Dieser ImsService MUSS die MmTel-Funktion für Notrufe unterstützen.
Der Paketname Ihres ImsService muss entweder in der CarrierConfig für jeden der Mobilfunkanbieter definiert sein, die dieses Paket verwenden, oder im Geräte-Overlay, wenn Ihr ImsService wie oben definiert standardmäßig verwendet werden soll.
Sehen wir uns das für die einzelnen Funktionen an. Bei einem Gerät (mit einer oder mehreren SIM-Karten), in dem eine einzige SIM-Karte eingelegt ist, sind zwei IMS-Funktionen möglich: MMTel und RCS. Das Framework versucht, die Bindung für jede Funktion in der oben definierten Reihenfolge vorzunehmen. Wenn die Funktion für den ImsService, der in der Überschreibung der Mobilfunkanbieterkonfiguration definiert ist, nicht verfügbar ist, wechselt das Framework zum Standard-ImsService. In der folgenden Tabelle wird beispielsweise beschrieben, welche IMS-Funktion das Framework verwendet, wenn drei IMS-Apps, die ImsServices implementieren, auf einem System mit den folgenden Funktionen installiert sind:
- ImsService von Mobilfunkanbieter A unterstützt RCS
- ImsService von Mobilfunkanbieter B unterstützt RCS und MMTel
- OEM ImsService unterstützt RCS und MMTel
SIM-Karte eingelegt | RCS-Funktion | MMTel-Funktion |
---|---|---|
Mobilfunkanbieter A | Mobilfunkanbieter A | OEM |
Transportunternehmen B | Transportunternehmen B | Transportunternehmen B |
Keine SIM-Karte | OEM | OEM |
Zertifizierungsstufe
Tools zur Überprüfung der IMS-Implementierung selbst sind nicht enthalten, da die IMS-Spezifikationen extrem groß sind und spezielle Prüfgeräte erfordern. Mit den Tests kann nur überprüft werden, ob das Telefonie-Framework richtig auf die ImsService API reagiert.
IMS-App entwickeln
Wenn Sie eine IMS-App entwickeln, die mit dem Android-Telefonie-Stack verbunden ist, sollten Sie angeben, dass die App den Status der ImsService-Instanz abhören oder ändern kann, die für ein bestimmtes Mobilfunktarif-Abo verknüpft ist.
Wenn Sie den Status von ImsService für MMTEL- und RCS-Funktionen abhören oder ändern möchten, verwenden Sie die Klasse ImsManager
, um eine Instanz der Klasse ImsMmTelManager
, ImsRcsManager
oder der IMS-spezifischen Klasse ProvisioningManager
abzurufen. Die App kann dann IMS-spezifische Dienst- und Bereitstellungsstatus abhören, z. B.:
- Aktivierte und verfügbare MMTEL- oder RCS-Funktionen
- Wird aktualisiert, wenn sich der IMS-Registrierungsstatus ändert
- Bereitstellungsstatus von IMS-Funktionen
- Vom Nutzer aktivierte IMS-Funktionen
ImsStateCallback verwenden
Obwohl ImsService ein dauerhaft gebundener Dienst ist, kann sich der gebundene Dienst ändern, wenn eine neue SIM-Karte oder ein eingebettetes Abo aktiv wird oder die Konfiguration des Mobilfunkanbieters geändert wird. Da ImsService nicht Teil des Telefonieprozesses ist, kann es bei einer App zu unerwarteten Ausnahmen beim Zugriff auf IMS APIs kommen, wenn ImsService aufgrund einer Abo- oder Konfigurationsänderung unsichtbar abstürzt oder nicht mehr verknüpft ist.
Auf Geräten mit Android 13 oder höher kann eine App die Klasse ImsStateCallback
verwenden, um zu prüfen, ob die ImsService-Instanz für ein verknüpftes Abo verfügbar ist oder nicht. Wenn eine Instanz von ImsMmTelManager
oder ImsRcsManager
abgerufen wird, empfehlen wir, dass sich die App zuerst mit ImsMmTelManager#registerImsStateCallback
oder ImsRcsManager#registerImsStateCallback
für einen IMS-Status-Callback registriert.
Damit Sie für bestimmte Abos weiterhin Callback-Updates erhalten, sobald ImsService wieder verfügbar ist, muss die App die Registrierung der über ImsMmTelManager
, ImsRcsManager
oder ProvisioningManager
registrierten Callbacks aufheben oder sie verwerfen und neue Callbacks registrieren.
Wenn es ein Abo gibt, das IMS nicht unterstützt, ruft das Framework ImsStateCallback#onUnavailable
mit dem Grund REASON_NO_IMS_SERVICE_CONFIGURED
auf.
Das bedeutet, dass ImsService und die IMS-bezogenen APIs für das Abo nicht verfügbar sind.
Im unwahrscheinlichen Fall, dass der Telefonieprozess abstürzt, erhält die App ImsStateCallback#onError
und keine Updates mehr über die registrierte ImsStateCallback
-Instanz.
Wenn Sie diesen Zustand wiederherstellen möchten, registrieren Sie die Instanz ImsStateCallback
noch einmal für das zugehörige Abo. Rufen Sie dazu ImsMmTelManager#registerImsStateCallback
oder ImsRcsManager#registerImsStateCallback
auf.