IMS implementieren

In Android 9 wird die 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 ebenfalls eine Android-System-API. Sie kann also direkt auf dem Android SDK statt auf der 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 der API.

Implementierung

Die ImsService API ist eine API der höheren Ebene, 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 Aktion android.telephony.ims.compat.ImsService „Intent-Filter“ 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 arbeiten.

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 im Framework 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 den vom Gerät verschlüsselten 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": Dieser Dienst kann dauerhaft ausgeführt werden und wird vom System nicht zum Zurückfordern von Arbeitsspeicher beendet. 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 intent-filter-Element mit der Aktion android.telephony.ims.ImsService angeben. So 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, aber nur MmTel ist in das Framework eingebunden. Auch wenn keine RCS APIs in das Framework eingebunden sind, bietet es dennoch Vorteile, sie als Funktion des ImsService zu deklarieren.

Unten finden Sie die in android.telephony.ims.ImsFeature definierten gültigen Funktionen, die ein ImsService bereitstellen kann, sowie eine Erklärung und ein Beispiel dafür, warum eine IMS-App eine oder alle diese Funktionen implementieren sollte. Nachdem jede Funktion definiert wurde, wird auf dieser Seite beschrieben, wie die ImsService die Funktionen deklariert, die sie für jeden SIM-Slot 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 Deklarierung dieser Funktion wird der Plattform lediglich mitgeteilt, dass eine Notfallverknüpfung mit dem IMS-PDN für Rettungsdienste möglich ist. Wenn diese Funktion für Ihre ImsService nicht deklariert ist, verwendet die Plattform standardmäßig den Fallback über den Schaltkreis für Notdienste. Die Funktion FEATURE_MMTEL muss definiert sein, damit diese Funktion 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 bindet sich automatisch an den ImsService und ruft ImsService#createRcsFeature auf, wenn es erkennt, dass das Paket RCS bereitstellen sollte. 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. Mit dieser Funktion kann ein Teil der benutzerdefinierten Erkennungs- oder Bindungslogik entfernt werden, die eine RCS-Funktion sonst 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 Funktionen der ImsService unterstützt, ruft es ImsService#create[...]Feature für jede Funktion auf, für die der ImsService verantwortlich ist. Wenn sich die von der IMS-App unterstützten Funktionen ändern, kannst du mit ImsService#onUpdateSupportedImsFeatures dem Framework signalisieren, die unterstützten Funktionen neu zu berechnen. Weitere Informationen zur Initialisierung und Bindung des ImsService finden Sie 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 mit dem
  2. „Standard“-ImsService des Geräts: Dies ist der Standard-ImsService, der von einem 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 eines 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 Aktualisierungen 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 ohne unterstützte Funktionen aktualisiert, wird der ImsService erst wieder verknüpft, wenn das Smartphone neu gestartet oder eine neue SIM-Karte eingelegt wird, die mit der IMS-App übereinstimmt.

Bindungspriorität für mehrere ImsService

Das Framework kann nicht die Bindung an alle möglichen ImsServices unterstützen, die auf dem Gerät vorinstalliert sind. Es wird pro SIM-Slot (ein ImsService pro Funktion) in der folgenden Reihenfolge an bis zu zwei ImsServices gebunden:

  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 jede Funktion genauer 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
Mobilfunkanbieter B Mobilfunkanbieter B Mobilfunkanbieter 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

ImsService ist zwar ein dauerhaft gebundener Dienst, der gebundene Dienst kann sich jedoch ändern, wenn eine neue SIM-Karte oder ein eingebettetes Abo aktiviert wird oder sich die Konfiguration des Mobilfunkanbieters ändert. 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 die App nach der Wiederverfügbarkeit von ImsService weiterhin Rückrufaktualisierungen für bestimmte Abos erhält, müssen vorhandene Callbacks, die über ImsMmTelManager, ImsRcsManager oder ProvisioningManager registriert wurden, abgemeldet oder verworfen und neue Callbacks registriert werden.

Wenn ein Abo 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. Um diesen Zustand zu beheben, registrieren Sie die ImsStateCallback-Instanz für das zugehörige Abo noch einmal, indem Sie ImsMmTelManager#registerImsStateCallback oder ImsRcsManager#registerImsStateCallback aufrufen.