Implementierung von IMS

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, wie 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, d. h. sie kann direkt gegen das Android-SDK anstatt gegen die Quelle erstellt werden. Eine auf dem Gerät vorinstallierte IMS-Anwendung kann auch so konfiguriert werden, dass sie für den Play Store aktualisierbar ist.

Beispiele und Quelle

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

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

Implementierung

Die ImsService-API ist eine High-Level-API, mit der Sie IMS je nach verfügbarer Hardware auf vielfältige Weise implementieren können. Beispielsweise ändert sich die Implementierung in Abhängigkeit davon, ob sich die IMS-Implementierung vollständig auf dem Anwendungsprozessor befindet oder ob sie teilweise oder vollständig auf das Modem ausgelagert wird. Android stellt keine öffentliche 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 . 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 so, dass er von der android.telephony.ims.compat Namespace-API erweitert wird.
  • Ändern Sie die ImsService-Dienstdefinition in AndroidManifest.xml so, dass die Absichtsfilteraktion android.telephony.ims.compat.ImsService anstelle der Aktion android.telephony.ims.ImsService .

Das Framework wird dann mithilfe der in Android 9 bereitgestellten Kompatibilitätsebene an den ImsService gebunden, um mit der Legacy ImsService Implementierung zu arbeiten.

ImsService-Registrierung mit dem Framework

Die ImsService-API wird als Dienst implementiert, an den sich das Android-Framework bindet, um mit der IMS-Implementierung zu kommunizieren. Drei Schritte sind notwendig, um eine Anwendung zu registrieren, die einen ImsService mit dem Framework implementiert. Zunächst muss sich die ImsService-Implementierung mithilfe der AndroidManifest.xml der Anwendung bei der Plattform registrieren. zweitens muss es definieren, welche IMS-Merkmale die Implementierung unterstützt (MmTel oder RCS); und drittens muss es als vertrauenswürdige IMS-Implementierung entweder in der Trägerkonfiguration oder im Geräte-Overlay 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 das Erkennen und Ausführen des Dienstes per telephony , bevor der Benutzer das Gerät entsperrt. Der Dienst kann nicht auf den verschlüsselten Gerätespeicher zugreifen, bevor der Benutzer das Gerät entsperrt. Weitere Informationen finden Sie unter Unterstützung des direkten Startmodus 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ückzufordern. 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 Berechtigung BIND_IMS_SERVICE gewährt wurde, eine Bindung zur Anwendung herstellen kann. Dadurch wird verhindert, dass sich eine Rogue-App an den Dienst bindet, da nur Systemanwendungen die Berechtigung durch das Framework erteilt werden kann.

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

IMS-Funktionsspezifikation

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

Nachfolgend finden Sie die in android.telephony.ims.ImsFeature definierten gültigen Funktionen, die ein ImsService bereitstellen kann, sowie eine Erläuterung und ein Beispiel dafür, warum eine IMS-Anwendung eine oder alle dieser Funktionen implementieren möchte. Nachdem jedes Feature definiert wurde, beschreibt diese Seite, wie der ImsService den Satz von Features deklariert, die er für jeden SIM-Steckplatz definiert.

FEATURE_MMTEL

Der ImsService implementiert das IMS MMTEL-Merkmal, das Unterstützung für alle IMS-Medien (IR.92- und IR.94-Spezifikationen) enthält, mit Ausnahme von Notrufen an das IMS-PDN für Notrufe. Jede Implementierung von ImsService , die die MMTEL-Funktionen unterstützen möchte, sollte die android.telephony.ims.MmTelFeature erweitern und eine benutzerdefinierte MmTelFeature Implementierung in ImsService#createMmTelFeature .

FEATURE_EMERGENCY_MMTEL

Das Deklarieren dieser Funktion signalisiert der Plattform nur, dass eine Notfallverbindung mit dem IMS-PDN für Notfalldienste möglich ist. Wenn diese Funktion nicht für Ihren ImsService deklariert ist, verwendet die Plattform immer standardmäßig Circuit Switch Fallback für Notdienste. Das Merkmal FEATURE_MMTEL muss definiert werden, damit dieses Merkmal definiert werden kann.

FEATURE_RCS

Die ImsService-API implementiert keine IMS-RCS-Funktionen, aber die android.telephony.ims.RcsFeature kann dennoch nützlich sein. Das Framework bindet sich automatisch an ImsService und ruft ImsService#createRcsFeature , 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 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 ansonsten bereitstellen müsste.

