Attuazione dell'IMS

Android 9 introduce una nuova 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 dal fornitore o dall'operatore.

Panoramica di ImsService

Figura 1. Panoramica di ImsService

Utilizzando l'interfaccia ImsService, l'implementatore IMS può fornire importanti informazioni di segnalazione alla piattaforma, come informazioni sulla 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 con l'SDK di Android anziché con l'origine. Un'applicazione IMS preinstallata sul dispositivo può anche essere configurata per essere aggiornabile dal Play Store.

Esempi e fonte

Android fornisce un'applicazione su AOSP che implementa parti dell'API ImsService per scopi di test e sviluppo. È possibile trovare l'applicazione in /testapps/ImsTestService .

Puoi trovare la documentazione per l'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 IMS sia completamente sul processore dell'applicazione o se sia parzialmente o completamente scaricata sul modem. Android non fornisce un HAL pubblico per l'offload sul processore in banda base, quindi qualsiasi offload deve avvenire utilizzando l'estensione HAL sul 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 vecchie interfacce AIDL e le classi wrapper sono state spostate nello spazio dei nomi android.telephony.ims.compat . Quando si esegue l'aggiornamento ad Android 9, i dispositivi meno recenti devono eseguire le seguenti operazioni per continuare a supportare l'API precedente.

  • Modificare lo spazio dei nomi dell'implementazione ImsService per estenderlo dall'API dello spazio dei nomi android.telephony.ims.compat .
  • Modificare la definizione del servizio ImsService in AndroidManifest.xml per utilizzare l'azione di filtro intent android.telephony.ims.compat.ImsService invece dell'azione android.telephony.ims.ImsService .

Il framework si collegherà quindi a ImsService utilizzando il livello di compatibilità fornito in Android 9 per funzionare con l'implementazione legacy ImsService .

Registrazione ImsService con il framework

L'API ImsService è implementata come servizio a cui si lega il framework Android per comunicare con l'implementazione IMS. Sono necessari tre passaggi per registrare un'applicazione che implementa un ImsService con il framework. Innanzitutto, l'implementazione di ImsService deve registrarsi sulla piattaforma utilizzando AndroidManifest.xml dell'applicazione; in secondo luogo, deve definire quali caratteristiche dell'IMS supporta l'implementazione (MmTel o RCS); e in terzo luogo, deve essere verificato come implementazione IMS affidabile nella configurazione dell'operatore o nell'overlay del dispositivo.

Definizione del servizio

L'applicazione 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 service in AndroidManifest.xml definisce i seguenti attributi, necessari per il corretto funzionamento:

  • directBootAware="true" : consente al servizio di essere rilevato ed eseguito tramite telephony prima che l'utente sblocchi il dispositivo. Il servizio non può accedere allo spazio di archiviazione crittografato del dispositivo prima che l'utente sblocchi il dispositivo. Per ulteriori informazioni, consulta Supporto della modalità di avvio diretto e della crittografia basata su file .
  • persistent="true" : consente a questo servizio di essere eseguito in modo persistente e di non essere interrotto dal sistema per recuperare memoria. Questo attributo funziona SOLO se l'applicazione è creata come applicazione di sistema.
  • permission="android.permission.BIND_IMS_SERVICE" : garantisce che solo un processo a cui è stata concessa l'autorizzazione BIND_IMS_SERVICE possa collegarsi all'applicazione. Ciò impedisce a un'app canaglia di legarsi al servizio, poiché solo le applicazioni di sistema possono ottenere l'autorizzazione dal framework.

Il servizio deve inoltre specificare l'elemento intent-filter con l'azione android.telephony.ims.ImsService . Ciò consente al framework di trovare ImsService .

Specifica della funzionalità IMS

Dopo che ImsService è stato definito come servizio Android in AndroidManifest.xml, ImsService deve definire quali funzionalità IMS supporta. Android attualmente supporta le funzionalità MmTel e RCS, tuttavia solo MmTel è integrato nel framework. Sebbene non vi siano API RCS integrate nel framework, ci sono comunque dei vantaggi nel dichiararle come funzionalità di ImsService.

Di seguito sono riportate le funzionalità valide definite in android.telephony.ims.ImsFeature che un ImsService può fornire e una spiegazione ed un esempio del motivo per cui un'applicazione IMS vorrebbe implementare una o tutte queste funzionalità. Dopo aver definito ciascuna funzionalità, questa pagina descrive il modo in cui ImsService dichiara l'insieme di funzionalità che definisce per ogni slot SIM.

FEATURE_MMTEL

ImsService implementa la funzione IMS MMTEL, che contiene il supporto per tutti i media IMS (specifiche IR.92 e IR.94) tranne il collegamento di emergenza al PDN IMS per le chiamate di emergenza. Qualsiasi implementazione di ImsService che desidera 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

Dichiarare questa funzionalità segnala solo alla piattaforma che è possibile effettuare il collegamento di emergenza al PDN IMS per i servizi di emergenza. Se questa funzionalità non è dichiarata per ImsService , la piattaforma utilizzerà sempre per impostazione predefinita Circuit Switch Fallback per i servizi di emergenza. La funzione FEATURE_MMTEL deve essere definita affinché questa funzione possa essere definita.

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 SIM card associata al servizio RCS viene rimossa, il framework chiama automaticamente RcsFeature#onFeatureRemoved e poi pulisce l' ImsService associato alla feature RCS. Questa funzionalità può rimuovere parte della logica di rilevamento/associazione personalizzata che una funzionalità RCS dovrebbe altrimenti fornire.

Registrazione delle funzionalità supportate

