Le applicazioni VoIP possono integrare le proprie chiamate nel registro chiamate di sistema. In questo modo, gli utenti possono visualizzare la cronologia delle chiamate VoIP in modo centralizzato nell'app Telefono di sistema e richiamare direttamente dall'app Telefono. Questa guida descrive le modifiche necessarie alle app di chiamata VoIP, alle app Telefono di sistema e alla gestione delle impostazioni della cronologia chiamate unificata.
Modifiche per l'app di chiamata
Per integrare l'app VoIP con il registro chiamate di sistema, segui questi passaggi.
Registra il filtro per intent di callback
Registra l'intent protetto dal sistema TelecomManager.ACTION_CALL_BACK.
Una volta registrato correttamente questo filtro per intent, tutte le chiamate aggiunte dall'app utilizzando
CallsManager.addCall o altre API Telecom correlate verranno registrate automaticamente
dal sistema. Il sistema utilizza questo intent registrato per inviare in un secondo momento un callback alla tua app quando un utente seleziona una voce di log delle chiamate VoIP nell'app Telefono per richiamare.
<!-- Activity to handle the callback intent from the system dialer --> <activity android:name=".VoipCallActivity" android:exported="true"> <!-- Register callback intent --> <intent-filter> <action android:name="android.telecom.action.CALL_BACK" /> </intent-filter> </activity>
Escludi la registrazione delle chiamate
Una volta registrato il callback, tutte le chiamate vengono registrate nell'app Telefono di sistema. Per escludere le chiamate in base alla singola chiamata, imposta il isLogExcluded
valore booleano su true in CallAttributesCompat.
CallAttributesCompat( displayName = displayName, address = address, isLogExcluded = excludeCallLogging, // to exclude call from logging direction = if (isIncoming) { CallAttributesCompat.DIRECTION_INCOMING } else { CallAttributesCompat.DIRECTION_OUTGOING }, callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL, callCapabilities = ( CallAttributesCompat.SUPPORTS_SET_INACTIVE or CallAttributesCompat.SUPPORTS_STREAM or CallAttributesCompat.SUPPORTS_TRANSFER ), )
Gestisci i callback
Le chiamate aggiunte tramite CallsManager.addCall ricevono un UUID univoco tramite
CallControlScope.getCallId.
// check the intent action for CALL_BACK if (intent.action == TelecomManager.ACTION_CALL_BACK) { launchCall( // fetching stored call details for the UUID to initiate callback callDetails = getCallDetails( uuid = intent.getStringExtra(TelecomManager.EXTRA_UUID) ) ) }
Verifica le voci del registro chiamate
Il registro chiamate di sistema mantiene un numero finito di voci e alla fine elimina i vecchi record delle chiamate. Poiché l'app memorizza una mappatura degli UUID ai dettagli delle chiamate per la gestione dei callback, deve controllare periodicamente quali UUID sono ancora presenti nel registro chiamate di sistema. Se un UUID non è più presente nel log di sistema, l'utente non può avviare un callback per quella chiamata e l'app può rimuovere in sicurezza la mappatura dalla sua memoria locale. Questa pratica consente di ottimizzare lo spazio di archiviazione.
Per ottenere l'elenco corrente degli UUID attribuiti all'app nel log di sistema, utilizza CallLog.Calls.CONTENT_VOIP_URI.
Modifiche per l'app Telefono
Segui questi passaggi per consentire all'app Telefono di visualizzare i registri chiamate VoIP e avviare i callback alle app VoIP.
Visualizza i registri chiamate VoIP nell'app Telefono
Per impostazione predefinita, i registri chiamate delle app VoIP non vengono visualizzati nell'app Telefono. Per visualizzare i registri chiamate integrati nell'app Telefono:
Su Android 16.1 (livello API 36.1), aggiungi il parametro di query
include_voip_callsal content providerCallLog.Callsper visualizzare i registri chiamate VoIP:CallLog.Calls.CONTENT_URI.buildUpon() .appendQueryParameter("include_voip_calls", "true") .build()
Su Android 17 (livello API 37) e versioni successive, utilizza il seguente content provider formalizzato e la seguente chiave di parametro:
Avvia i callback dall'app Telefono
Per avviare un callback da un'app Telefono, utilizza TelecomManager.placeCall. La
piattaforma utilizza l'CallLog.Calls._ID univoco della voce di log del registro chiamate per avviare
l'app VoIP corretta. Questo avvio include un
TelecomManager.ACTION_CALL_BACK intent, che è un'azione definita dal sistema
per avviare una richiamata. Questo intent contiene l'UUID della chiamata nell'
extra di intent TelecomManager.EXTRA_UUID, che consente all'app VoIP di identificare
la chiamata specifica che viene richiamata.
// Uri generated with unique ID of the call log entry to launch the respective VoIP app for callback val address = ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI, callId) // extra information required to initiate callback val extras = Bundle() telecomManager.placeCall(address, extras)
Gestisci le impostazioni della cronologia chiamate unificata
A partire da Android 17 (livello API 37), gli utenti possono visualizzare e attivare/disattivare la cronologia chiamate unificata per ogni app nelle impostazioni di sistema (in genere in Impostazioni > Account di chiamata > Registri chiamate integrati o direttamente nell'app Telefono predefinita). Sia le app di chiamata di terze parti sia le app Telefono possono interagire con queste impostazioni.
Indirizza gli utenti alle impostazioni
Per aprire le impostazioni della cronologia chiamate unificata, avvia un'attività con l'TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION azione intent:
val intent = Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION) startActivity(intent)
Quando un utente disattiva la cronologia chiamate unificata per un'app nelle impostazioni di sistema, il sistema elimina immediatamente e definitivamente tutte le voci del registro chiamate esistenti per quel pacchetto dal provider del registro chiamate nativo (CallLog.Calls). Le chiamate future avviate da o ricevute per quell'app non verranno registrate nell'app Telefono di sistema.
Ascolta le modifiche delle preferenze
Per rimanere sincronizzata quando un utente attiva o disattiva la cronologia chiamate unificata per
la tua app di chiamata nelle impostazioni di sistema o nell'app Telefono, registra un ricevitore di trasmissione
per l'intent di trasmissione TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE
(android.telecom.action.VOIP_CALL_LOG_PREFERENCE):
val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE) { // Status of the Unified Call History of the app val isEnabled = intent.getBooleanExtra( TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS, true ) } } }
Quando l'utente attiva/disattiva l'opzione, la piattaforma trasmette questo intent alla tua
app contenente lo stato booleano aggiornato nell'
TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS extra. Anziché attendere la verifica periodica rispetto a CallLog.Calls, la tua app può ascoltare questa trasmissione. Quando la cronologia chiamate unificata è disattivata (ovvero impostata su false), l'app può aggiornare il suo stato interno o eseguire la pulizia, ad esempio cancellando le mappature delle chiamate memorizzate nella cache locale utilizzate per la gestione dei callback.