Criar uma notificação expansível

Uma notificação básica geralmente inclui um título, uma linha de texto e ações que o usuário pode realizar em resposta. Para fornecer mais informações, você pode criar notificações grandes e expansíveis aplicando um dos vários modelos de notificação, conforme descrito neste documento.

Para começar, crie uma notificação com todo o conteúdo básico, conforme descrito em Criar uma notificação. Em seguida, chame setStyle() com um objeto de estilo e forneça informações correspondentes a cada modelo, conforme mostrado nos exemplos a seguir.

Adicionar uma imagem grande

Para adicionar uma imagem à notificação, transmita uma instância de NotificationCompat.BigPictureStyle para setStyle().

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_post)
        .setContentTitle(imageTitle)
        .setContentText(imageDescription)
        .setStyle(NotificationCompat.BigPictureStyle()
                .bigPicture(myBitmap))
        .build()

Java

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_post)
        .setContentTitle(imageTitle)
        .setContentText(imageDescription)
        .setStyle(new NotificationCompat.BigPictureStyle()
               .bigPicture(myBitmap))
        .build();

Para que a imagem apareça como uma miniatura apenas enquanto a notificação estiver recolhida, conforme mostrado na figura a seguir, chame setLargeIcon() e transmita a imagem a ele. Em seguida, chame BigPictureStyle.bigLargeIcon() e transmita null para que o ícone grande desapareça quando a notificação for expandida:

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_post)
        .setContentTitle(imageTitle)
        .setContentText(imageDescription)
        .setLargeIcon(myBitmap)
        .setStyle(NotificationCompat.BigPictureStyle()
                .bigPicture(myBitmap)
                .bigLargeIcon(null))
        .build()

Java

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_post)
        .setContentTitle(imageTitle)
        .setContentText(imageDescription)
        .setLargeIcon(myBitmap)
        .setStyle(new NotificationCompat.BigPictureStyle()
                .bigPicture(myBitmap)
                .bigLargeIcon(null))
        .build();
Uma imagem mostrando uma notificação recolhida e uma notificação expandida contendo uma imagem azul
Figura 1. Uma notificação usando NotificationCompat.BigPictureStyle.

Adicionar um bloco grande de texto

Aplique NotificationCompat.BigTextStyle para mostrar texto na área de conteúdo expandido da notificação:

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_mail)
        .setContentTitle(emailObject.getSenderName())
        .setContentText(emailObject.getSubject())
        .setLargeIcon(emailObject.getSenderAvatar())
        .setStyle(NotificationCompat.BigTextStyle()
                .bigText(emailObject.getSubjectAndSnippet()))
        .build()

Java

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_mail)
        .setContentTitle(emailObject.getSenderName())
        .setContentText(emailObject.getSubject())
        .setLargeIcon(emailObject.getSenderAvatar())
        .setStyle(new NotificationCompat.BigTextStyle()
                .bigText(emailObject.getSubjectAndSnippet()))
        .build();
Uma imagem mostrando uma notificação recolhida e uma notificação expandida usando BigTextStyle
Figura 2. Uma notificação usando NotificationCompat.BigTextStyle.

Criar uma notificação no estilo de caixa de entrada

Aplique NotificationCompat.InboxStyle a uma notificação se quiser adicionar várias linhas curtas de resumo, como snippets de e-mails recebidos. Isso permite adicionar várias partes de texto de conteúdo que são truncadas em uma linha, em vez de uma linha contínua de texto fornecida por NotificationCompat.BigTextStyle.

Para adicionar uma nova linha, chame addLine() até seis vezes, conforme mostrado no exemplo a seguir. Se você adicionar mais de seis linhas, apenas as seis primeiras ficarão visíveis.

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.baseline_email_24)
        .setContentTitle("5 New mails from Frank")
        .setContentText("Check them out")
        .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.logo))
        .setStyle(
                NotificationCompat.InboxStyle()
                .addLine("Re: Planning")
                .addLine("Delivery on its way")
                .addLine("Follow-up")
        )
        .build()

Java

Notification notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.baseline_email_24)
        .setContentTitle("5 New mails from Frank")
        .setContentText("Check them out")
        .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.logo))
        .setStyle(
                NotificationCompat.InboxStyle()
                .addLine("Re: Planning")
                .addLine("Delivery on its way")
                .addLine("Follow-up")
        )
        .build();

O resultado é semelhante à figura abaixo:

Uma imagem mostrando uma notificação expandida no estilo de caixa de entrada
Figura 3. Uma notificação expandida no estilo da caixa de entrada.

Mostrar uma conversa em uma notificação

