Android 9 introduce una nuova interfaccia SystemApi chiamata ImsService per aiutarti a implementare il sottosistema multimediale IP (IMS). L'API ImsService è un'interfaccia ben definita tra la piattaforma Android e un'implementazione IMS fornita dal fornitore o dall'operatore.
Figura 1. Panoramica di ImsService
Utilizzando l'interfaccia ImsService, l'implementatore IMS può fornire alla piattaforma informazioni di segnalazione importanti, come i dati di registrazione IMS, l'integrazione di SMS su IMS e l'integrazione della funzionalità MmTel per fornire chiamate vocali e video. L'API ImsService è anch'essa un'API di sistema Android, il che significa che può essere creata direttamente sull'SDK Android anziché sull'origine. Un'app IMS preinstallata sul dispositivo può anche essere configurata per essere aggiornata tramite il 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 in /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, l'implementazione cambia a seconda che l'implementazione di IMS sia completamente sul processore dell'app o se è parzialmente o completamente offloadata sul modem. Android non fornisce un HAL pubblico per l'offloading al processore di banda di base, quindi ogni offloading deve avvenire utilizzando l'estensione HAL per il modem.
Compatibilità con le implementazioni IMS precedenti
Anche se Android 9 include 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 e le classi wrapper AIDL 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 in modo da utilizzare l'azione di filtro intent
android.telephony.ims.compat.ImsService
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 precedente di ImsService
.
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. Sono necessari tre passaggi
per registrare un'app che implementa un ImsService nel
framework. Innanzitutto, l'implementazione di ImsService deve registrarsi sulla piattaforma utilizzando il AndroidManifest.xml
dell'app; in secondo luogo, deve definire le funzionalità IMS supportate dall'implementazione (MmTel o RCS); e 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
nel 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 atelephony
di rilevare ed eseguire il servizio prima che l'utente sblocchi il dispositivo. Il servizio non può accedere allo spazio di archiviazione criptato del dispositivo prima che l'utente sblocchi il dispositivo. Per ulteriori informazioni, consulta Supportare la modalità di avvio diretto e Crittografia basata su file.persistent="true"
: consente l'esecuzione persistente di questo servizio e ne impedisce l'interruzione da parte del sistema per recuperare la memoria. Questo attributo funziona SOLO se l'app è stata 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 eseguire il binding all'app. In questo modo, un'app non autorizzata non può eseguire il binding al servizio, poiché solo le app di sistema possono ricevere 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 le funzionalità IMS supportate. Al momento Android supporta le funzionalità MmTel e RCS, ma solo MmTel è integrata nel framework. Anche se non sono integrate API RCS nel framework, ci sono comunque dei vantaggi nel dichiararlo come funzionalità di ImsService.
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à, in questa pagina viene illustrato come ImsService
dichiara l'insieme di
funzionalità che definisce per ogni slot della SIM.
FEATURE_MMTEL
ImsService
implementa la funzionalità IMS MMTEL, che supporta tutti i media IMS (specifiche IR.92 e IR.94), ad eccezione dell'attacco di emergenza alla PDN IMS per le chiamate di emergenza. Qualsiasi implementazione di ImsService
che desidera
supportare le funzionalità MMTEL deve estendere la
classe di base android.telephony.ims.MmTelFeature
e restituire un'implementazione
MmTelFeature
personalizzata in
ImsService#createMmTelFeature
.
FEATURE_EMERGENCY_MMTEL
Dichiarare questa funzionalità segnala solo alla piattaforma che l'emergenza è collegata al PDN ISM per i servizi di emergenza. Se questa funzionalità non è dichiarata per il tuo ImsService
, la piattaforma utilizzerà sempre il fallback del circuito per i servizi di emergenza. Affinché questa funzionalità sia definita, è necessario definire la funzionalità FEATURE_MMTEL
.
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 ripulisce ImsService
associato alla funzionalità RCS. Questa funzionalità può rimuovere parte della logica di rilevamento o di associazione personalizzata che altrimenti una funzionalità RCS dovrebbe fornire.
Registrazione delle funzionalità supportate
Il framework di telefonia si lega prima a ImsService per eseguire query sulle funzionalità supportate utilizzando l'API ImsService#querySupportedImsFeatures
. Dopo che il framework ha calcolato le funzionalità supportate da ImsService, chiama ImsService#create[...]Feature
per ogni funzionalità di cui è 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 associazione di ImsService
Rilevamento del framework e verifica di un'implementazione di ImsService
Una volta definito correttamente ImsService in AndroidManifest.xml, la piattaforma deve essere configurata per eseguire il binding (in modo sicuro) a ImsService, se opportuno. Il framework vincolato a due tipi di ImsServices:
- ImsService "override" dell'operatore: questi ImsService sono precaricati sul
dispositivo, ma sono associati a uno o più operatori di telefonia cellulare e verranno
associati solo quando viene inserita una scheda SIM corrispondente. Viene configurato 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 "predefinito" del dispositivo: si tratta dell'imsService predefinito che viene caricato sul dispositivo da un OEM e deve essere progettato per fornire servizi IMS in tutte le situazioni in cui un operatore ImsService non sia disponibile ed è utile in situazioni in cui nel dispositivo non è inserita una scheda SIM o in cui non è installato un operatore ImsService nella scheda SIM inserita. Questo valore viene 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 le app con implementazioni di ImsService scaricabili di terze parti, pertanto tutte le implementazioni di ImsService definite qui devono essere app di sistema e devono trovarsi nella cartella /system/priv-app/ o /product/priv-app/ per concedere le autorizzazioni appropriate (ovvero telefono, microfono, posizione, fotocamera e contatti). Verificando se il nome del pacchetto dell'implementazione IMS corrisponde ai valori dell'overlay CarrierConfig o del dispositivo definiti sopra, vengono associate solo le app preinstallate attendibili.
Personalizzazione
Le app che implementano un ImsService sono associate solo ai dispositivi su cui sono configurate come ImsService "sostituzione" 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 supportate (MMTEL e RCS) tramite aggiornamenti utilizzando il metodo ImsService#onUpdateSupportedImsFeatures
. Questo attiva il framework per
ricalcolare quali ImsServices sono associati e quali funzionalità supportano. Se l'app IMS aggiorna il framework senza funzionalità supportate, ImsService non sarà associato finché lo smartphone non viene riavviato o non viene inserita una nuova scheda SIM corrispondente all'app IMS.
Priorità di associazione per più ImsService
Il framework non può supportare il binding a tutti i possibili ImsService 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 dell'overlay del dispositivo per
config_ims_[mmtel/rcs]_package
incluso il caso in cui non sia inserita alcuna scheda SIM. Questo ImsService DEVE supportare la funzionalità MmTel di emergenza.
Devi avere il nome del pacchetto del tuo ImsService definito in CarrierConfig per ciascun operatore che utilizzerà il pacchetto o nell'overlay del dispositivo se ImsService sarà predefinito, come definito sopra.
Analizziamo ogni caratteristica. Per un dispositivo (mono o multi SIM) con una singola 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 l'ImsService definito nella sostituzione della configurazione dell'operatore, il framework utilizzerà l'ImsService predefinito. Pertanto, ad esempio, la tabella seguente descrive quale funzionalità IMS utilizzerà il framework considerate tre app IMS che implementano ImsServices installate su un sistema con le seguenti funzionalità:
- ImsService dell'operatore A supporta RCS
- ImsService dell'operatore B supporta RCS e MMTel
- L'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 dell'IMS stessa non sono inclusi poiché le specifiche IMS sono estremamente ampie e richiedono attrezzature di verifica speciali. I test possono solo verificare che il framework di telefonia risponda correttamente all'API ImsService.
Sviluppare un'app IMS
Durante lo sviluppo di un'app IMS che si interfaccia con lo stack di telefonia Android, ti consigliamo di specificare che l'app può ascoltare o modificare lo stato dell'istanza ImsService collegata per l'abbonamento di uno specifico operatore.
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 ProvisioningManager
specifica per IMS. L'app può quindi ascoltare gli stati di provisioning e del servizio specifici di IMS, come:
- Funzionalità MMTEL o RCS attive e disponibili
- Aggiornamenti quando cambia lo stato di registrazione IMS
- Stato del provisioning delle funzionalità IMS
- Funzionalità di messaggistica immediata attivate dall'utente
Utilizzare ImsStateCallback
Sebbene ImsService sia un servizio associato in modo persistente, il servizio associato potrebbe cambiare quando una nuova scheda SIM o un abbonamento incorporato diventa attivo o quando la configurazione di un operatore cambia. 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 non è associato a causa di un abbonamento o di una modifica di configurazione.
Sui dispositivi con Android 13 o versioni successive, per monitorare se l'istanza ImsService per un abbonamento associato è disponibile o meno, un'app può utilizzare la classe ImsStateCallback
. Quando ricevi un'istanza di ImsMmTelManager
o ImsRcsManager
, consigliamo all'app di registrarsi prima per un callback dello stato IMS utilizzando ImsMmTelManager#registerImsStateCallback
o ImsRcsManager#registerImsStateCallback
.
Per continuare a ricevere aggiornamenti dei callback per abbonamenti specifici quando
ImsService diventa di nuovo 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'iscrizione.
Nell'improbabile caso in cui il processo di telefonia abbia un arresto anomalo, l'app riceve
ImsStateCallback#onError
e non riceve più aggiornamenti sull'istanza ImsStateCallback
registrata.
Per risolvere il problema, registra di nuovo l'istanza ImsStateCallback
per l'abbonamento associato chiamando ImsMmTelManager#registerImsStateCallback
o ImsRcsManager#registerImsStateCallback
.