IMS implementieren

In Android 9 wird eine SystemApi-Schnittstelle namens ImsService eingeführt, mit der Sie das IP Multimedia Subsystem (IMS) implementieren können. Die ImsService API ist eine genau definierte Schnittstelle zwischen der Android-Plattform und einer vom Anbieter oder Mobilfunkanbieter bereitgestellten IMS-Implementierung.

ImsService – Übersicht

Abbildung 1 : Übersicht über ImsService

Über die ImsService-Schnittstelle kann der IMS-Implementierer der Plattform wichtige Signalisierungsinformationen bereitstellen, 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. Das bedeutet, dass sie direkt mit dem Android SDK und nicht mit dem Quellcode erstellt werden kann. Eine auf dem Gerät vorinstallierte IMS-App kann auch so konfiguriert werden, dass sie über den Google Play Store aktualisiert werden kann.

Beispiele und Quelle

Android bietet eine App auf AOSP, die Teile der ImsService API für Test- und Entwicklungszwecke implementiert. Sie finden die App unter /testapps/ImsTestService.

Die Dokumentation zur ImsService API finden Sie unter ImsService und in den anderen Klassen in der API.

Implementierung

Die ImsService API ist eine API auf hoher Ebene, mit der Sie IMS auf viele Arten implementieren können, je nach verfügbarer Hardware. Die Implementierung ändert sich beispielsweise je nachdem, ob die IMS-Implementierung vollständig auf dem App-Prozessor erfolgt oder teilweise oder vollständig auf das Modem ausgelagert wird. Android bietet keine öffentliche HAL für das Auslagern auf den Basisbandprozessor. Daher muss jede Auslagerung über Ihre HAL-Erweiterung auf das Modem erfolgen.

Kompatibilität mit älteren IMS-Implementierungen

Android 9 enthält zwar die ImsService API, Geräte mit einer älteren Implementierung für IMS können die API jedoch nicht unterstützen. Für diese Geräte wurden die älteren AIDL-Schnittstellen und Wrapper-Klassen in den Namespace android.telephony.ims.compat verschoben. Beim Upgrade auf Android 9 müssen ältere Geräte Folgendes tun, um die Unterstützung der älteren API fortzusetzen.

  • Ändern Sie den Namespace der ImsService-Implementierung, um ihn von der android.telephony.ims.compat-Namespace-API zu erweitern.
  • Ändern Sie die ImsService-Dienstdefinition in AndroidManifest.xml, um die Intent-Filteraktion android.telephony.ims.compat.ImsService anstelle der Aktion android.telephony.ims.ImsService zu verwenden.

Das Framework bindet dann mithilfe der in Android 9 bereitgestellten Kompatibilitätsschicht an ImsService, um mit der Legacy-Implementierung ImsService zu arbeiten.

ImsService-Registrierung beim Framework

Die ImsService API wird als Dienst implementiert, an den das Android-Framework gebunden ist, um mit der IMS-Implementierung zu kommunizieren. Es sind drei Schritte erforderlich, um eine App, die einen ImsService implementiert, beim Framework zu registrieren. Zuerst 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 einen service-Eintrag im Manifest 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 korrekten Betrieb erforderlich sind:

  • directBootAware="true": Ermöglicht es dem Telefondienst, den Dienst zu erkennen und auszuführen, bevor der Nutzer das Gerät entsperrt.telephony Der Dienst kann nicht auf den auf dem Gerät verschlüsselten Speicher zugreifen, bevor der Nutzer das Gerät entsperrt. Weitere Informationen finden Sie unter Direct-Boot-Modus unterstützen und dateibasierte Verschlüsselung.
  • persistent="true": Sorgt dafür, dass der Dienst dauerhaft ausgeführt wird, ohne vom System beendet zu werden, um Speicher freizugeben. Dieses Attribut funktioniert NUR, wenn die App als System-App erstellt wird.
  • permission="android.permission.BIND_IMS_SERVICE": Sorgt dafür, dass nur ein Prozess, dem die Berechtigung BIND_IMS_SERVICE erteilt 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 erhalten können.

Der Dienst muss auch das Element intent-filter mit der Aktion android.telephony.ims.ImsService angeben. So kann das Framework den ImsService finden.

IMS-Funktionsspezifikation

Nachdem ImsService in AndroidManifest.xml als Android-Dienst definiert wurde, muss ImsService definieren, welche IMS-Funktionen er unterstützt. Android unterstützt derzeit die MmTel- und RCS-Funktionen, aber nur MmTel ist in das Framework integriert. Obwohl keine RCS-APIs in das Framework integriert sind, hat es dennoch Vorteile, sie als Funktion von ImsService zu deklarieren.