Aplique NotificationCompat.MessagingStyle para mostrar mensagens sequenciais entre qualquer número de pessoas. Essa opção é ideal para apps de mensagens, porque fornece um layout consistente para cada mensagem, processando o nome do remetente e o texto separadamente, e cada mensagem pode ter várias linhas.

Para adicionar uma nova mensagem, chame addMessage(), transmitindo o texto da mensagem, a hora do recebimento e o nome do remetente. Também é possível transmitir essas informações como um objeto NotificationCompat.MessagingStyle.Message, conforme mostrado neste exemplo:

Kotlin

val message1 = NotificationCompat.MessagingStyle.Message(
        messages[0].getText(),
        messages[0].getTime(),
        messages[0].getSender())
val message2 = NotificationCompat.MessagingStyle.Message(
        messages[1].getText(),
        messages[1].getTime(),
        messages[1].getSender())
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_message)
        .setStyle(
                NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                .addMessage(message1)
                .addMessage(message2))
        .build()

Java

NotificationCompat.MessagingStyle.Message message1 =
        new NotificationCompat.MessagingStyle.Message(messages[0].getText(),
                                                      messages[0].getTime(),
                                                      messages[0].getSender());
NotificationCompat.MessagingStyle.Message message2 =
        new NotificationCompat.MessagingStyle.Message(messages[1].getText(),
                                                      messages[1].getTime(),
                                                      messages[1].getSender());

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.new_message)
        .setStyle(new NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                .addMessage(message1)
                .addMessage(message2))
        .build();
Uma imagem mostrando uma notificação no estilo de mensagem
Figura 4. Uma notificação usando NotificationCompat.MessagingStyle.

Ao usar NotificationCompat.MessagingStyle, todos os valores fornecidos para setContentTitle() e setContentText() são ignorados.

Você pode chamar setConversationTitle() para adicionar um título que aparece acima da conversa. Pode ser o nome criado pelo usuário do grupo ou, se ele não tiver um nome específico, uma lista dos participantes da conversa. Não defina um título para conversas individuais, porque o sistema usa a existência desse campo como uma dica de que a conversa é um grupo.

Esse estilo se aplica apenas a dispositivos com o Android 7.0 (nível 24 da API) e versões mais recentes. Ao usar a biblioteca de compatibilidade (NotificationCompat), conforme demonstrado anteriormente, as notificações com MessagingStyle retornam automaticamente para um estilo de notificação expandida com suporte.

Ao criar uma notificação como essa para uma conversa por chat, adicione uma ação de resposta direta.

Criar uma notificação com controles de mídia

Aplique MediaStyleNotificationHelper.MediaStyle para exibir controles de mídia e informações de faixa.

Especifique o MediaSession associado no construtor. Isso permite que o Android mostre as informações certas sobre sua mídia.

Chame addAction() até cinco vezes para exibir até cinco botões de ícones. Chame setLargeIcon() para definir a capa do álbum.

Ao contrário dos outros estilos de notificação, o MediaStyle também permite modificar a visualização de conteúdo recolhido especificando três botões de ação que também aparecem na visualização recolhida. Para isso, forneça os índices do botão de ação para setShowActionsInCompactView().

O exemplo a seguir mostra como criar uma notificação com controles de mídia:

Kotlin

val notification = NotificationCompat.Builder(context, CHANNEL_ID)
        // Show controls on lock screen even when user hides sensitive content.
        .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
        .setSmallIcon(R.drawable.ic_stat_player)
        // Add media control buttons that invoke intents in your media service
        .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
        .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent) // #1
        .addAction(R.drawable.ic_next, "Next", nextPendingIntent) // #2
        // Apply the media style template.
        .setStyle(MediaStyleNotificationHelper.MediaStyle(mediaSession)
                .setShowActionsInCompactView(1 /* #1: pause button \*/))
        .setContentTitle("Wonderful music")
        .setContentText("My Awesome Band")
        .setLargeIcon(albumArtBitmap)
        .build()

Java

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        // Show controls on lock screen even when user hides sensitive content.
        .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
        .setSmallIcon(R.drawable.ic_stat_player)
        // Add media control buttons that invoke intents in your media service
        .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
        .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent)  // #1
        .addAction(R.drawable.ic_next, "Next", nextPendingIntent)     // #2
        // Apply the media style template.
        .setStyle(new MediaStyleNotificationHelper.MediaStyle(mediaSession)
                .setShowActionsInCompactView(1 /* #1: pause button */))
        .setContentTitle("Wonderful music")
        .setContentText("My Awesome Band")
        .setLargeIcon(albumArtBitmap)
        .build();
Imagem que mostra uma notificação com estilo de mídia
Figura 5. Uma notificação usando MediaStyleNotificationHelper.MediaStyle.

Outros recursos

Consulte as referências a seguir para saber mais sobre MediaStyle e notificações expansíveis.