IMS implementieren

Android 9 führt eine neue SystemApi-Schnittstelle namens ImsService ein, die Sie bei der Implementierung des IP Multimedia Subsystems (IMS) unterstützt. Die ImsService-API ist eine klar definierte Schnittstelle zwischen der Android-Plattform und einer vom Anbieter oder Netzbetreiber bereitgestellten IMS-Implementierung.

ImsService-Übersicht

Abbildung 1. ImsService-Übersicht

Durch die Verwendung der ImsService-Schnittstelle kann der IMS-Implementierer der Plattform wichtige Signalisierungsinformationen bereitstellen, z. B. IMS-Registrierungsinformationen, SMS-über-IMS-Integration und MmTel-Funktionsintegration, um Sprach- und Videoanrufe bereitzustellen. Die ImsService-API ist ebenfalls eine Android-System-API, was bedeutet, dass sie direkt mit dem Android SDK statt mit der Quelle erstellt werden kann. Eine auf dem Gerät vorinstallierte IMS-Anwendung kann auch so konfiguriert werden, dass sie über den Play Store aktualisierbar ist.

Beispiele und Quelle

Android stellt auf AOSP eine Anwendung bereit, die Teile der ImsService-API zu Test- und Entwicklungszwecken implementiert. Sie finden die Anwendung unter /testapps/ImsTestService .

Die Dokumentation für die ImsService-API finden Sie in ImsService und in den anderen Klassen der API.

Implementierung

Die ImsService-API ist eine High-Level-API, mit der Sie IMS je nach verfügbarer Hardware auf viele Arten implementieren können. Die Implementierung ändert sich beispielsweise abhängig davon, ob sich die IMS-Implementierung vollständig auf dem Anwendungsprozessor befindet oder ob sie teilweise oder vollständig auf das Modem verlagert wird. Android stellt kein öffentliches HAL für die Auslagerung auf den Basisbandprozessor bereit, daher muss jede Auslagerung über Ihre HAL-Erweiterung zum Modem erfolgen.

Kompatibilität mit älteren IMS-Implementierungen

Obwohl Android 9 die ImsService-API enthält, können Geräte, die eine ältere Implementierung für IMS verwenden, 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. Beim Upgrade auf Android 9 müssen ältere Geräte Folgendes tun, um die Unterstützung der älteren API weiterhin zu gewährleisten.

  • Ändern Sie den Namespace der ImsService-Implementierung, um ihn von der Namespace-API android.telephony.ims.compat zu erweitern.
  • Ändern Sie die ImsService-Dienstdefinition in AndroidManifest.xml, um die Intent-Filter-Aktion 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 den ImsService, um mit der älteren ImsService Implementierung zu arbeiten.

ImsService-Registrierung mit dem Framework

Die ImsService-API ist als Dienst implementiert, an den sich das Android-Framework bindet, um mit der IMS-Implementierung zu kommunizieren. Drei Schritte sind erforderlich, um eine Anwendung zu registrieren, die einen ImsService beim Framework implementiert. Zunächst muss sich die ImsService-Implementierung mithilfe der AndroidManifest.xml der Anwendung bei der Plattform registrieren. Zweitens muss definiert werden, welche IMS-Funktionen die Implementierung unterstützt (MmTel oder RCS). und drittens muss es entweder in der Trägerkonfiguration oder im Geräte-Overlay als vertrauenswürdige IMS-Implementierung verifiziert werden.

Dienstdefinition

Die IMS-Anwendung registriert einen ImsService beim Framework, indem sie dem Manifest einen service 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 in AndroidManifest.xml definiert die folgenden Attribute, die für den korrekten Betrieb erforderlich sind:

  • directBootAware="true" : Ermöglicht die Erkennung und Ausführung des Dienstes per telephony , bevor der Benutzer das Gerät entsperrt. Der Dienst kann nicht auf den verschlüsselten Speicher des Geräts zugreifen, bevor der Benutzer das Gerät entsperrt. Weitere Informationen finden Sie unter Unterstützung des Direktstartmodus und der dateibasierten Verschlüsselung .
  • persistent="true" : Ermöglicht, dass dieser Dienst dauerhaft ausgeführt wird und nicht vom System beendet wird, um Speicher zurückzugewinnen. Dieses Attribut funktioniert NUR, wenn die Anwendung als Systemanwendung erstellt wurde.
  • permission="android.permission.BIND_IMS_SERVICE" : Stellt sicher, dass nur ein Prozess, dem die BIND_IMS_SERVICE Berechtigung erteilt wurde, eine Bindung zur Anwendung herstellen kann. Dies verhindert, dass sich eine betrügerische App an den Dienst bindet, da nur Systemanwendungen die Berechtigung vom Framework erteilt werden kann.

