Implementare IMS

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.

Panoramica di ImsService

Figura 1. Panoramica di ImsService

Utilizzando l'interfaccia ImsService, l'implementatore IMS può fornire alla piattaforma informazioni di segnalazione importanti, come le informazioni di registrazione IMS, l'integrazione di SMS su IMS e l'integrazione delle funzionalità MmTel per fornire chiamate vocali e video. L'API ImsService è anche 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 in modo da poter essere aggiornata dal Play Store.

Esempi e origine

Android fornisce un'app su AOSP che implementa parti dell'API ImsService per scopi 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 ti consente di implementare IMS in molti modi, a seconda dell'hardware disponibile. Ad esempio, l'implementazione cambia 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 lo scaricamento sul processore della banda base, quindi qualsiasi scaricamento deve avvenire utilizzando l'estensione HAL del 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 precedenti devono eseguire le seguenti operazioni per continuare a supportare l'API precedente.

  • Modifica lo spazio dei nomi dell'implementazione ImsService in modo che estenda l'API dello spazio dei nomi android.telephony.ims.compat.
  • Modifica la definizione del servizio ImsService in AndroidManifest.xml in modo da utilizzare l'azione del filtro di intent android.telephony.ims.compat.ImsService anziché l'azione android.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 viene implementata come un servizio a cui il framework Android si lega per comunicare con l'implementazione IMS. Sono necessari tre passaggi per registrare un'app che implementa un ImsService con il framework. Innanzitutto, l'implementazione ImsService deve registrarsi sulla piattaforma utilizzando AndroidManifest.xml dell'app; in secondo luogo, deve definire le funzionalità IMS supportate dall'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 service in AndroidManifest.xml definisce i seguenti attributi, necessari per il corretto funzionamento:

  • directBootAware="true": consente a telephony 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 la crittografia basata su file.
  • persistent="true": consente di eseguire questo servizio in modo permanente e non di essere terminato dal 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'autorizzazione BIND_IMS_SERVICE possa essere associato all'app. In questo modo, un'app dannosa non può essere associata al servizio, poiché solo le app di sistema possono ricevere l'autorizzazione dal framework.

Il servizio deve anche specificare l'elemento intent-filter con l'azione android.telephony.ims.ImsService. In questo modo, il framework può trovare ImsService.

Specifiche delle funzionalità IMS

Dopo aver definito ImsService come servizio Android in AndroidManifest.xml, ImsService deve definire le funzionalità IMS che supporta. Al momento, Android supporta le funzionalità MmTel e RCS, ma solo MmTel è integrato nel framework. Sebbene non siano presenti API RCS integrate nel framework, la dichiarazione 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 include il supporto per tutti i media IMS (specifiche IR.92 e IR.94), ad eccezione dell'allegato di emergenza all'IMS PDN per le chiamate di emergenza. Qualsiasi implementazione di ImsService che voglia supportare le funzionalità MMTEL deve estendere la android.telephony.ims.MmTelFeature classe base e restituire un'implementazione MmTelFeature personalizzata in ImsService#createMmTelFeature.

FEATURE_EMERGENCY_MMTEL

La dichiarazione di questa funzionalità segnala solo alla piattaforma che è possibile allegare i servizi di emergenza all'IMS PDN. Se questa funzionalità non è dichiarata per ImsService, la piattaforma utilizzerà sempre il fallback del circuito commutato per i servizi di emergenza. Per definire questa funzionalità, è 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 lega 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 associazione personalizzata che una funzionalità RCS dovrebbe altrimenti fornire.

Registrazione delle funzionalità supportate

Il framework di telefonia si lega innanzitutto a ImsService per eseguire una query sulle funzionalità che supporta 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 ImsService sarà responsabile. 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 sull'associazione di ImsService, consulta il seguente diagramma.

ImsService initializing and binding

Figura 2. Inizializzazione e associazione di ImsService

Rilevamento e verifica del framework di un'implementazione ImsService

