为通话应用创建通话样式通知

在 Android 12.0(API 级别 31)及更高版本中,系统提供 CallStyle 通知模板,用于区分来电通知和 其他类型的通知使用此模板创建传入或 进行中的通话通知。该模板支持大幅面通知 包含来电者信息和所需操作(例如接听或 拒接来电。

由于来电和正在进行的通话属于高优先级活动,因此这些通知 在通知栏中收到最高优先级通知。这种排名还会使 用于将优先级优先的呼叫转接到其他设备。

CallStyle 通知模板包含以下必需操作:

  • 接听拒接来电。
  • 挂断正在进行通话。
  • 接听挂断以进行来电过滤。

此样式的操作显示为按钮,系统会自动添加 适当的图标和文字。不支持手动标记按钮。 如需详细了解通知设计原则,请参阅 通知

带有带标签按钮的通话样式通知
图 1. 适用于来电和正在进行的通话的 CallStyle 模板。

所需操作以 intent 形式传递,例如 hangupIntentanswerIntent。以上每个参数都是对 由系统维护的令牌令牌是一个轻量级对象, 可在不同的应用和进程之间传递系统 负责管理令牌的生命周期并确保 即使创建 PendingIntent 的应用不再 。如果您向另一个应用提供 PendingIntent, 拥有执行指定操作(例如拒绝或接听)的权限。 即使创建 intent 的应用也会授予此权限 目前没有运行。如需了解详情,请参阅参考文档。 (针对PendingIntent)。

从 Android 14(API 级别 34)开始,您可以配置来电通知 不可关闭。为此,请结合使用 CallStyle 通知和 Notification.FLAG_ONGOING_EVENTNotification.Builder#setOngoing(true)

以下是将各种方法与 CallStyle 搭配使用的示例 通知。

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();

来电

使用 forIncomingCall() 方法为 来电。

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

当前通话

使用 forOngoingCall() 方法为 通话中。

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

过滤来电

使用 forScreeningCall() 方法为以下事件创建通话样式通知: 来电过滤

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

与更多 Android 版本兼容

将 API 版本 30 或更低版本的 CallStyle 通知与 前台服务,以便为他们指定在 API 中授予的较高排名 31 或更高级别。此外,API 版本 30 上会有 CallStyle 通知 或更早版本 使用 setColorized() 方法着色。

将 Telecom API 与 CallStyle 通知搭配使用。如需了解详情,请参阅 Telecom 框架概览