Android 9 fornisce API per supportare meglio le app di chiamata di terze parti. Le app di chiamata di terze parti in genere si basano su API di telefonia come la trasmissione PHONE_STATE per coesistere con le chiamate telefoniche degli operatori. Di conseguenza,
le app di chiamata di terze parti devono dare la priorità alle chiamate dell'operatore e spesso ricorrono a
rifiutare silenziosamente le chiamate in arrivo nell'app o interrompere una chiamata in corso per
fare spazio a una chiamata dell'operatore.
Le API in Android 9 supportano scenari di chiamate simultanee tra app di terze parti e chiamate dell'operatore. In questo modo, ad esempio, è possibile ricevere una chiamata in arrivo di terze parti mentre si è impegnati in una chiamata operatore. Il framework si assume la responsabilità di garantire che la chiamata dell'operatore venga mantenuta quando l'utente partecipa alla chiamata di terze parti.
In Android 9, le app di chiamata di terze parti sono invitate a implementare la classe
ConnectionService autogestita. Per saperne di più su come creare un'app di chiamata utilizzando questa classe, consulta Creare un'app di chiamata utilizzando la libreria Core-Telecom.
La classe ConnectionService autogestita offre inoltre agli sviluppatori l'opportunità
di attivare la registrazione delle chiamate nella propria app nel registro chiamate di sistema (vedi
EXTRA_LOG_SELF_MANAGED_CALLS). In base ai requisiti del documento
di definizione della compatibilità (CDD) di Android (sezione 7.4.1.2), devi assicurarti
che l'app Telefono o il dialer mostri queste voci del registro chiamate e il nome
dell'app di chiamata di terze parti da cui è stata effettuata la chiamata (per un esempio di come
l'app Dialer AOSP soddisfa questo requisito, vedi Voci del registro chiamate di app
di chiamata di terze parti).
Le app sono responsabili dell'impostazione di CAPABILITY_SUPPORT_HOLD e
CAPABILITY_HOLD sulle connessioni delle proprie app. Tuttavia, è possibile che
un'app non possa mettere in attesa una chiamata in alcune circostanze. Il framework include
disposizioni per la risoluzione di questi tipi di casi.
Scenari
Devi modificare l'app Telefono per gestire i seguenti scenari.
Gestire le chiamate in arrivo che interrompono una chiamata in corso
In uno scenario in cui è in corso una chiamata di terze parti (ad es.in una chiamata SuperCaller) che non supporta la messa in attesa e l'utente riceve una chiamata mobile (ad es. utilizzando il proprio operatore FooCom), l'app Telefono o Dialer deve indicare all'utente che rispondere alla chiamata di rete mobile terminerà la chiamata di terze parti in corso.
Questa esperienza utente è importante perché un'app di chiamata di terze parti potrebbe avere una chiamata in corso che non può essere messa in attesa dal framework. Se rispondi a una nuova chiamata mobile, la chiamata di terze parti in corso viene interrotta.
Per un esempio, vedi l'interfaccia utente nella figura:
Figura 1. Chiamata in arrivo che interrompe una chiamata di terze parti in corso.
L'app Telefono può verificare se una chiamata in arrivo causa la disconnessione di un'altra chiamata controllando gli extra per le chiamate. Assicurati che
EXTRA_ANSWERING_DROPS_FG_CALL sia impostato su TRUE e
EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME sia impostato sul nome dell'app
la cui chiamata viene disconnessa quando si risponde alla chiamata mobile in arrivo.
Voci del registro chiamate da app di chiamata di terze parti
Gli sviluppatori di app di chiamata di terze parti possono attivare la registrazione delle chiamate nella propria app
nel registro chiamate di sistema (vedi EXTRA_LOG_SELF_MANAGED_CALLS). Ciò
significa che è possibile avere voci nel registro chiamate che non riguardano
chiamate di rete mobile.
Quando l'app Telefono AOSP mostra le voci del registro chiamate relative a un'app di chiamata di terze parti, il nome dell'app in cui è stata effettuata la chiamata viene visualizzato nel registro chiamate, come illustrato nella figura:
Figura 2. Voce di log del registro chiamate con il nome dell'app di chiamate di terze parti nell'app Telefono.
Per determinare il nome di un'app associata a una voce di log del registro chiamate, utilizza le colonne
PHONE_ACCOUNT_COMPONENT_NAME e PHONE_ACCOUNT_ID nel
provider del registro chiamate per creare un'istanza di PhoneAccountHandle, che
identifica l'origine di una voce di log del registro chiamate. Esegui la query TelecomManager per ottenere
i dettagli del corso PhoneAccount. Per determinare se una voce di log del registro chiamate proviene da un'app di chiamata di terze parti, controlla le funzionalità di PhoneAccount per vedere se è impostato CAPABILITY_SELF_MANAGED.
Il metodo getLabel di PhoneAccount restituito restituisce il nome
dell'app associata a una voce di log del registro chiamate dell'app di chiamata di terze parti.
Controlli di integrazione del log delle chiamate VoIP
A partire da Android 17 (livello API 37), le app di chiamate VoIP di terze parti
che si integrano con Core-Telecom e CallsManager possono scrivere la cronologia
delle chiamate direttamente nel registro chiamate nativo del sistema Android (CallLog.Calls).
Per garantire la coerenza della privacy dell'utente e la pulizia dei dati nell'ecosistema Android, tutti i dispositivi Android 17 (livello API 37) e versioni successive che dichiarano il flag di funzionalità di telecomunicazioni (android.software.telecom) e hanno il ruolo android.app.role.DIALER devono supportare i controlli di integrazione del registro chiamate VoIP per app in base al Compatibility Definition Document (CDD) di Android.
Requisiti di implementazione del dispositivo
I dispositivi devono fornire una schermata Impostazioni accessibile all'utente (in genere si trova in Impostazioni > Account chiamate > Registri chiamate integrati) che consente agli utenti di visualizzare e attivare/disattivare l'integrazione del registro chiamate per le singole app VoIP di terze parti.
Per soddisfare questo requisito, devi integrare il valore predefinito della piattaforma di stock:
- Integrazione delle impostazioni della piattaforma:assicurati che il tuo dispositivo includa
com.android.phone.settings.PhoneAccountSettingsActivityfornito dalla piattaforma Android predefinita (com.android.phone). - Requisito di risoluzione dell'intent:il dispositivo deve risolvere l'intent
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) nella schermata di gestione della piattaforma di magazzino.
Quando un'app, un prompt di sistema o un link diretto richiama quanto segue, l'intent deve
avviare correttamente PhoneAccountSettingsActivity e non deve generare un
ActivityNotFoundException:
Intent intent = new Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION);
context.startActivity(intent);
Convalida
Per verificare che il tuo dispositivo supporti app di chiamata di terze parti, utilizza l'app di test Telecomm
che implementa la classe ConnectionService autogestita. L'app
si trova in
/packages/services/Telecomm/testapps/.
Crea l'app di test dalla radice del repository di origine Android utilizzando:
mmma packages/services/Telecomm/testapps/Installa l'APK di build utilizzando
adb install -g -r <apk path>. Un'icona di esempio autogestita viene quindi aggiunta ad Avvio app.Tocca l'icona per aprire l'app di test.
Gestire le chiamate in arrivo che interrompono una chiamata in corso
Segui questi passaggi per verificare che una chiamata in arrivo interrompa una chiamata di terze parti in corso.
Figura 3. Testa l'app con implementazioni di esempio della classe ConnectionService.
- Deseleziona l'opzione Holdable.
- Tocca IN USCITA per avviare una nuova chiamata di esempio in uscita.
- Tocca il pulsante ATTIVA per attivare la chiamata.
- Chiama il numero di telefono del dispositivo in fase di test con un altro smartphone. In questo modo viene richiamato lo scenario in cui al dialer viene fornito il nome di un'app, la cui chiamata verrà interrotta.
- Al termine, tocca il pulsante DISCONNETTI nell'app di test.
Voci del registro chiamate da app di chiamata di terze parti
Dopo aver completato i passaggi precedenti, l'app di test dovrebbe aver registrato una chiamata nel log delle chiamate di sistema. Per verificare che il dispositivo registri le chiamate dalle app di chiamata di terze parti, apri l'app Telefono e verifica che la chiamata venga visualizzata nel registro chiamate di sistema.
Controlli di integrazione del log delle chiamate VoIP
Per verificare la conformità al requisito dell'intent di integrazione del registro chiamate VoIP su
Android 17 e versioni successive, esegui il test CtsTelecomTestCases Compatibility Test Suite
(CTS). Questo test verifica oltre i limiti del pacchetto che l'invio di
TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION
(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) sul dispositivo
venga risolto in un gestore di attività esportato valido (controllo resolveActivity).