Создание уведомления о стиле звонка для приложений для звонков

В Android 12.0 (уровень API 31) и более поздних версиях система предоставляет шаблон уведомлений CallStyle , позволяющий отличать уведомления о звонках от других типов уведомлений. Используйте этот шаблон для создания уведомлений о входящих или текущих звонках. Шаблон поддерживает уведомления большого формата, включающие информацию о звонящем и необходимые действия, такие как ответ или отклонение вызова.

Поскольку входящие и текущие вызовы являются событиями с высоким приоритетом, эти уведомления получают наивысший приоритет в панели уведомлений. Такой порядок также позволяет системе перенаправлять эти приоритетные вызовы на другие устройства.

Шаблон уведомления CallStyle включает следующие обязательные действия:

  • Ответьте на входящие звонки или отклоните их .
  • При наличии продолжающихся звонков, пожалуйста, положите трубку .
  • Ответьте на звонок или положите трубку для предварительного отбора.

Действия в этом стиле отображаются в виде кнопок, при этом система автоматически добавляет соответствующие значки и текст. Ручное добавление подписей к кнопкам не поддерживается. Для получения дополнительной информации о принципах проектирования уведомлений см. раздел «Уведомления» .

Уведомления в стиле звонков с кнопками, на которых есть подписи.
Рисунок 1. Шаблон CallStyle для входящих и текущих звонков.

Необходимые действия передаются в виде интентов, таких как hangupIntent и answerIntent как описано в следующих разделах. Каждый из них представляет собой ссылку на токен, поддерживаемый системой. Токен — это легковесный объект, который может передаваться между различными приложениями и процессами. Система отвечает за управление временем жизни токена и обеспечение возможности использования PendingIntent , даже если приложение, создавшее его, больше не запущено. Когда вы предоставляете другому приложению PendingIntent , вы даете ему разрешение на выполнение указанной операции, например, отклонить или ответить. Это разрешение предоставляется, даже если приложение, создавшее интент, не запущено. Для получения дополнительной информации см. справочную документацию по PendingIntent .

Начиная с Android 14 (уровень API 34), вы можете настроить уведомления о звонках таким образом, чтобы их нельзя было закрыть. Для этого используйте уведомления CallStyle с параметром Notification.FLAG_ONGOING_EVENT через Notification.Builder#setOngoing(true) .

Ниже приведены примеры использования различных методов с уведомлением CallStyle .

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

Входящий звонок

Используйте метод forIncomingCall() для создания уведомления о входящем звонке в стиле всплывающего окна.

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

Текущий звонок

Используйте метод forOngoingCall() для создания уведомления о текущем звонке.

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

Отклонить звонок

Используйте метод forScreeningCall() для создания уведомления в стиле вызова, предназначенного для отсеивания входящих звонков.

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

Обеспечить совместимость с большим количеством версий Android.

В версиях API 30 и более ранних версиях необходимо связать уведомления CallStyle с фоновой службой, чтобы присвоить им высокий ранг, который они получают в API уровня 31 и более поздних версиях. Кроме того, уведомления CallStyle в версиях API 30 и более ранних версиях могут получить аналогичный ранг, если пометить уведомление цветом с помощью метода setColorized() .

Используйте API телекоммуникаций с уведомлениями CallStyle . Для получения дополнительной информации см. Обзор платформы Telecom .