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 de forma centralizada no app Telefone do sistema e retornem as chamadas diretamente do app Telefone. Este guia descreve as mudanças necessárias nos apps de chamadas VoIP, apps Telefone do sistema, e no gerenciamento das configurações unificadas do histórico de ligações.
Mudanças no app de chamadas
Para integrar seu app VoIP ao registro de chamadas do sistema, siga estas etapas.
Registrar o 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 adicionadas pelo app 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 app quando um usuário seleciona uma entrada de registro de chamadas VoIP no discador para retornar a chamada.
<!-- 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 o registro de chamadas
Depois que o callback é registrado, todas as chamadas são registradas no discador do sistema. Para excluir chamadas individualmente, defina o isLogExcluded
booleano 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, limpa os registros de chamadas antigos. Como o app armazena um mapeamento de UUIDs para detalhes de chamadas 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. Essa prática ajuda a otimizar o armazenamento.
Para acessar a lista atual de UUIDs atribuídos ao app no registro do sistema, use CallLog.Calls.CONTENT_VOIP_URI.
Mudanças no app discador
Siga estas etapas para permitir que o app discador mostre registros de chamadas VoIP e inicie callbacks 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), anexe 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 formalizado e a chave de parâmetro:
Iniciar callbacks no app discador
Para iniciar um callback 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 lançamento inclui uma
TelecomManager.ACTION_CALL_BACK intent, que é uma ação definida pelo sistema
para iniciar uma chamada de retorno. Essa intent contém o UUID da chamada no
extra de 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 configurações unificadas do histórico de ligações
A partir do Android 17 (nível 37 da API), os usuários podem visualizar e ativar/desativar o histórico de chamadas unificado por app nas configurações do sistema (normalmente em Configurações > Contas de chamadas > Registros de chamadas integrados ou diretamente no app discador padrão). Os apps de chamadas de terceiros e os apps discadores podem interagir com essas configurações.
Navegar os usuários até as configurações
Para abrir as configurações unificadas do histórico de ligações, inicie uma Activity com a
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION ação da intent:
val intent = Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION) startActivity(intent)
Quando um usuário desativa o histórico de ligações unificado de um app nas configurações do sistema, o sistema limpa imediatamente e permanentemente todas as entradas de registro de chamadas existentes para esse 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 para
seu app de chamadas nas configurações do sistema ou no discador, registre um broadcast receiver
para a TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE
(android.telecom.action.VOIP_CALL_LOG_PREFERENCE) intent de broadcast:
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 alterna a opção, a plataforma transmite essa intent para o seu
app contendo o estado booleano atualizado no
TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS extra. Em vez de aguardar a verificação periódica em relação a CallLog.Calls, o app pode detectar essa transmissão. Quando o histórico de chamadas unificado está desativado (ou seja, definido como false), o app pode atualizar o estado interno ou realizar uma limpeza, como limpar os mapeamentos de chamadas armazenados em cache localmente usados para o processamento de callback.