Una volta che ImsService è stato definito correttamente in AndroidManifest.xml, la piattaforma deve essere configurata per associarsi (in modo sicuro) a ImsService quando appropriato. Esistono due tipi di ImsService a cui il framework si lega:

  1. ImsService "override" dell'operatore: 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 operazione viene configurata utilizzando la chiave
  2. ImsService "predefinito" 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 non è disponibile un ImsService dell'operatore. È utile nelle situazioni in cui il dispositivo non ha una scheda SIM inserita o la scheda SIM inserita non ha un ImsService dell'operatore installato. Questa operazione viene definita nell'overlay del dispositivo utilizzando le seguenti configurazioni:

Android non supporta le 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 le autorizzazioni per telefono, microfono, posizione, fotocamera e contatti). Verificando se il nome del pacchetto dell'implementazione IMS corrisponde ai valori CarrierConfig o dell'overlay del dispositivo definiti sopra, vengono associate solo le app preinstallate attendibili.

Personalizzazione

Le app che implementano un ImsService vengono associate solo sui dispositivi in cui sono configurate come configurazioni ImsService "override" dell'operatore o ImsService "predefinite" del dispositivo per le funzionalità MMTEL o RCS. ImsService consente inoltre di attivare o disattivare dinamicamente le funzionalità IMS supportate (MMTEL e RCS) utilizzando gli aggiornamenti tramite il metodo ImsService#onUpdateSupportedImsFeatures. In questo modo, il framework ricalcola gli ImsService associati e le funzionalità che supportano. Se l'app IMS aggiorna il framework senza funzionalità supportate, ImsService verrà dissociato fino al riavvio del telefono o all'inserimento di una nuova scheda SIM corrispondente all'app IMS.

Priorità di associazione per più ImsService

Il framework non può supportare l'associazione a tutti i possibili ImsService precaricati sul dispositivo e si assocerà a un massimo di due ImsService per slot SIM (un ImsService per funzionalità) nel seguente ordine in base alla funzionalità:

  1. Il nome del pacchetto ImsService definito dal valore CarrierConfig config_ims_[mmtel/rcs]_package_override_string quando è inserita una scheda SIM.
  2. 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à Emergency MmTel.

Devi avere il nome del pacchetto di ImsService definito in CarrierConfig per ciascuno degli operatori che utilizzeranno il pacchetto o nell'overlay del dispositivo se 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 l'associazione 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 al tuo ImsService predefinito. Ad esempio, la tabella seguente descrive la funzionalità IMS che il framework utilizzerà in base a tre app IMS che implementano ImsService installate su un sistema con le seguenti funzionalità:

  • L'ImsService dell'operatore A supporta RCS
  • L'ImsService dell'operatore B supporta RCS e MMTel
  • L'ImsService OEM supporta RCS e MMTel
Scheda SIM inserita Funzionalità RCS Funzionalità MMTel
Operatore A Operatore A OEM
Operatore B Operatore B Operatore B
Nessuna SIM OEM OEM

Convalida

Gli strumenti per verificare l'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 classeImsManager per ottenere un'istanza della classeImsMmTelManager, classeImsRcsManager, o classeProvisioningManager specifica per IMS. L'app può quindi ascoltare gli stati di servizio e di provisioning specifici per IMS, ad esempio:

  • Funzionalità MMTEL o RCS attivate e disponibili
  • Aggiornamenti quando lo stato di registrazione IMS cambia
  • Stato di provisioning delle funzionalità IMS
  • Funzionalità IMS attivate dall'utente

Utilizzare 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 di un 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 dissociato a causa di una modifica dell'abbonamento o della configurazione.

Sui dispositivi con Android 13 o versioni successive, un'app può utilizzare la ImsStateCallback classe per monitorare se l'istanza ImsService per un abbonamento associato è disponibile o meno. 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 dei 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 esiste 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 caso in cui il processo di telefonia si arresti in modo anomalo, l'app riceve ImsStateCallback#onError e non riceve più aggiornamenti sull'istanza ImsStateCallback registrata. Per ripristinare questa condizione, registra di nuovo l'istanza ImsStateCallback per l'abbonamento associato chiamando ImsMmTelManager#registerImsStateCallback o ImsRcsManager#registerImsStateCallback.