Os aplicativos VoIP podem integrar as chamadas ao registro de chamadas do sistema. Isso permite que os usuários vejam o histórico de ligações VoIP centralmente no app Telefone do sistema e retornem chamadas diretamente do app Telefone. Este guia descreve as mudanças necessárias em apps de chamadas VoIP, apps Telefone do sistema e gerenciamento de configurações de histórico de ligações unificado.
Mudanças no app de ligações
Para integrar seu app VoIP ao registro de chamadas do sistema, siga estas etapas.
Registrar filtro de intent de callback
Registre a intent protegida pelo sistema TelecomManager.ACTION_CALL_BACK.
Depois que esse filtro de intent for registrado corretamente, todas as chamadas que seu app adicionar usando
CallsManager.addCall ou outras APIs Telecom relacionadas serão registradas
automaticamente pelo sistema. O sistema usa essa intent registrada para enviar um callback ao seu app quando um usuário seleciona uma entrada de registro de chamadas VoIP no discador para retornar a ligação.
<!-- 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>
Excluir geração de registros de chamadas
Depois que o callback é registrado, todas as chamadas são registradas no discador
do sistema. Para excluir chamadas individualmente, defina o booleano isLogExcluded
como true em 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 ), )
Processar callbacks
As chamadas adicionadas por CallsManager.addCall recebem um UUID exclusivo por
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) ) ) }
Verificar entradas de registro de chamadas
O registro de chamadas do sistema mantém um número finito de entradas e, eventualmente,
exclui registros de chamadas antigos. Como o app armazena um mapeamento de UUIDs para detalhes de chamada para processamento de callback, ele precisa verificar periodicamente quais UUIDs ainda estão presentes no registro de chamadas do sistema. Se um UUID não estiver mais no registro
do sistema, o usuário não poderá iniciar um callback para essa chamada, e o app poderá
remover o mapeamento do armazenamento local com segurança. Essa prática ajuda a otimizar o armazenamento.
Para receber a lista atual de UUIDs atribuídos ao app no registro
do sistema, use CallLog.Calls.CONTENT_VOIP_URI.
Mudanças no app Telefone
Siga estas etapas para permitir que o app discador mostre registros de chamadas VoIP e inicie retornos de chamada para apps VoIP.
Mostrar registros de chamadas VoIP no app discador
Por padrão, os registros de chamadas de apps VoIP não aparecem no app discador. Para mostrar os registros de chamadas integrados no app discador, faça o seguinte:
No Android 16.1 (nível 36.1 da API), adicione o parâmetro de consulta
include_voip_callsao provedor de conteúdoCallLog.Callspara mostrar os registros de chamadas VoIP:CallLog.Calls.CONTENT_URI.buildUpon() .appendQueryParameter("include_voip_calls", "true") .build()
No Android 17 (nível 37 da API) e versões mais recentes, use o seguinte provedor de conteúdo e chave de parâmetro formalizados:
Iniciar retornos de chamada no app Telefone
Para iniciar um retorno de chamada de um discador, use TelecomManager.placeCall. A
plataforma usa o CallLog.Calls._ID exclusivo da entrada de registro de chamadas para iniciar
o app VoIP correto. Esse início inclui uma
intent TelecomManager.ACTION_CALL_BACK, que é uma ação definida pelo sistema
para iniciar uma ligação de retorno. Essa intent contém o UUID da chamada no
extra da intent TelecomManager.EXTRA_UUID, permitindo que o app VoIP identifique
qual chamada específica está sendo retornada.
// 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)
Gerenciar as configurações do histórico de ligações unificado
A partir do Android 17 (nível 37 da API), os usuários podem ver e ativar/desativar o histórico de chamadas unificado por app nas configurações do sistema (geralmente em Configurações > Contas de chamadas > Registros de chamadas integrados ou diretamente no app de discagem padrão). Tanto os apps de terceiros para ligações quanto os discadores podem interagir com essas configurações.
Encaminhar usuários para as configurações
Para abrir as configurações do histórico de ligações unificado, inicie uma Activity com a ação da intent
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION:
val intent = Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION) startActivity(intent)
Quando um usuário desativa o histórico unificado de chamadas de um app nas configurações do sistema, o
sistema exclui imediatamente e permanentemente todas as entradas de registro de chamadas desse
pacote do provedor de registro de chamadas nativo (CallLog.Calls). As chamadas futuras
iniciadas ou recebidas para esse app não serão registradas no discador do sistema.
Detectar mudanças de preferências
Para manter a sincronização quando um usuário ativa ou desativa o histórico de ligações unificado no
app de chamadas nas configurações do sistema ou no discador, registre um broadcast receiver
para a intent de transmissão 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 o usuário muda a chave, a plataforma transmite essa intent para seu
app, que contém o estado booleano atualizado no
extra TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS. Em vez de
esperar a verificação periódica em relação a CallLog.Calls, o app pode ficar
aguardando essa transmissão. Quando o histórico unificado de chamadas está desativado (ou seja, definido como
false), seu app pode atualizar o estado interno ou realizar uma limpeza, como
remover os mapeamentos de chamadas armazenados em cache localmente usados para o processamento de callbacks.