Cómo agregar notificaciones a una app de música

Cuando compilas una app de música que procesa audio o video, es importante usar las notificaciones y los canales de notificaciones correctos. Esto garantiza que las notificaciones tengan las siguientes funciones valiosas:

  • Prioridad de notificaciones
  • No se pueden descartar.
  • Usa atributos de audio para los tonos

Usa NotificationChannel.Builder a fin de configurar dos canales de notificaciones: uno para llamadas entrantes y otro para llamadas activas.

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

Para mostrar la notificación en todas partes y permitir que reproduzca audio del tono, establece la importancia del canal de notificaciones entrantes en alta.

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

Solo las llamadas activas requieren que se establezca la importancia como predeterminada. Usa el siguiente estilo de llamada entrante para permitir que no se puedan descartar las notificaciones de llamadas entrantes.

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

Para abordar casos de uso en los que el dispositivo del usuario esté bloqueado durante una llamada entrante, usa una notificación en pantalla completa para mostrar una actividad que le permita al usuario responder la llamada.

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

Consulta Cómo crear una notificación de estilo de llamada para apps de llamada si quieres obtener instrucciones sobre el uso de CallStyle para distinguir las notificaciones de llamada de otros tipos de notificaciones.