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.
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 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 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'azioneandroid.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 tramitetelephony
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'autorizzazioneBIND_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.
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:
- 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
-
config_ims_mmtel_package_override_string
Chiave CarrierConfig per ImsServices che implementa le funzionalità MMTEL. -
config_ims_rcs_package_override_string
per ImsServices che implementa le funzionalità RCS.
-
- 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:
-
config_ims_mmtel_package
: implementa le funzionalità MMTEL -
config_ims_rcs_package
: implementa le funzionalità RCS
-
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à:
- 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 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
.