Mit Android 9 wird eine SystemApi-Schnittstelle namens ImsService eingeführt, die Sie bei der Implementierung des IP Multimedia Subsystem (IMS) unterstützt. Die ImsService API ist eine genau definierte Schnittstelle zwischen der Android-Plattform und einer vom Anbieter oder Mobilfunkanbieter bereitgestellten IMS-Implementierung.
Abbildung 1: ImsService – Übersicht
Über die ImsService-Schnittstelle kann der IMS-Implementierer wichtige Signalisierungsinformationen für die Plattform bereitstellen, z. B. IMS-Registrierungsinformationen, SMS-over-IMS-Integration und MmTel-Funktionsintegration für Sprach- und Videoanrufe. Die ImsService API ist ebenfalls eine Android-System-API. Das bedeutet, dass sie direkt mit dem Android SDK anstelle des Quellcodes erstellt werden kann. 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 für Test- und Entwicklungszwecke 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 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 kein öffentliches HAL für das Offloading an den Baseband-Prozessor. Daher muss jedes Offloading über Ihre HAL-Erweiterung für 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, sodass er von der
android.telephony.ims.compat
-Namespace-API abgeleitet wird. - Ändern Sie die ImsService-Dienstdefinition in AndroidManifest.xml, damit die
android.telephony.ims.compat.ImsService
-Intent-Filteraktion anstelle derandroid.telephony.ims.ImsService
-Aktion verwendet wird.
Das Framework wird dann über die in Android 9 bereitgestellte Kompatibilitätsebene an den ImsService gebunden, 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 ist, um mit der IMS-Implementierung zu kommunizieren. Es sind drei Schritte erforderlich, um eine App, die einen ImsService implementiert, im Framework zu registrieren. Erstens muss sich die ImsService-Implementierung mit der Plattform über die AndroidManifest.xml
der App registrieren. Zweitens muss sie definieren, welche IMS-Funktionen die Implementierung unterstützt (MmTel oder RCS). Drittens muss sie entweder in der Carrier-Konfiguration 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 korrekten Betrieb erforderlich sind:
directBootAware="true"
: Ermöglicht es, dass der Dienst vontelephony
erkannt und ausgeführt wird, bevor der Nutzer das Gerät entsperrt. Der Dienst kann nicht auf den verschlüsselten Gerätespeicher zugreifen, bevor der Nutzer das Gerät entsperrt. Weitere Informationen finden Sie unter Direct Boot-Modus unterstützen und Dateibasierte Verschlüsselung.persistent="true"
: Ermöglicht, dass dieser Dienst dauerhaft ausgeführt wird und nicht vom System beendet wird, um Speicher freizugeben. Dieses Attribut funktioniert NUR, wenn die App als System-App entwickelt wurde.permission="android.permission.BIND_IMS_SERVICE"
: Sorgt dafür, dass nur ein Prozess, dem die BerechtigungBIND_IMS_SERVICE
erteilt wurde, an die App gebunden werden kann. Dadurch wird verhindert, dass eine betrügerische App an den Dienst gebunden wird, da nur System-Apps die Berechtigung vom Framework 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 der ImsService in AndroidManifest.xml als Android-Dienst definiert wurde, muss er definieren, welche IMS-Funktionen er unterstützt. Android unterstützt derzeit die MmTel- und RCS-Funktionen. Allerdings ist nur MmTel in das Framework integriert. Obwohl keine RCS-APIs in das Framework integriert sind, hat es dennoch Vorteile, es 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 dieser Funktionen implementieren sollte. Nachdem jede Funktion definiert wurde, wird auf dieser Seite beschrieben, wie das ImsService
die Gruppe der Funktionen deklariert, die für jeden SIM-Slot definiert werden.
FEATURE_MMTEL
Das ImsService
implementiert die IMS MMTEL-Funktion, die Unterstützung für alle IMS-Medien (IR.92- und IR.94-Spezifikationen) mit Ausnahme der Notfallverbindung zum IMS PDN für Notrufe enthält. Jede Implementierung von ImsService
, die die MMTEL-Funktionen unterstützen soll, muss 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 Rettungsdienste möglich ist. Wenn diese Funktion nicht für Ihre ImsService
deklariert ist, wird auf der Plattform für Notrufe immer auf Circuit Switch Fallback zurückgegriffen. Die Funktion FEATURE_MMTEL
muss definiert sein, damit diese Funktion definiert werden kann.
FEATURE_RCS
In der ImsService API werden keine IMS RCS-Funktionen implementiert, die Basisklasse android.telephony.ims.RcsFeature
kann aber trotzdem nützlich sein. Das Framework bindet automatisch an den 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 die mit der RCS-Funktion verknüpften ImsService
. Mit dieser Funktion kann ein Teil der benutzerdefinierten Erkennungs- oder Bindungslogik entfernt werden, die für eine RCS-Funktion ansonsten erforderlich wäre.
Registrierung unterstützter Funktionen
Das Telefonie-Framework bindet zuerst an den ImsService, um die unterstützten Funktionen über die ImsService#querySupportedImsFeatures
API abzufragen. Nachdem das Framework berechnet hat, welche Funktionen der ImsService unterstützt, wird ImsService#create[...]Feature
für jede Funktion aufgerufen, für die der ImsService zuständig ist. Wenn sich die von der IMS-App unterstützten Funktionen ändern, können Sie ImsService#onUpdateSupportedImsFeatures
verwenden, um das Framework zu signalisieren, dass die unterstützten Funktionen neu berechnet werden sollen. Das folgende Diagramm enthält weitere Informationen zur Initialisierung und Bindung des ImsService.
Abbildung 2: ImsService-Initialisierung und -Bindung
Framework-Erkennung und Überprüfung einer ImsService-Implementierung
Sobald der ImsService in AndroidManifest.xml richtig definiert wurde, muss die Plattform so konfiguriert werden, dass sie bei Bedarf (sicher) an den ImsService gebunden wird. Das Framework bindet an zwei Arten von ImsServices:
- ImsService-Überschreibung durch Mobilfunkanbieter: 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 dem
config_ims_mmtel_package_override_string
CarrierConfig-Schlüssel für ImsServices, die MMTEL-Funktionen implementieren.config_ims_rcs_package_override_string
für ImsServices, die RCS-Funktionen implementieren.
- „default“-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 er IMS-Dienste in allen Situationen bereitstellt, in denen kein Carrier-ImsService verfügbar ist. Dies ist nützlich, wenn keine SIM-Karte in das Gerät eingelegt ist oder die eingelegte SIM-Karte keinen Carrier-ImsService installiert hat. Dies wird im Geräte-Overlay mit den folgenden Konfigurationen definiert:
config_ims_mmtel_package
: Implementiert MMTEL-Funktionenconfig_ims_rcs_package
: Implementiert RCS-Funktionen
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 (nämlich Telefon-, Mikrofon-, Standort-, Kamera- und Kontaktberechtigungen) zu erhalten. 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 Carrier-Override-ImsService oder als Standard-ImsService-Konfigurationen für MMTEL- oder RCS-Funktionen konfiguriert sind.
Der ImsService ermöglicht es auch, die von ihm unterstützten IMS-Funktionen (MMTEL und RCS) dynamisch über Updates mit der Methode ImsService#onUpdateSupportedImsFeatures
zu aktivieren oder zu deaktivieren. 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 die ImsService-Bindung 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 nicht an alle möglichen ImsServices gebunden werden, die auf dem Gerät vorinstalliert sind. Es wird pro SIM-Slot an bis zu zwei ImsServices gebunden (ein ImsService für jede Funktion) und zwar in der folgenden Reihenfolge:
- Der ImsService-Paketname, der durch den CarrierConfig-Wert
config_ims_[mmtel/rcs]_package_override_string
definiert wird, wenn eine SIM-Karte eingelegt ist. - Der im Geräte-Overlay-Wert für
config_ims_[mmtel/rcs]_package
definierte ImsService-Paketname, auch wenn keine SIM-Karte eingelegt ist. Dieser ImsService MUSS die Emergency MmTel-Funktion unterstützen.
Entweder muss der Paketname Ihres ImsService in der CarrierConfig für jeden der Mobilfunkanbieter definiert sein, die dieses Paket verwenden, oder im Geräte-Overlay, wenn Ihr ImsService wie oben beschrieben der Standard ist.
Sehen wir uns das für jede Funktion genauer an. Auf einem 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 für jede Funktion in der oben definierten Reihenfolge vorzunehmen. Wenn die Funktion für den in der Carrier Configuration-Ü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 verwendet, wenn drei IMS-Apps, die ImsServices implementieren, auf einem System mit den folgenden Funktionen installiert sind:
- Der ImsService von Anbieter A unterstützt RCS
- Der ImsService von Anbieter 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 zum Überprüfen der IMS-Implementierung selbst sind nicht enthalten, da die IMS-Spezifikationen sehr umfangreich 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 interagiert, empfehlen wir, anzugeben, dass die App den Status der ImsService-Instanz, die für ein bestimmtes Abo eines Mobilfunkanbieters angehängt ist, abhören oder ändern kann.
Wenn Sie den Status von ImsService für MMTEL- und RCS-Funktionen abrufen 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 auf IMS-spezifische Dienst- und Bereitstellungsstatus warten, z. B.:
- Aktivierte und verfügbare MMTEL- oder RCS-Funktionen
- Aktualisierungen bei Änderungen des IMS-Registrierungsstatus
- Status der Nutzerverwaltung 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 aktiviert wird oder sich die Konfiguration eines Mobilfunkanbieters ändert. Da ImsService nicht Teil des Telefonieprozesses ist, können bei einer App unerwartete Ausnahmen auftreten, wenn sie versucht, auf IMS-APIs zuzugreifen, falls ImsService unbemerkt abstürzt oder aufgrund einer Änderung des Abos oder der Konfiguration nicht gebunden wird.
Auf Geräten mit Android 13 oder höher kann eine App die Klasse ImsStateCallback
verwenden, um zu überwachen, ob die ImsService-Instanz für ein zugehöriges Abo verfügbar oder nicht verfügbar ist. Wenn Sie eine Instanz von ImsMmTelManager
oder ImsRcsManager
abrufen, empfehlen wir, dass die App zuerst einen IMS-Status-Callback mit ImsMmTelManager#registerImsStateCallback
oder ImsRcsManager#registerImsStateCallback
registriert.
Damit weiterhin Callback-Updates für bestimmte Abos empfangen werden, wenn ImsService wieder verfügbar ist, muss die App die Registrierung vorhandener Callbacks aufheben oder diese 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 Telefonieprozess abstürzt, erhält die App ImsStateCallback#onError
und keine Updates mehr für die registrierte ImsStateCallback
-Instanz.
Um diesen Fehler zu beheben, registrieren Sie die ImsStateCallback
-Instanz für das zugehörige Abo neu, indem Sie ImsMmTelManager#registerImsStateCallback
oder ImsRcsManager#registerImsStateCallback
aufrufen.