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

В 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 incoming caller.
val incomingCaller = Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build()

Входящий вызов

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

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

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

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

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

Как фильтровать звонки

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

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

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

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

Используйте Telecom API с уведомлениями CallStyle. Подробнее о фреймворке Telecom…