Im Folgenden sind die gültigen Funktionen definiert, die in android.telephony.ims.ImsFeature definiert sind und die ein ImsService bereitstellen kann. Außerdem finden Sie eine Erklärung und ein Beispiel dafür, warum eine IMS-App eine oder alle dieser Funktionen implementieren sollte. Nachdem jede Funktion definiert wurde, wird auf dieser Seite beschrieben, wie der ImsService die Gruppe von Funktionen deklariert, die er für jeden SIM-Kartensteckplatz definiert.

FEATURE_MMTEL

Der ImsService implementiert die IMS MMTEL-Funktion, die alle IMS-Medien (Spezifikationen IR.92 und IR.94) unterstützt, mit Ausnahme der Notfallverbindung zum IMS PDN für Notrufe. Jede Implementierung von ImsService, die die MMTEL-Funktionen unterstützen soll, muss die android.telephony.ims.MmTelFeature Basisklasse erweitern und eine benutzerdefinierte MmTelFeature Implementierung in ImsService#createMmTelFeature zurückgeben.

FEATURE_EMERGENCY_MMTEL

Durch die Deklaration dieser Funktion wird der Plattform nur signalisiert, dass eine Notfallverbindung zum IMS PDN für Notdienste möglich ist. Wenn diese Funktion für Ihren ImsService nicht deklariert ist, verwendet die Plattform für Notdienste immer Circuit Switch Fallback. Die Funktion FEATURE_MMTEL muss definiert sein, damit diese Funktion definiert werden kann.

FEATURE_RCS

Die ImsService API implementiert keine IMS RCS-Funktionen, aber die Basisklasse android.telephony.ims.RcsFeature kann dennoch nützlich sein. Das Framework bindet automatisch an ImsService und ruft ImsService#createRcsFeature auf, wenn es erkennt, 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 den ImsService, der mit der RCS-Funktion verknüpft ist. 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 Telephony-Framework bindet zuerst an ImsService, um die unterstützten Funktionen mit der ImsService#querySupportedImsFeatures API abzufragen. Nachdem das Framework berechnet hat, welche Funktionen von ImsService unterstützt werden, ruft es für jede Funktion, für die ImsService verantwortlich ist, ImsService#create[...]Feature auf. Wenn sich die von der IMS-App unterstützten Funktionen ändern, können Sie mit ImsService#onUpdateSupportedImsFeatures signalisieren, dass das Framework die unterstützten Funktionen neu berechnen soll. Weitere Informationen zur Initialisierung und Bindung von ImsService finden Sie im folgenden Diagramm.

ImsService wird initialisiert und gebunden

Abbildung 2 : ImsService-Initialisierung und -Bindung

Framework-Erkennung und -Bestätigung einer ImsService-Implementierung

Nachdem ImsService in AndroidManifest.xml korrekt definiert wurde, muss die Plattform so konfiguriert werden, dass sie bei Bedarf (sicher) an ImsService gebunden wird. Es gibt zwei Arten von ImsServices, an die das Framework gebunden ist:

  1. Mobilfunkanbieter-Override-ImsService: Diese ImsServices sind auf dem Gerät vorinstalliert, aber an einen oder mehrere Mobilfunkanbieter gebunden und werden nur gebunden, wenn eine passende SIM-Karte eingelegt ist. Dies wird mit folgenden Konfigurationen konfiguriert:
  2. Geräte-Standard-ImsService: Dies ist der Standard-ImsService, der von einem OEM auf das Gerät geladen wird. Er sollte so konzipiert sein, dass er IMS-Dienste in allen Situationen bereitstellt, in denen kein Mobilfunkanbieter-ImsService verfügbar ist. Das ist nützlich, wenn keine SIM-Karte eingelegt ist oder die eingelegte SIM-Karte keinen Mobilfunkanbieter-ImsService installiert hat. Dies wird im Geräte-Overlay mit den folgenden Konfigurationen definiert:

Android unterstützt keine Apps mit herunterladbaren ImsService-Implementierungen von Drittanbietern. Daher müssen alle hier definierten ImsService-Implementierungen System-Apps sein und sich im Ordner „/system/priv-app/“ oder „/product/priv-app/“ befinden, um die entsprechenden Berechtigungen zu erteilen (nämlich Telefon-, Mikrofon-, Standort-, Kamera- und Kontaktberechtigungen). Wenn Sie prüfen, ob der Paketname der IMS-Implementierung mit den oben definierten CarrierConfig- oder Geräte-Overlay-Werten übereinstimmt, werden nur vertrauenswürdige, vorinstallierte Apps gebunden.

Anpassung