Registrierung von unterstützten Funktionen

Das Telefonie-Framework bindet zuerst an den ImsService, um die unterstützten Funktionen mithilfe der ImsService#querySupportedImsFeatures API abzufragen. Nachdem das Framework berechnet hat, welche Funktionen der ImsService unterstützen wird, ruft es ImsService#create[...]Feature für jede Funktion auf, für die der ImsService verantwortlich sein wird. 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 folgenden Diagramm.

ImsService wird initialisiert und gebunden

Abbildung 2: Initialisierung und Bindung von ImsService

Framework-Erkennung und -Verifizierung einer ImsService-Implementierung

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

  1. Carrier "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 wird. Dies wird mit dem konfiguriert
  2. Gerät "Standard" ImsService: 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 Netzbetreiber-ImsService 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 mit den 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 erteilen Berechtigungen (nämlich Telefon-, Mikrofon-, Standort-, Kamera- und Kontaktberechtigungen). Indem überprüft wird, 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, wo sie als Träger-"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 mit der Methode ImsService#onUpdateSupportedImsFeatures . Dadurch wird das Framework veranlasst, neu zu berechnen, welche ImsServices gebunden sind und welche Funktionen sie unterstützen. Wenn die IMS-Anwendung das Framework ohne unterstützte Funktionen aktualisiert, wird der ImsService ungebunden, 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 Name des ImsService-Pakets, der im Geräteüberlagerungswert für config_ims_[mmtel/rcs]_package einschließlich des Falls, dass keine SIM-Karte eingelegt ist. Dieser ImsService MUSS das Emergency MmTel Feature unterstützen.

Sie müssen entweder den Paketnamen Ihres ImsService 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 jedes Feature aufschlüsseln. Für ein Gerät (Einzel- oder Multi-SIM) mit einer eingelegten SIM-Karte sind zwei IMS-Funktionen möglich: MMTel und RCS. Das Framework versucht, in der oben definierten Reihenfolge für jede Funktion zu binden, und wenn die Funktion für den in der Carrier-Konfigurationsüberschreibung definierten ImsService nicht verfügbar ist, greift das Framework auf Ihren standardmäßigen ImsService zurück. So beschreibt beispielsweise die folgende Tabelle, welche IMS-Funktion das Framework verwendet, wenn drei IMS-Anwendungen implementiert werden, die ImsServices implementieren, die 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 Erstausrüster
Träger B Träger B Träger B
Keine SIM-Karte Erstausrüster Erstausrüster

Validierung

Tools zum Verifizieren 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-Telefoniestapel verbunden ist, empfehlen wir anzugeben, dass die App den Status der ImsService-Instanz abhören oder ändern kann, die für ein bestimmtes Netzbetreiberabonnement 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 z. B.:

  • MMTEL- oder RCS-Funktionen, die aktiviert und verfügbar sind
  • Wird aktualisiert, wenn sich der IMS-Registrierungsstatus ändert
  • Bereitstellungsstatus von 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 eingebettetes Abonnement aktiv wird oder wenn sich eine Netzbetreiberkonfiguration ändert. Da ImsService nicht Teil des Telefonieprozesses ist, kann es bei einer App zu unerwarteten Ausnahmen kommen, wenn sie versucht, auf IMS-APIs zuzugreifen, wenn ImsService aufgrund eines Abonnements oder einer Konfigurationsänderung unsichtbar abstürzt oder ungebunden ist.

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 zugeordnetes Abonnement verfügbar oder nicht verfügbar ist. Beim Abrufen einer Instanz von ImsMmTelManager oder ImsRcsManager empfehlen wir, dass sich die App zunächst mit ImsMmTelManager#registerImsStateCallback oder ImsRcsManager#registerImsStateCallback für einen IMS-Zustandsrückruf registriert. Um weiterhin Callback-Updates für bestimmte Abonnements zu erhalten, wenn ImsService wieder verfügbar ist, muss die App vorhandene Callbacks, die über ImsMmTelManager , ImsRcsManager oder ProvisioningManager registriert sind, abmelden oder verwerfen; 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 . Dies bedeutet, dass ImsService und die IMS-bezogenen APIs für das Abonnement nicht verfügbar sind.

In dem 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 für das zugehörige Abonnement erneut, indem ImsMmTelManager#registerImsStateCallback oder ImsRcsManager#registerImsStateCallback .