Android 9 introduce un'interfaccia SystemApi chiamata ImsService per aiutarti a implementare IP Multimedia Subsystem (IMS). L'API ImsService è un'interfaccia ben definita tra la piattaforma Android e un'implementazione IMS fornita da un fornitore o un operatore.
Figura 1. Panoramica di ImsService
Utilizzando l'interfaccia ImsService, l'implementatore IMS può fornire importanti informazioni di segnalazione alla piattaforma, come informazioni di registrazione IMS, integrazione SMS su IMS e integrazione della funzionalità MmTel per fornire chiamate vocali e video. Anche l'API ImsService è un'API di sistema Android, il che significa che può essere creata direttamente in base all'SDK Android anziché all'origine. Un'app IMS preinstallata sul dispositivo può anche essere configurata per essere aggiornabile dal Play Store.
Esempi e origine
Android fornisce un'app su AOSP che implementa parti dell'API ImsService a scopo di test e sviluppo. Puoi trovare l'app all'indirizzo /testapps/ImsTestService.
Puoi trovare la documentazione dell'API ImsService in ImsService e nelle altre classi dell'API.
Implementazione
L'API ImsService è un'API di alto livello che consente di implementare IMS in molti modi, a seconda dell'hardware disponibile. Ad esempio, le modifiche all'implementazione variano a seconda che l'implementazione IMS sia completamente sul processore dell'app o se sia parzialmente o completamente scaricata sul modem. Android non fornisce un HAL pubblico per l'offload al processore della banda base, quindi qualsiasi offload deve avvenire utilizzando l'estensione HAL al modem.
Compatibilità con le implementazioni IMS precedenti
Sebbene Android 9 includa l'API ImsService,
i dispositivi che utilizzano un'implementazione precedente per IMS non sono in grado di supportare l'API.
Per questi dispositivi, le interfacce AIDL e le classi wrapper precedenti sono state spostate
nello spazio dei nomi android.telephony.ims.compat
. Quando esegui l'upgrade ad Android
9, i dispositivi meno recenti devono eseguire le seguenti operazioni per continuare
a supportare l'API precedente.
- Modifica lo spazio dei nomi dell'implementazione di ImsService in modo che si estenda dall'API dello spazio dei nomi
android.telephony.ims.compat
. - Modifica la definizione del servizio ImsService in AndroidManifest.xml per utilizzare l'azione
android.telephony.ims.compat.ImsService
intent-filter anziché l'azioneandroid.telephony.ims.ImsService
.
Il framework si legherà quindi a ImsService utilizzando il livello di compatibilità
fornito in Android 9 per funzionare con l'implementazione
ImsService
legacy.
Registrazione di ImsService con il framework
L'API ImsService è implementata come servizio a cui il framework Android si associa per comunicare con l'implementazione IMS. Per registrare un'app che implementa un ImsService con il framework, sono necessari tre passaggi. Innanzitutto, l'implementazione di ImsService deve registrarsi sulla piattaforma utilizzando il AndroidManifest.xml
dell'app; in secondo luogo, deve definire quali funzionalità IMS supporta l'implementazione (MmTel o RCS); in terzo luogo, deve essere verificata come implementazione IMS attendibile nella configurazione dell'operatore o nell'overlay del dispositivo.
Definizione del servizio
L'app IMS registra un ImsService con il framework aggiungendo una voce service
al manifest utilizzando il seguente formato:
<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>
La definizione di service
in AndroidManifest.xml
definisce i seguenti
attributi, necessari per il corretto funzionamento:
directBootAware="true"
: consente al servizio di essere rilevato ed eseguito datelephony
prima che l'utente sblocchi il dispositivo. Il servizio non può accedere allo spazio di archiviazione criptato del dispositivo prima che l'utente lo sblocchi. Per ulteriori informazioni, vedi Supporto della modalità di avvio diretto e Crittografia basata su file.persistent="true"
: consente l'esecuzione persistente di questo servizio e non l'interruzione da parte del sistema per recuperare memoria. Questo attributo funziona SOLO se l'app è creata come app di sistema.permission="android.permission.BIND_IMS_SERVICE"
: garantisce che solo un processo a cui è stata concessa l'autorizzazioneBIND_IMS_SERVICE
possa essere associato all'app. In questo modo si impedisce a un'app canaglia di associarsi al servizio, poiché solo alle app di sistema può essere concessa l'autorizzazione dal framework.
Il servizio deve specificare anche l'elemento intent-filter
con l'azione
android.telephony.ims.ImsService
. In questo modo, il framework può trovare
ImsService
.
Specifiche delle funzionalità IMS
Dopo che ImsService è stato definito come servizio Android in AndroidManifest.xml, deve definire quali funzionalità IMS supporta. Al momento Android supporta le funzionalità MmTel e RCS, ma solo MmTel è integrato nel framework. Sebbene non siano integrate API RCS nel framework, dichiararlo come funzionalità di ImsService presenta comunque dei vantaggi.
Di seguito sono riportate le funzionalità valide definite in android.telephony.ims.ImsFeature
che
un ImsService può fornire, nonché una spiegazione ed un esempio del motivo per cui un'app IMS
potrebbe voler implementare una o tutte queste funzionalità. Dopo aver definito ogni funzionalità, questa pagina descrive in che modo ImsService
dichiara l'insieme di funzionalità che definisce per ogni slot SIM.
FEATURE_MMTEL
ImsService
implementa la funzionalità IMS MMTEL, che supporta
tutti i contenuti multimediali IMS (specifiche IR.92 e IR.94) ad eccezione dell'allegato di emergenza alla
PDN IMS per le chiamate di emergenza. Qualsiasi implementazione di ImsService
che vuole
supportare le funzionalità MMTEL deve estendere la
classe base android.telephony.ims.MmTelFeature
e restituire un'implementazione
MmTelFeature
personalizzata in
ImsService#createMmTelFeature
.
FEATURE_EMERGENCY_MMTEL
La dichiarazione di questa funzionalità indica solo alla piattaforma che è possibile il collegamento di emergenza alla PDN IMS per i servizi di emergenza. Se questa funzionalità non viene dichiarata per
il tuo ImsService
, la piattaforma utilizzerà sempre il fallback di commutazione del circuito
per i servizi di emergenza. La funzionalità FEATURE_MMTEL
deve essere definita per poter definire questa funzionalità.
FEATURE_RCS
L'API ImsService non implementa alcuna funzionalità IMS RCS, ma la
classe base android.telephony.ims.RcsFeature
può comunque essere utile. Il framework
si associa automaticamente a ImsService e chiama ImsService#createRcsFeature
quando rileva che il pacchetto deve fornire RCS. Se la scheda SIM associata
al servizio RCS viene rimossa, il framework chiama automaticamente
RcsFeature#onFeatureRemoved
e poi pulisce ImsService
associato
alla funzionalità RCS. Questa funzionalità può rimuovere parte della logica di rilevamento
o binding personalizzata che una funzionalità RCS dovrebbe altrimenti fornire.
Registrazione delle funzionalità supportate
Il framework di telefonia esegue prima il binding a ImsService per eseguire query sulle funzionalità che
supporta utilizzando l'API ImsService#querySupportedImsFeatures
. Dopo che il framework calcola quali funzionalità supporterà ImsService, chiama ImsService#create[...]Feature
per ogni funzionalità di cui sarà responsabile ImsService. Se le funzionalità supportate dall'app IMS cambiano, puoi
utilizzare ImsService#onUpdateSupportedImsFeatures
per segnalare al framework di
ricalcolare le funzionalità supportate. Per ulteriori informazioni sull'inizializzazione e sul binding di ImsService, consulta il seguente diagramma.
Figura 2. Inizializzazione e binding di ImsService
Rilevamento e verifica del framework di un'implementazione di ImsService
Una volta definito correttamente ImsService in AndroidManifest.xml, la piattaforma deve essere configurata per il binding (sicuro) a ImsService quando opportuno. Esistono due tipi di ImsService a cui il framework si associa:
- Override dell'operatore ImsService: questi ImsService sono precaricati sul
dispositivo, ma sono collegati a uno o più operatori di telefonia mobile e verranno
associati solo quando viene inserita una scheda SIM corrispondente. Questa impostazione viene configurata utilizzando
config_ims_mmtel_package_override_string
Chiave CarrierConfig per ImsServices che implementa le funzionalità MMTEL.config_ims_rcs_package_override_string
per ImsServices che implementano le funzionalità RCS.
- ImsService "default" del dispositivo: si tratta dell'ImsService predefinito caricato
sul dispositivo da un OEM e deve essere progettato per fornire servizi IMS in
tutte le situazioni in cui un ImsService dell'operatore non è disponibile ed è utile in
situazioni in cui nel dispositivo non è inserita alcuna scheda SIM o la scheda SIM
inserita non ha installato un ImsService dell'operatore. Questo valore è
definito nell'overlay del dispositivo utilizzando le seguenti configurazioni:
config_ims_mmtel_package
: Implementa le funzionalità MMTELconfig_ims_rcs_package
: Implementa le funzionalità RCS
Android non supporta app con implementazioni ImsService scaricabili di terze parti, pertanto tutte le implementazioni ImsService definite qui devono essere app di sistema e devono risiedere nella cartella /system/priv-app/ o /product/priv-app/ per concedere le autorizzazioni appropriate (ovvero autorizzazioni telefono, microfono, posizione, fotocamera e contatti). Verificando se il nome del pacchetto dell'implementazione IMS corrisponde ai valori di CarrierConfig o dell'overlay del dispositivo definiti sopra, vengono associati solo app preinstallate e attendibili.
Personalizzazione
Le app che implementano un ImsService sono associate solo ai dispositivi in cui sono configurate come ImsService "override" dell'operatore o come configurazioni ImsService "predefinite" del dispositivo per la funzionalità MMTEL o RCS.
ImsService consente inoltre di attivare o disattivare dinamicamente le funzionalità IMS che supporta (MMTEL e RCS) utilizzando gli aggiornamenti tramite il metodo ImsService#onUpdateSupportedImsFeatures
. In questo modo, il framework ricalcola
quali ImsService sono associati e quali funzionalità supportano. Se l'app IMS aggiorna il framework senza funzionalità supportate, ImsService verrà scollegato finché lo smartphone non viene riavviato o non viene inserita una nuova scheda SIM che corrisponda all'app IMS.
Priorità di binding per più ImsService
Il framework non può supportare il binding a tutti gli ImsService possibili precaricati sul dispositivo e si legherà a un massimo di due ImsService per slot SIM (un ImsService per ogni funzionalità) nel seguente ordine in base alla funzionalità:
- Il nome del pacchetto ImsService definito dal valore CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
quando è inserita una scheda SIM. - Il nome del pacchetto ImsService definito nel valore di overlay del dispositivo per
config_ims_[mmtel/rcs]_package
, incluso il caso in cui non è inserita alcuna scheda SIM. Questo ImsService DEVE supportare la funzionalità MmTel di emergenza.
Devi definire il nome del pacchetto del tuo ImsService in CarrierConfig per ciascun operatore che utilizzerà il pacchetto o nell'overlay del dispositivo se il tuo ImsService sarà quello predefinito, come definito sopra.
Analizziamo ogni funzionalità. Per un dispositivo (con una o più SIM) con una sola scheda SIM caricata, sono possibili due funzionalità IMS: MMTel e RCS. Il framework tenterà di eseguire il binding nell'ordine definito sopra per ogni funzionalità e se la funzionalità non è disponibile per ImsService definito nell'override della configurazione dell'operatore, il framework eseguirà il fallback a ImsService predefinito. Ad esempio, la tabella seguente descrive quale funzionalità IMS verrà utilizzata dal framework date tre app IMS che implementano ImsServices installate su un sistema con le seguenti funzionalità:
- L'operatore A ImsService supporta RCS
- L'ImsService dell'operatore B supporta RCS e MMTel
- OEM ImsService supporta RCS e MMTel
Scheda SIM inserita | Funzionalità RCS | Funzionalità MMTel |
---|---|---|
Operatore A | Operatore A | OEM |
Operatore B | Operatore B | Operatore B |
Nessuna SIM rilevata | OEM | OEM |
Convalida
Gli strumenti per la verifica dell'implementazione IMS non sono inclusi perché le specifiche IMS sono estremamente grandi e utilizzano apparecchiature di verifica speciali. I test possono solo verificare che il framework di telefonia risponda correttamente all'API ImsService.
Sviluppare un'app IMS
Quando sviluppi un'app IMS che interagisce con lo stack di telefonia Android, ti consigliamo di specificare che l'app può ascoltare o modificare lo stato dell'istanza ImsService collegata per un abbonamento a un operatore specifico.
Per ascoltare o modificare lo stato di ImsService per le funzionalità MMTEL e RCS, utilizza
la classe
ImsManager
per ottenere un'istanza della classe
ImsMmTelManager
,
ImsRcsManager
o della classe
ProvisioningManager
> specifica per IMS. L'app può quindi ascoltare gli stati di provisioning e servizio specifici di IMS, ad esempio:
- Funzionalità MMTEL o RCS attivate e disponibili
- Aggiornamenti quando lo stato di registrazione IMS cambia
- Stato del provisioning delle funzionalità IMS
- Funzionalità IMS che l'utente ha attivato
Utilizza ImsStateCallback
Sebbene ImsService sia un servizio associato in modo permanente, il servizio associato potrebbe cambiare quando viene attivata una nuova scheda SIM o un nuovo abbonamento incorporato o quando cambia la configurazione dell'operatore. Poiché ImsService non fa parte del processo di telefonia, un'app potrebbe riscontrare eccezioni impreviste quando tenta di accedere alle API IMS se ImsService si arresta in modo invisibile o viene scollegato a causa di una modifica alla configurazione o all'abbonamento.
Sui dispositivi con Android 13 o versioni successive, per monitorare
se l'istanza ImsService per un abbonamento associato è
disponibile o non disponibile, un'app può utilizzare la classe
ImsStateCallback
. Quando ottieni un'istanza di ImsMmTelManager
o ImsRcsManager
, ti
consigliamo di registrare prima l'app per un callback dello stato IMS utilizzando
ImsMmTelManager#registerImsStateCallback
o
ImsRcsManager#registerImsStateCallback
.
Per continuare a ricevere aggiornamenti di callback per abbonamenti specifici quando
ImsService torna disponibile, l'app deve annullare la registrazione o eliminare i callback esistenti
registrati tramite ImsMmTelManager
, ImsRcsManager
o
ProvisioningManager
e registrare nuovi callback.
Se è presente un abbonamento che non supporta IMS, il framework chiama
ImsStateCallback#onUnavailable
con il motivo
REASON_NO_IMS_SERVICE_CONFIGURED
.
Ciò significa che ImsService e le API correlate a IMS non sono disponibili per l'abbonamento.
Nell'improbabile eventualità che il processo di telefonia si arresti in modo anomalo, l'app riceve
ImsStateCallback#onError
e non riceve più aggiornamenti sull'istanza ImsStateCallback
registrata.
Per risolvere questo problema, registra nuovamente l'istanza ImsStateCallback
per
l'abbonamento associato chiamando
ImsMmTelManager#registerImsStateCallback
o
ImsRcsManager#registerImsStateCallback
.