Histórico de ligações unificado

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 nos apps de chamadas VoIP e nos apps Telefone do sistema.

Mudanças no app de chamadas

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 app quando um usuário seleciona uma entrada do 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 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 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 chamar detalhes para o 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 com segurança o mapeamento do armazenamento local. Essa prática ajuda a otimizar o armazenamento.

Para conferir 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 da API 36.1), adicione o parâmetro de consulta include_voip_calls ao provedor de conteúdo CallLog.Calls para 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 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 início inclui um 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)