Supporto di app di chiamata di terze parti

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:

Chiamata in arrivo che interrompe una chiamata di terze parti in corso

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:

Voce di log del registro chiamate con app di chiamate di terze parti

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.PhoneAccountSettingsActivity fornito 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/.

  1. Crea l'app di test dalla radice del repository di origine Android utilizzando:

    mmma packages/services/Telecomm/testapps/

  2. Installa l'APK di build utilizzando adb install -g -r <apk path>. Un'icona di esempio autogestita viene quindi aggiunta ad Avvio app.

  3. 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.

Testare l'app per le app di chiamata di terze parti

Figura 3. Testa l'app con implementazioni di esempio della classe ConnectionService.

  1. Deseleziona l'opzione Holdable.
  2. Tocca IN USCITA per avviare una nuova chiamata di esempio in uscita.
  3. Tocca il pulsante ATTIVA per attivare la chiamata.
  4. 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.
  5. 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).