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 CallStyle plantilla de notificación 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 gran formato que incluyen información de la persona que llama y acciones requeridas, como responder o rechazar llamadas.

Como 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 desvíe estas llamadas con prioridad a otros dispositivos.

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

  • Responder o Rechazar para llamadas entrantes
  • Colgar para llamadas en curso
  • Responder o Colgar para el filtrado de llamadas

Las acciones en 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 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 ellos 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 PendingIntent se pueda usar incluso si la app que lo creó ya no se está ejecutando. Cuando le das a otra app un PendingIntent, le otorgas el 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 CallStyle notificaciones con el Notification.FLAG_ONGOING_EVENT a través de Notification.Builder#setOngoing(true).

A continuación, se muestran ejemplos del uso de varios métodos con la notificación CallStyle.

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

Llamada entrante

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

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

Llamada en curso

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

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

Filtrar una llamada

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

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

Proporciona compatibilidad en más versiones de Android

Asocia las notificaciones 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 marcando la notificación como coloreada con el método setColorized().

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