Estilos de notificação no Wear

O Wear OS by Google é compatível com estilos de notificação para melhorar a experiência do usuário em smartwatches.

Os estilos mais comuns de notificação são:

  • BIG_TEXT_STYLE;
  • BIG_PICTURE_STYLE;
  • INBOX_STYLE;
  • MESSAGING_STYLE.

As seções abaixo explicam como adicionar MESSAGING_STYLE e BIG_TEXT_STYLE às suas notificações. Para incorporar outros estilos de notificação, veja o exemplo Notificações do Wear (link em inglês).

Construir uma notificação MessagingStyle

Se você tem um app de mensagens de bate-papo, as notificações precisam usar NotificationCompat.MessagingStyle, que foi adicionado no Android 7.0. O Wear usa as mensagens de bate-papo incluídas em uma notificação MessagingStyle (consulte addMessage()) para oferecer uma boa experiência de app de bate-papo na notificação expandida.

Observação: as notificações expandidas MessagingStyle precisam que você tenha pelo menos a versão 1.5.0.2861804 do app Wear complementar no smartphone Android pareado.

Resposta inteligente

O Wear introduz a Resposta inteligente para notificações MessagingStyle. A Resposta inteligente oferece ao usuário opções que podem ser selecionadas por toque e que são contextualmente relevantes na notificação expandida e no RemoteInput. Isso aumenta a lista de opções que o desenvolvedor fornece em RemoteInput usando o método setChoices().

A Resposta inteligente oferece aos usuários uma maneira rápida (toque único), discreta (sem falar em voz alta), privada (as mensagens recebidas por um usuário nunca deixam o smartwatch) e confiável (sem necessidade de conexão com a Internet) de responder mensagens de bate-papo.

As respostas inteligentes são geradas por um modelo de machine learning no próprio smartwatch, usando o contexto fornecido pela notificação MessagingStyle. Nenhum dado de notificação do usuário é enviado aos servidores Google para gerar respostas inteligentes.

Para ativar a Resposta inteligente para sua ação de notificação, é necessário fazer o seguinte:

  1. Use NotificationCompat.MessagingStyle.
  2. Chame o método setAllowGeneratedReplies(true) para a ação de notificação.
  3. Verifique se a ação de notificação tem um RemoteInput definido (onde a resposta será armazenada).

O exemplo a seguir mostra como criar uma notificação MessagingStyle com respostas inteligentes.

Kotlin

    // Create an intent for the reply action
    val replyPendingIntent = Intent(this, ReplyActivity::class.java).let { replyIntent ->
        PendingIntent.getActivity(this, 0, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT)
    }

    // Create the reply action and add the remote input
    val action = NotificationCompat.Action.Builder(
            R.drawable.ic_reply_icon,
            getString(R.string.label),
            replyPendingIntent
    )
            .addRemoteInput(remoteInput)
            // 1) allow generated replies
            .setAllowGeneratedReplies(true)
            .build()

    val noti = NotificationCompat.Builder(context, channelId)
            .setContentTitle("${messages.size} new messages with $sender")
            .setContentText(subject)
            .setSmallIcon(R.drawable.new_message)
            .setLargeIcon(aBitmap)
            // 2) set the style to MessagingStyle
            .setStyle(
                    NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                            .addMessage(messages[0].text, messages[0].time, messages[0].sender)
                            .addMessage(messages[1].text, messages[1].time, messages[1].sender)
            )
            // 3) add an action with RemoteInput
            .extend(NotificationCompat.WearableExtender().addAction(action)).build()
    

Java

    // Create an intent for the reply action
    Intent replyIntent = new Intent(this, ReplyActivity.class);
    PendingIntent replyPendingIntent =
       PendingIntent.getActivity(this, 0, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    // Create the reply action and add the remote input
    NotificationCompat.Action action =
       new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
       getString(R.string.label), replyPendingIntent)
      .addRemoteInput(remoteInput)
       // 1) allow generated replies
      .setAllowGeneratedReplies(true)
      .build();

    Notification noti = new NotificationCompat.Builder()
        .setContentTitle(messages.length + " new messages with " + sender.toString())
        .setContentText(subject)
        .setSmallIcon(R.drawable.new_message)
        .setLargeIcon(aBitmap)
        // 2) set the style to MessagingStyle
        .setStyle(new NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
        .addMessage(messages[0].getText(), messages[0].getTime(), messages[0].getSender())
        .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getSender()))
        // 3) add an action with RemoteInput
        .extend(new WearableExtender().addAction(action)).build();
    

