Cómo crear una notificación con estilo de llamada para apps de llamadas

En Android 12.0 (nivel de API 31) y versiones posteriores, el sistema proporciona la plantilla de notificación CallStyle para distinguir las notificaciones de llamadas de otros tipos de notificaciones. Usa esta plantilla para crear notificaciones de llamadas entrantes o en curso. La plantilla admite notificaciones de formato grande que incluyen información del emisor y acciones obligatorias, como responder o rechazar llamadas.

Debido a que las llamadas entrantes y en curso son eventos de alta prioridad, estas notificaciones reciben la máxima prioridad en el panel de notificaciones. Esta clasificación también permite que el sistema reenvíe estas llamadas priorizadas a otros dispositivos.

La plantilla de notificación de CallStyle incluye las siguientes acciones obligatorias:

  • Responder o Rechazar para las llamadas entrantes
  • Colgar para llamadas en curso
  • Contestar o Colgar para el filtro de llamadas

Las acciones de este estilo aparecen como botones, y el sistema agrega automáticamente los íconos y el texto adecuados. No se admite el etiquetado manual de los botones. Para obtener más información sobre los principios de diseño de notificaciones, consulta Notificaciones.

Notificaciones de estilo de llamada con botones etiquetados
Figura 1: Plantilla de CallStyle para llamadas entrantes y en curso

Las acciones requeridas se pasan como intents, como hangupIntent y answerIntent en las siguientes secciones. Cada uno de estos es una referencia a un token que mantiene el sistema. El token es un objeto liviano que se puede pasar entre diferentes apps y procesos. El sistema es responsable de administrar el ciclo de vida del token y garantizar que el PendingIntent se pueda usar, incluso si la app que lo creó ya no se está ejecutando. Cuando le otorgas un PendingIntent a otra app, le estás dando permiso para realizar la operación especificada, como rechazar o responder. Este permiso se otorga incluso si la app que creó el intent no se está ejecutando. Para obtener más información, consulta la documentación de referencia de PendingIntent.

A partir de Android 14 (nivel de API 34), puedes configurar las notificaciones de llamadas para que no se puedan descartar. Para ello, usa las notificaciones de CallStyle con Notification.FLAG_ONGOING_EVENT a través de Notification.Builder#setOngoing(true).

A continuación, se muestran ejemplos de cómo usar varios métodos con la notificación CallStyle.

// Create a new call, setting incoming caller.
val incomingCaller = Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build()

Llamada entrante

Usa el método forIncomingCall() para crear una notificación de estilo de llamada para una llamada entrante.

// For demonstrative purposes only, should use a well-defined Intents.
val contentIntent =
    PendingIntent.getActivity(context, 0, Intent(), PendingIntent.FLAG_IMMUTABLE)
val declineIntent =
    PendingIntent.getActivity(context, 0, Intent(), PendingIntent.FLAG_IMMUTABLE)
val hangupIntent = PendingIntent.getActivity(context, 0, Intent(), PendingIntent.FLAG_IMMUTABLE)
val answerIntent = PendingIntent.getActivity(context, 0, Intent(), PendingIntent.FLAG_IMMUTABLE)
// Create a call style notification for an incoming call.
val builderForIncomingCall = NotificationCompat.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(R.drawable.ic_logo)
    .setStyle(
        NotificationCompat.CallStyle.forIncomingCall(incomingCaller, declineIntent, answerIntent))
    .addPerson(incomingCaller)

Llamada en curso

Usa el método forOngoingCall() para crear una notificación de estilo de llamada para una llamada en curso.

// Create a call style notification for an ongoing call.
val builderForOngoingCall = NotificationCompat.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(R.drawable.ic_logo)
    .setStyle(
        NotificationCompat.CallStyle.forOngoingCall(callerAtOtherEnd, hangupIntent))
    .addPerson(caller)

Cómo filtrar una llamada

Usa el método forScreeningCall() para crear una notificación de estilo de llamada para filtrar una llamada.

// Create a call style notification for screening a call.
val builder = NotificationCompat.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(R.drawable.ic_logo)
    .setStyle(
        NotificationCompat.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(caller)

Proporciona compatibilidad con más versiones de Android

Asocia las notificaciones de CallStyle en las versiones de la API 30 o anteriores con un servicio en primer plano para asignarles la clasificación alta que se les otorga en el nivel de API 31 o posterior. Además, las notificaciones de CallStyle en la versión 30 o anterior de la API pueden lograr una clasificación similar si se marcan como coloreadas con el método setColorized().

Usa las APIs de Telecom con notificaciones de CallStyle. Para obtener más información, consulta Descripción general del framework de Telecom.