向媒体应用添加通知

在构建处理音频或视频的媒体应用时,请务必使用正确的通知和通知渠道。这样可以确保通知具有以下有价值的功能:

  • 设置通知优先级
  • 不可关闭
  • 为铃声使用音频属性

使用 NotificationChannel.Builder 设置两个通知渠道:一个用于来电,另一个用于进行中的通话。

internal companion object {
    const val TELECOM_NOTIFICATION_ID = 200
    const val TELECOM_NOTIFICATION_ACTION = "telecom_action"
    const val TELECOM_NOTIFICATION_INCOMING_CHANNEL_ID = "telecom_incoming_channel"
    const val TELECOM_NOTIFICATION_ONGOING_CHANNEL_ID = "telecom_ongoing_channel"

    private val ringToneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
}

如需在任何位置显示通知并允许其播放铃声的音频,请将传入通知渠道的重要性设置为“高”。

val incomingChannel = NotificationChannelCompat.Builder(
        TELECOM_NOTIFICATION_INCOMING_CHANNEL_ID,
        NotificationManagerCompat.IMPORTANCE_HIGH,
    ).setName("Incoming calls")
        .setDescription("Handles the notifications when receiving a call")
        .setVibrationEnabled(true).setSound(
            ringToneUri,
            AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .setLegacyStreamType(AudioManager.STREAM_RING)
                .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE).build(),
        ).build()

只有正在进行的调用需要将重要性设置为默认值。使用以下来电样式可允许来电通知不可关闭。

val ongoingChannel = NotificationChannelCompat.Builder(
        TELECOM_NOTIFICATION_ONGOING_CHANNEL_ID,
        NotificationManagerCompat.IMPORTANCE_DEFAULT,
    )
    .setName("Ongoing calls")
    .setDescription("Displays the ongoing call notifications")
    .build()

如需解决用户设备在来电期间处于锁定状态的用例,请使用全屏通知显示 activity,以便用户接听电话。

// on the notification
val contentIntent = PendingIntent.getActivity(
    /* context = */ context,
    /* requestCode = */ 0,
    /* intent = */ Intent(context, TelecomCallActivity::class.java),
    /* flags = */ PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,
)

请参阅为通话应用创建通话样式通知,了解如何使用 CallStyle 将来电通知与其他类型的通知区分开来。