IMS implementieren

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.

ImsService – Übersicht

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 Aktion android.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 von telephony 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 Berechtigung BIND_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.

ImsService-Initialisierung und -Bindung

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:

  1. 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
  2. „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:

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:

  1. Der ImsService-Paketname, der vom CarrierConfig-Wert config_ims_[mmtel/rcs]_package_override_string definiert wird, wenn eine SIM-Karte eingelegt ist.
  2. 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.