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.
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 Aktionandroid.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 vontelephony
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 BerechtigungBIND_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.
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:
- 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
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.
- „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:
config_ims_mmtel_package
: MMTEL-Funktionen implementierenconfig_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 (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:
- Der ImsService-Paketname, der vom CarrierConfig-Wert
config_ims_[mmtel/rcs]_package_override_string
definiert wird, wenn eine SIM-Karte eingelegt ist. - 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.