Historial de llamadas unificado

Las aplicaciones de VoIP pueden integrar sus llamadas en el registro de llamadas del sistema. Esto permite que los usuarios vean su historial de llamadas de VoIP de forma centralizada en la app de marcador del sistema y que devuelvan llamadas directamente desde ella. En esta guía, se describen los cambios necesarios en las apps de llamadas de VoIP y apps de marcador del sistema.

Cambios en la app de llamadas

Para integrar tu app de VoIP en el registro de llamadas del sistema, sigue estos pasos.

Registra el filtro de intents de devolución de llamada

Registra el intent protegido por el sistema TelecomManager.ACTION_CALL_BACK.

Una vez que este filtro de intents esté registrado correctamente, el sistema registrará automáticamente cualquier llamada que agregue tu app con CallsManager.addCall o cualquier otra API de Telecom relacionada. El sistema usa este intent registrado para enviar una devolución de llamada a tu app cuando un usuario selecciona una entrada del registro de llamadas de VoIP en el marcador para devolver la llamada.

<!-- 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>

Excluye el registro de llamadas

Una vez que se registra la devolución de llamada, todas las llamadas se registran en el marcador del sistema. Para excluir llamadas por llamada, establece el valor isLogExcluded booleano en true dentro de 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
        ),
)

Controla las devoluciones de llamada

Las llamadas agregadas a través de CallsManager.addCall obtienen un UUID único a través de 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 las entradas del registro de llamadas

El registro de llamadas del sistema mantiene una cantidad finita de entradas y, finalmente, borra los registros de llamadas antiguos. Debido a que la app almacena una asignación de UUID a los detalles de la llamada para el control de la devolución de llamada, debe verificar periódicamente qué UUID aún están presentes en el registro de llamadas del sistema. Si un UUID ya no está en el registro del sistema, el usuario no puede iniciar una devolución de llamada para esa llamada, y la app puede quitar de forma segura la asignación de su almacenamiento local. Esta práctica ayuda a optimizar el almacenamiento.

Para obtener la lista actual de UUID atribuidos a la app dentro del registro del sistema, usa CallLog.Calls.CONTENT_VOIP_URI.

Cambios en la app de marcador

Sigue estos pasos para permitir que la app de marcador muestre los registros de llamadas de VoIP y que inicie devoluciones de llamada a las apps de VoIP.

Muestra los registros de llamadas de VoIP en la app de marcador

De forma predeterminada, los registros de llamadas de las apps de VoIP no aparecen en la app de marcador. Para mostrar los registros de llamadas integrados en la app de marcador, haz lo siguiente:

  • En Android 16.1 (nivel de API 36.1), agrega el parámetro de consulta include_voip_calls al proveedor de contenido CallLog.Calls para mostrar los registros de llamadas de VoIP:

    CallLog.Calls.CONTENT_URI.buildUpon()
        .appendQueryParameter("include_voip_calls", "true")
        .build()

  • En Android 17 (nivel de API 37) y versiones posteriores, usa el siguiente proveedor de contenido formalizado y clave de parámetro:

Inicia devoluciones de llamada desde la app de marcador

Para iniciar una devolución de llamada desde un marcador, usa TelecomManager.placeCall. La plataforma usa el CallLog.Calls._ID único de la entrada del registro de llamadas para iniciar la app de VoIP correcta. Este inicio incluye un TelecomManager.ACTION_CALL_BACK intent, que es una acción definida por el sistema para iniciar una devolución de llamada. Este intent contiene el UUID de la llamada en el extra de intent TelecomManager.EXTRA_UUID, lo que permite que la app de VoIP identifique a qué llamada específica se está devolviendo.

// 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)