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, 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 Aktionandroid.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 pertelephony
, 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 BerechtigungBIND_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.
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:
- 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
-
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.
-
- 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:
-
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 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:
- Der ImsService-Paketname, der durch den CarrierConfig-Wert
config_ims_[mmtel/rcs]_package_override_string
definiert wird, wenn eine SIM-Karte eingelegt ist. - 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
.