Der Dienst muss außerdem das intent-filter Element mit der Aktion android.telephony.ims.ImsService angeben. Dadurch kann das Framework den ImsService finden.

IMS-Funktionsspezifikation

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

Nachfolgend 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-Anwendung eine oder alle dieser Funktionen implementieren möchte. Nachdem jede Funktion definiert wurde, wird auf dieser Seite beschrieben, wie der ImsService den Satz von Funktionen deklariert, die er für jeden SIM-Steckplatz definiert.

FEATURE_MMTEL

Der 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 Notfallverbindung zum IMS-PDN für Notrufe. Jede Implementierung von ImsService , die die MMTEL-Funktionen unterstützen möchte, 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 der Plattform nur signalisiert, dass eine Notfallverbindung zum IMS-PDN für Notfalldienste möglich ist. Wenn diese Funktion nicht für Ihren ImsService deklariert ist, verwendet die Plattform für Notfalldienste immer standardmäßig den Circuit Switch Fallback. Damit diese Funktion definiert werden kann, muss die Funktion FEATURE_MMTEL definiert sein.

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 sich 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 mit der RCS-Funktion verknüpften ImsService . Diese Funktionalität kann einen Teil der benutzerdefinierten Erkennungs-/Bindungslogik entfernen, die eine RCS-Funktion andernfalls bereitstellen müsste.

Registrierung unterstützter Funktionen

Das Telefonie-Framework stellt zunächst eine Bindung an den ImsService her, 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-Anwendung unterstützten Features ändern, können Sie ImsService#onUpdateSupportedImsFeatures verwenden, um dem Framework zu signalisieren, unterstützte Features neu zu berechnen. Weitere Informationen zur Initialisierung und Bindung des ImsService finden Sie im Diagramm unten.

ImsService wird initialisiert und gebunden

Abbildung 2: ImsService-Initialisierung und -Bindung

Framework-Erkennung und Überprüfung einer ImsService-Implementierung

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

  1. ImsService „überschreiben“ des Mobilfunkanbieters: 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 wird. Dies wird mit konfiguriert
  2. „Standard“-ImsService des Geräts: Dies ist der Standard-ImsService, der von einem OEM auf das Gerät geladen wird und so konzipiert sein sollte, dass er IMS-Dienste in allen Situationen bereitstellt, in denen ein ImsService eines Mobilfunkanbieters nicht verfügbar ist, und in Situationen nützlich ist, in denen das Gerät keine SIM-Karte hat eingelegt oder auf der eingelegten SIM-Karte ist kein Mobilfunkanbieter ImsService installiert. Dies wird im Geräte-Overlay über die folgenden Konfigurationen definiert:

Android unterstützt keine Apps mit herunterladbaren ImsService-Implementierungen von Drittanbietern. Daher müssen alle hier definierten ImsService-Implementierungen Systemanwendungen sein und sich im Ordner /system/priv-app/ oder /product/priv-app/ befinden, um die entsprechenden Berechtigungen zu gewähren Berechtigungen (nämlich Telefon-, Mikrofon-, Standort-, Kamera- und Kontaktberechtigungen). 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 Anwendungen gebunden.

Anpassung

Anwendungen, die einen ImsService implementieren, sind nur an Geräte gebunden, auf denen sie als „Carrier-Override“-ImsService oder Geräte-„Standard“-ImsService-Konfigurationen für MMTEL- oder RCS-Funktionalität konfiguriert sind. Der ImsService ermöglicht auch die dynamische Aktivierung oder Deaktivierung der von ihm unterstützten IMS-Funktionen (MMTEL und RCS) über Updates mithilfe der ImsService#onUpdateSupportedImsFeatures -Methode. Dadurch wird das Framework veranlasst, neu zu berechnen, welche ImsServices gebunden sind und welche Funktionen sie unterstützen. Wenn die IMS-Anwendung das Framework aktualisiert, ohne dass Funktionen unterstützt werden, wird die Bindung des ImsService aufgehoben, bis das Telefon neu gestartet oder eine neue SIM-Karte eingelegt wird, die der IMS-Anwendung entspricht.

