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 notificaciones CallStyle para distinguir las notificaciones de llamadas de otros tipos. Usa esta plantilla para crear notificaciones de llamadas entrantes o en curso. La plantilla admite notificaciones de gran formato que incluyen información de la persona que llama y acciones requeridas, como responder o rechazar llamadas.

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

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

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

Las acciones con este estilo aparecen como botones, y el sistema agrega automáticamente íconos y texto apropiados. 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, por ejemplo, hangupIntent y answerIntent en las siguientes secciones. Cada una de ellas 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 la vida útil del token y garantizar que se pueda usar PendingIntent, incluso si la app que lo creó ya no está en ejecución. Cuando le otorgas un PendingIntent a otra app, le otorgas permiso para realizar la operación especificada, como rechazarla o responderla. Este permiso se otorga incluso si la app que creó el intent no está en ejecución en ese momento. 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 hacerlo, usa las notificaciones de CallStyle con el Notification.FLAG_ONGOING_EVENT a través de Notification.Builder#setOngoing(true).

Los siguientes son ejemplos de cómo usar varios métodos con la notificación CallStlye.

Kotlin

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

Java

// Create a new call with the user as the caller.
Person incomingCaller = new 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.

Kotlin

// Create a call style notification for an incoming call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
    .addPerson(incomingCaller)

Java

// Create a call style notification for an incoming call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forIncomingCall(caller, 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.

Kotlin

// Create a call style notification for an ongoing call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forOngoingCall(caller, hangupIntent))
    .addPerson(second_caller)

Java

// Create a call style notification for an ongoing call.
Notification.Builder builder = new Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forOngoingCall(caller, hangupIntent))
    .addPerson(second_caller);

Filtrar una llamada

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

Kotlin

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

Java

// Create a call style notification for screening a call.
Notification.Builder builder = new Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(second_caller);

Proporciona compatibilidad con más versiones de Android

Asocia las notificaciones de CallStyle en las versiones de 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 versiones posteriores. Además, las notificaciones CallStyle en la versión de API 30 o anteriores pueden lograr una clasificación similar si se marcan como coloreadas, con el método setColorized().

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