Apps, die einen ImsService implementieren, werden nur auf Geräten gebunden, auf denen sie als Mobilfunkanbieter-Override-ImsService oder Geräte-Standard-ImsService-Konfigurationen für MMTEL- oder RCS-Funktionen konfiguriert sind. Mit ImsService können die unterstützten IMS-Funktionen (MMTEL und RCS) auch dynamisch über Updates mit der Methode ImsService#onUpdateSupportedImsFeatures aktiviert oder deaktiviert werden. Dadurch wird das Framework ausgelöst, um 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 die Bindung von ImsService aufgehoben, bis das Telefon neu gestartet oder eine neue SIM-Karte eingelegt wird, die mit der IMS-App übereinstimmt.

Bindungspriorität für mehrere ImsServices

Das Framework kann nicht an alle möglichen ImsServices gebunden werden, die auf dem Gerät vorinstalliert sind. Es wird pro SIM-Kartensteckplatz an bis zu zwei ImsServices gebunden (ein ImsService für jede Funktion) und zwar in der folgenden Reihenfolge pro Funktion:

  1. Der ImsService-Paketname, der durch den 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 Emergency MmTel-Funktion unterstützen.

Sie müssen entweder den Paketnamen Ihres ImsService in der CarrierConfig für jeden Mobilfunkanbieter definieren, der dieses Paket verwendet, oder im Geräte-Overlay, wenn Ihr ImsService wie oben definiert der Standard sein soll.

Sehen wir uns das für jede Funktion an. Für ein Gerät (mit einer oder mehreren SIM-Karten) mit einer einzelnen SIM-Karte sind zwei IMS-Funktionen möglich: MMTel und RCS. Das Framework versucht, die Bindung in der oben definierten Reihenfolge für jede Funktion herzustellen. Wenn die Funktion für den in der CarrierConfig-Override definierten ImsService nicht verfügbar ist, greift das Framework auf Ihren Standard-ImsService zurück. 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:

  • Der ImsService von Mobilfunkanbieter A unterstützt RCS.
  • Der ImsService von Mobilfunkanbieter B unterstützt RCS und MMTel.
  • Der ImsService des OEM 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

Validierung

Tools zum Überprüfen der IMS-Implementierung selbst sind nicht enthalten, da die IMS-Spezifikationen sehr umfangreich sind und spezielle Überprüfungsgeräte verwendet werden. Mit den Tests kann nur überprüft werden, ob das Telephony-Framework ordnungsgemäß auf die ImsService API reagiert.

IMS-App entwickeln

Wenn Sie eine IMS-App entwickeln, die mit dem Android-Telephony-Stack interagiert, empfehlen wir, anzugeben, dass die App den Status der ImsService-Instanz, die für ein bestimmtes Mobilfunkanbieter-Abo angehängt ist, abhören oder ändern kann.

Wenn Sie den Status von ImsService für MMTEL- und RCS-Funktionen abhören oder ändern möchten, verwenden Sie die ImsManager Klasse, um eine Instanz der ImsMmTelManager, ImsRcsManager, oder IMS-spezifischen ProvisioningManager Klasse abzurufen. Die App kann dann IMS-spezifische Dienst- und Bereitstellungsstatus abhören, z. B.:

  • Aktivierte und verfügbare MMTEL- oder RCS-Funktionen
  • Updates, 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 neues eingebettetes Abo aktiviert wird oder wenn sich eine Mobilfunkanbieterkonfiguration ändert. Da ImsService nicht Teil des Telephony-Prozesses ist, können bei einer App unerwartete Ausnahmen auftreten, wenn sie versucht, auf IMS-APIs zuzugreifen, wenn ImsService unbemerkt abstürzt oder die Bindung aufgrund einer Abo- oder Konfigurationsänderung aufgehoben wird.

Auf Geräten mit Android 13 oder höher kann eine App die ImsStateCallback Klasse verwenden, um zu prüfen, ob die ImsService-Instanz für ein zugehöriges Abo verfügbar ist. Wenn Sie eine Instanz von ImsMmTelManager oder ImsRcsManager abrufen, empfehlen wir, dass sich die App zuerst für einen IMS-Status-Callback mit ImsMmTelManager#registerImsStateCallback oder ImsRcsManager#registerImsStateCallback registriert. Wenn die App weiterhin Callback-Updates für bestimmte Abos erhalten soll, wenn ImsService wieder verfügbar ist, muss sie die Registrierung vorhandener Callbacks aufheben oder sie verwerfen, die über ImsMmTelManager, ImsRcsManager oder ProvisioningManager registriert wurden, und neue Callbacks registrieren.

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 Telephony-Prozess abstürzt, erhält die App ImsStateCallback#onError und erhält keine Updates mehr für die registrierte ImsStateCallback Instanz. Um diesen Zustand zu beheben, registrieren Sie die ImsStateCallback-Instanz für das zugehörige Abo neu, indem Sie ImsMmTelManager#registerImsStateCallback oder ImsRcsManager#registerImsStateCallback aufrufen.