Bindungspriorität für mehrere ImsService

Das Framework kann die Bindung an alle möglichen ImsServices, die auf dem Gerät vorinstalliert sind, nicht unterstützen und bindet an bis zu zwei ImsServices pro SIM-Steckplatz (ein ImsService für jede Funktion) 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 Falles, in dem keine SIM-Karte eingelegt ist. Dieser ImsService MUSS die Notfall-MmTel-Funktion unterstützen.

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

Lassen Sie uns dies für jede Funktion aufschlüsseln. Für ein Gerät (Einzel- oder Mehrfach-SIM) mit einer einzigen geladenen SIM-Karte sind zwei IMS-Funktionen möglich: MMTel und RCS. Das Framework versucht, in der oben für jede Funktion definierten Reihenfolge eine Bindung herzustellen. Wenn die Funktion für den in der Carrier-Konfigurationsüberschreibung 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 verwenden wird, wenn drei IMS-Anwendungen vorhanden sind, die ImsServices implementieren und auf einem System mit den folgenden Funktionen installiert sind:

  • Carrier A ImsService unterstützt RCS
  • Carrier B ImsService unterstützt RCS und MMTel
  • OEM ImsService unterstützt RCS und MMTel
SIM-Karte eingelegt RCS-Funktion MMTel-Funktion
Träger A Träger A OEM
Träger B Träger B Träger B
Keine SIM-Karte OEM OEM

Validierung

Werkzeuge zur Verifizierung der IMS-Implementierung selbst sind nicht enthalten, da die IMS-Spezifikationen extrem umfangreich sind und spezielle Verifizierungsgeräte verwenden. Die Tests können nur überprüfen, ob das Telefonie-Framework ordnungsgemäß auf die ImsService-API reagiert.

Entwickeln Sie eine IMS-App

Bei der Entwicklung einer IMS-App, die mit dem Android-Telefonie-Stack interagiert, empfehlen wir anzugeben, dass die App den Status der ImsService-Instanz abhören oder ändern kann, die für ein bestimmtes Mobilfunkanbieterabonnement angehängt ist.

Um den Status von ImsService für MMTEL- und RCS-Funktionen abzuhören oder zu ändern, 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 Bereitstellungszustände abhören, wie zum Beispiel:

  • MMTEL- oder RCS-Funktionen, die aktiviert und verfügbar sind
  • Wird aktualisiert, wenn sich der IMS-Registrierungsstatus ändert
  • Bereitstellungsstatus der IMS-Funktionen
  • IMS-Funktionen, die der Benutzer aktiviert hat

Verwenden Sie ImsStateCallback

Obwohl ImsService ein dauerhaft gebundener Dienst ist, kann sich der gebundene Dienst ändern, wenn eine neue SIM-Karte oder ein integriertes Abonnement aktiv wird oder wenn sich die Konfiguration eines Netzbetreibers ändert. Da ImsService nicht Teil des Telefonieprozesses ist, kann es bei einer App zu unerwarteten Ausnahmen kommen, wenn versucht wird, auf IMS-APIs zuzugreifen, wenn ImsService aufgrund eines Abonnements oder einer Konfigurationsänderung unsichtbar abstürzt oder die Bindung aufgehoben wird.

Auf Geräten mit Android 13 oder höher kann eine App die ImsStateCallback Klasse verwenden, um zu überwachen, ob die ImsService-Instanz für ein zugehöriges Abonnement verfügbar oder nicht verfügbar ist. Wenn Sie eine Instanz von ImsMmTelManager oder ImsRcsManager abrufen, empfehlen wir, dass sich die App zunächst mit ImsMmTelManager#registerImsStateCallback oder ImsRcsManager#registerImsStateCallback für einen IMS-Statusrückruf registriert. Um weiterhin Rückrufaktualisierungen für bestimmte Abonnements zu erhalten, wenn ImsService wieder verfügbar ist, muss die App die Registrierung aufheben oder vorhandene Rückrufe verwerfen, die über ImsMmTelManager , ImsRcsManager oder ProvisioningManager registriert wurden. und neue Rückrufe registrieren.

Wenn es ein Abonnement 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 Abonnement nicht verfügbar sind.

Im unwahrscheinlichen Fall, dass der Telefonieprozess abstürzt, empfängt 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 erneut für das zugehörige Abonnement, indem Sie ImsMmTelManager#registerImsStateCallback oder ImsRcsManager#registerImsStateCallback aufrufen.