Добавление уведомлений в мультимедийное приложение

При создании мультимедийного приложения, обрабатывающего аудио или видео, важно использовать правильные уведомления и каналы уведомлений. Это гарантирует, что уведомления обладают следующими ценными функциями:

  • Иметь приоритет уведомлений
  • Не подлежат увольнению
  • Используйте аудиоатрибуты для мелодий звонка

Используйте 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()

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

// 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 для различения уведомлений о вызовах от других типов уведомлений см. в статье Создание уведомления о стиле вызова для приложений для вызовов .