Ao criar um app de mídia que processa áudio ou vídeo, é importante usar notificações e canais de notificação corretos. Isso garante que as notificações tenham os seguintes recursos valiosos:
- Têm prioridade de notificação
- Não podem ser dispensados
- Usar atributos de áudio para toques
Use NotificationChannel.Builder
para configurar dois canais de notificação: um para
para chamadas recebidas e a outra para chamadas ativas.
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 exibir a notificação em todos os lugares e permitir que ela reproduza áudio para o toque, defina a importância do canal de notificação recebida para 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()
Apenas as chamadas ativas precisam que a importância seja definida como padrão. Use o seguindo o estilo de chamadas recebidas para permitir que as notificações de chamadas recebidas sejam e não dispensável.
val ongoingChannel = NotificationChannelCompat.Builder(
TELECOM_NOTIFICATION_ONGOING_CHANNEL_ID,
NotificationManagerCompat.IMPORTANCE_DEFAULT,
)
.setName("Ongoing calls")
.setDescription("Displays the ongoing call notifications")
.build()
Para resolver casos de uso em que o dispositivo do usuário fica bloqueado durante uma ligação, faça o seguinte: usar uma notificação em tela cheia para mostrar uma atividade que permita ao usuário atender a chamada.
// 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,
)
Confira instruções em Criar uma notificação de estilo de chamada para apps de chamadas.
usar CallStyle
para diferenciar notificações de chamadas de outros tipos
notificações.