Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

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 a amostra Notificações do Wear (link em inglês).

Construir uma notificação MessagingStyle

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

Observação: as notificações expandidas MessagingStyle exigem 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 de Internet) de responder a mensagens de chat.

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 as respostas serão armazenadas).

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.