Adicionar imagens a uma notificação MessagingStyle

Você pode adicionar imagens a uma mensagem de notificação, configurando o tipo MIME adequado e colocando o URI na imagem no método NotificationCompat.MessagingStyle.Message.setData().

Este é um snippet de código para definir dados de imagem de tipo em uma notificação:

Kotlin

    val message = NotificationCompat.MessagingStyle.Message("sticker", 1, "Jeff")
            .setData("image/png", stickerUri)

    val notification = NotificationCompat.Builder(context, channelId)
            .setStyle(
                    NotificationCompat.MessagingStyle("Me").addMessage(message)
            )
            .build()
    

Java

    NotificationCompat.MessagingStyle.Message message = new Message("sticker", 1, "Jeff")
       .setData("image/png", stickerUri);

    NotificationCompat notification = new NotificationCompat.Builder()
        .setStyle(new NotificationCompat.MessagingStyle("Me")
            .addMessage(message))
        .build();
    

No snippet de código acima, a variável stickerUri é um URI que indica um local acessível publicamente, conforme descrito aqui.

Construir uma notificação BigTextStyle

É possível inserir conteúdo de texto expandido na sua notificação usando BIG_TEXT_STYLE. Em um dispositivo portátil, os usuários podem ver o conteúdo completo expandindo a notificação. Em um dispositivo wearable, o conteúdo expandido fica visível por padrão ao usar o BigTextStyle.

Para adicionar conteúdo expandido à notificação, chame setStyle() no objeto NotificationCompat.Builder, passando a ele uma instância de BigTextStyle ou de InboxStyle.

Por exemplo, o código a seguir adiciona uma instância de NotificationCompat.BigTextStyle à notificação do evento para incluir a descrição completa do evento, que tem mais texto do que cabe no espaço fornecido para setContentText().

Kotlin

    // Specify the 'big view' content to display the long
    // event description that may not fit the normal content text.
    val bigStyle = NotificationCompat.BigTextStyle().run {
        bigText(eventDescription)
    }

    val notificationBuilder = NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_event)
            .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.notif_background))
            .setContentTitle(eventTitle)
            .setContentText(eventLocation)
            .setContentIntent(viewPendingIntent)
            .addAction(R.drawable.ic_map, getString(R.string.map), mapPendingIntent)
            .setStyle(bigStyle)
    

Java

    // Specify the 'big view' content to display the long
    // event description that may not fit the normal content text.
    BigTextStyle bigStyle = new NotificationCompat.BigTextStyle();
    bigStyle.bigText(eventDescription);

    NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_event)
            .setLargeIcon(BitmapFactory.decodeResource(
                    getResources(), R.drawable.notif_background))
            .setContentTitle(eventTitle)
            .setContentText(eventLocation)
            .setContentIntent(viewPendingIntent)
            .addAction(R.drawable.ic_map,
                    getString(R.string.map), mapPendingIntent)
            .setStyle(bigStyle);
    

Observe que é possível adicionar uma imagem de ícone grande a qualquer notificação usando o método setLargeIcon(). No entanto, esses ícones aparecem como imagens de plano de fundo grandes em um wearable e não ficam com uma boa aparência, porque são aumentados para caber na tela. Para adicionar a uma notificação uma imagem de plano de fundo específica para wearables, consulte Adicionar recursos específicos de wearable a uma notificação. Para mais informações sobre o design de notificações com imagens grandes, veja os Princípios de design do Wear OS (link em inglês).

Construir uma notificação MediaStyle

É possível usar a classe NotificationCompat.MediaStyle para incluir o controle de reprodução nas notificações. Para que a IU do sistema identifique uma notificação que representa uma sessão de mídia ativa e responda adequadamente (por exemplo, mostrando a capa do álbum na tela de bloqueio), anexe um MediaSession.Token usando o método setMediaSession(MediaSession.Token).

Observação: caso você use NotificationCompat.MediaStyle em uma notificação local sem adicionar uma sessão de mídia, o sistema exibirá a notificação como sendo normal e ignorará os detalhes de estilo de mídia.