Il framework di telefonia si associa innanzitutto a ImsService per eseguire query sulle funzionalità supportate utilizzando l'API ImsService#querySupportedImsFeatures . Dopo che il framework ha calcolato quali funzionalità supporterà ImsService, chiamerà ImsService#create[...]Feature per ogni funzionalità di cui ImsService sarà responsabile. Se le funzionalità supportate dall'applicazione IMS cambiano, è possibile utilizzare ImsService#onUpdateSupportedImsFeatures per segnalare al framework di ricalcolare le funzionalità supportate. Vedere il diagramma seguente per ulteriori informazioni sull'inizializzazione e sull'associazione di ImsService.

Inizializzazione e associazione di ImsService

Figura 2: inizializzazione e associazione di ImsService

Rilevamento e verifica del framework di un'implementazione ImsService

Una volta definito correttamente ImsService in AndroidManifest.xml, la piattaforma deve essere configurata per eseguire l'associazione (in modo sicuro) a ImsService quando appropriato. Esistono due tipi di ImsServices a cui il framework si lega:

  1. ImsService di "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. Questo viene configurato utilizzando il file
  2. ImsService "predefinito" del dispositivo: questo è l'ImsService predefinito caricato sul dispositivo da un OEM e dovrebbe essere progettato per fornire servizi IMS in tutte le situazioni in cui un ImsService dell'operatore non è disponibile ed è utile in situazioni in cui il dispositivo non dispone di una scheda SIM inserita o sulla scheda SIM inserita non è installato un operatore ImsService. Questo viene definito nell'overlay del dispositivo utilizzando le seguenti configurazioni:

Android non supporta app con implementazioni ImsService scaricabili da terze parti, pertanto qualsiasi implementazione ImsService definita qui deve essere un'applicazione di sistema e deve risiedere nella cartella /system/priv-app/ o /product/priv-app/ per garantire l'appropriata autorizzazioni (vale a dire autorizzazioni per telefono, microfono, posizione, fotocamera e contatti). Verificando se il nome del pacchetto dell'implementazione IMS corrisponde ai valori CarrierConfig o overlay del dispositivo definiti sopra, vengono associate solo le applicazioni attendibili e preinstallate.

Personalizzazione

Le applicazioni che implementano un ImsService sono vincolate solo ai dispositivi in ​​cui sono configurate come ImsService "override" del gestore o configurazioni ImsService "predefinite" del dispositivo per la funzionalità MMTEL o RCS. ImsService consente inoltre di abilitare o disabilitare dinamicamente le funzionalità IMS che supporta (MMTEL e RCS) tramite aggiornamenti utilizzando il metodo ImsService#onUpdateSupportedImsFeatures . Ciò fa sì che il framework ricalcoli quali ImsService sono vincolati e quali funzionalità supportano. Se l'applicazione IMS aggiorna il framework senza funzionalità supportate, ImsService verrà disconnesso fino al riavvio del telefono o all'inserimento di una nuova scheda SIM corrispondente all'applicazione IMS.

Priorità vincolante per più ImsService

Il framework non può supportare l'associazione a tutti i possibili ImsService precaricati sul dispositivo e si assocerà fino a due ImsService per slot SIM (un ImsService per ciascuna 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 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 funzione Emergency MmTel.

È necessario che il nome del pacchetto del tuo ImsService sia definito in CarrierConfig per ciascuno degli operatori che utilizzeranno quel pacchetto o nell'overlay del dispositivo se il tuo ImsService sarà quello predefinito, come definito sopra.

Analizziamolo per ciascuna funzionalità. Per un dispositivo (single o multi-SIM) con una singola SIM caricata, sono possibili due funzionalità IMS: MMTel e RCS. Il framework tenterà di eseguire il collegamento nell'ordine definito sopra per ciascuna funzionalità e se la funzionalità non è disponibile per l'ImsService definito nell'override della Configurazione dell'operatore, il framework eseguirà il fallback sull'ImsService predefinito. Quindi, ad esempio, la tabella seguente descrive quale funzionalità IMS utilizzerà il framework date tre applicazioni IMS che implementano ImsServices installate su un sistema con le seguenti funzionalità:

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

Validazione

Gli strumenti per verificare l'implementazione dell'IMS stessa non sono inclusi poiché le specifiche dell'IMS sono estremamente ampie e utilizzano apparecchiature di verifica speciali. I test possono solo verificare che il framework di telefonia risponda correttamente all'API ImsService.

Sviluppa un'app IMS

Quando si sviluppa un'app IMS che si interfaccia con lo stack di telefonia Android, è consigliabile specificare che l'app può ascoltare o modificare lo stato dell'istanza ImsService collegata per un abbonamento specifico dell'operatore.

Per ascoltare o modificare lo stato di ImsService per le funzionalità MMTEL e RCS, utilizzare la classe ImsManager per ottenere un'istanza della classe ImsMmTelManager , ImsRcsManager o ProvisioningManager specifica di IMS. L'app può quindi ascoltare gli stati di servizio e provisioning specifici di IMS come:

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

Utilizza ImsStateCallback

Sebbene ImsService sia un servizio associato in modo permanente, il servizio associato potrebbe cambiare quando una nuova scheda SIM o un abbonamento incorporato diventa attivo 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 anomalo in modo invisibile o non è associato a causa di una sottoscrizione o di una modifica della configurazione.

Sui dispositivi che eseguono 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 richiamata per abbonamenti specifici quando ImsService diventa nuovamente disponibile, l'app deve annullare la registrazione o eliminare le richiamate esistenti registrate tramite ImsMmTelManager , ImsRcsManager o ProvisioningManager ; e registrare nuove richiamate.

Se è presente una sottoscrizione 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 risolvere questa condizione, registrare nuovamente l'istanza ImsStateCallback per la sottoscrizione associata chiamando ImsMmTelManager#registerImsStateCallback o ImsRcsManager#registerImsStateCallback .