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.
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 Aktionandroid.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 pertelephony
, 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 dieBIND_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.
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:
- 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
-
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 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:
-
config_ims_mmtel_package
: Implementiert MMTEL-Funktionen -
config_ims_rcs_package
: Implementiert RCS-Funktionen
-
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:
- Der ImsService-Paketname, der durch den 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 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.