Como exatamente usar Notification.Builder

100

Descobri que estou usando um método obsoleto para notificações (notification.setLatestEventInfo ())

Diz para usar Notification.Builder.

  • Como eu uso isso?

Quando tento criar uma nova instância, ela me diz:

Notification.Builder cannot be resolved to a type
Saariko
fonte
Percebi que isso funciona a partir da API de nível 11 (Android 3.0).
mobiledev Alex

Respostas:

86

Isso está na API 11, portanto, se você estiver desenvolvendo para algo anterior à 3.0, deverá continuar a usar a API antiga.

Atualização : a classe NotificationCompat.Builder foi adicionada ao Pacote de Suporte para que possamos usar isso para oferecer suporte ao nível de API v4 e superior:

http://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html

Femi
fonte
Obrigado. Eu me pergunto por que não menciona isso nas próprias páginas de funções
Saariko
15
Sim: o aviso de depreciação é um pouco prematuro na minha opinião, mas o que eu sei.
Femi
152

Notification.Builder API 11 ou NotificationCompat.Builder API 1

Este é um exemplo de uso.

Intent notificationIntent = new Intent(ctx, YourClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx,
        YOUR_PI_REQ_CODE, notificationIntent,
        PendingIntent.FLAG_CANCEL_CURRENT);

NotificationManager nm = (NotificationManager) ctx
        .getSystemService(Context.NOTIFICATION_SERVICE);

Resources res = ctx.getResources();
Notification.Builder builder = new Notification.Builder(ctx);

builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.some_img)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.some_big_img))
            .setTicker(res.getString(R.string.your_ticker))
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentTitle(res.getString(R.string.your_notif_title))
            .setContentText(res.getString(R.string.your_notif_text));
Notification n = builder.build();

nm.notify(YOUR_NOTIF_ID, n);
Rabi
fonte
13
Vejo que há uma técnica para fazer isso no pacote de suporte v4: NotificationCompat.Builder
stanlick
6
Acho que alguém deveria dizer ao Google que há erros de digitação graves na Notification.Builderpágina de documentos. Eu estava fazendo o que eles diziam, mas não fazia sentido. Eu venho aqui e vejo que é diferente. Agradeço muito a sua resposta, pois me conscientizou do erro que está no documento.
Andy
5
A documentação diz que builder.getNotification()está obsoleto. Diz que você deve usar builder.build().
mneri
26
NotificationBuilder.build () requer API de nível 16 ou superior. Qualquer coisa entre os níveis 11 e 15 da API, você deve usar NotificationBuilder.getNotification ().
Camille Sévigny
4
@MrTristan: Conforme escrito na documentação setSmallIcon(), setContentTitle()e setContentText()são os requisitos mínimos.
caw
70

além da resposta selecionada, aqui está um exemplo de código para a NotificationCompat.Builderclasse de Truques de origem :

// Add app running notification  

    private void addNotification() {



    NotificationCompat.Builder builder =  
            new NotificationCompat.Builder(this)  
            .setSmallIcon(R.drawable.ic_launcher)  
            .setContentTitle("Notifications Example")  
            .setContentText("This is a test notification");  

    Intent notificationIntent = new Intent(this, MainActivity.class);  
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,   
            PendingIntent.FLAG_UPDATE_CURRENT);  
    builder.setContentIntent(contentIntent);  

    // Add as notification  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.notify(FM_NOTIFICATION_ID, builder.build());  
}  

// Remove notification  
private void removeNotification() {  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.cancel(FM_NOTIFICATION_ID);  
}  
ANemati
fonte
5
Primeiro codifique usando o novo construtor Compat que realmente funcionou. Bem feito!
James MV
1
Funcionou bem para mim também. Duas notas: 1) você precisará fazer um ícone 32x32 para o "ic_launcher". Desenho branco em fundo transparente 2) você precisará definir algum número aleatório para int FM_NOTIFICATION_ID = [yourFavoriteRandom];
Anders8
1
muito obrigado, Meu problema foi: quando eu cliquei na notificação 2ª vez, o fragmento anterior foi aberto, e esta linha "PendingIntent.FLAG_UPDATE_CURRENT" resolveu meu problema e fez meu dia
Shruti
4

Notification Builder é estritamente para Android API nível 11 e superior (Android 3.0 e superior).

Portanto, se você não tiver como alvo os tablets Honeycomb, não deverá usar o Notification Builder, mas sim seguir métodos de criação de notificação mais antigos, como o exemplo a seguir .

Ye Myat Min
fonte
4
Você pode usar a Biblioteca de Compatibilidade, para que possa usá-la na API 4 ou superior.
Leandros
3

ATUALIZAÇÃO android-N (março de 2016)

Visite o link Atualizações de notificações para obter mais detalhes.

  • Resposta Direta
  • Notificações em pacote
  • Visualizações personalizadas

O Android N também permite agrupar notificações semelhantes para aparecer como uma notificação única. Para tornar isso possível, o Android N usa o NotificationCompat.Builder.setGroup()método existente . Os usuários podem expandir cada uma das notificações e executar ações como responder e dispensar em cada uma das notificações, individualmente na aba de notificações.

Este é um exemplo pré-existente que mostra um serviço simples que envia notificações usando NotificationCompat. Cada conversa não lida de um usuário é enviada como uma notificação distinta.

Este exemplo foi atualizado para aproveitar as vantagens dos novos recursos de notificação disponíveis no Android N.

código de amostra .

Amit Vaghela
fonte
Olá, você pode dizer como fazer esse método funcionar no Android 6.0 quando estivermos usando o downloader_library. Estou no Eclipse SDK - 25.1.7 || ADT 23.0.X infelizmente || Biblioteca de expansão de APK do Google e biblioteca de licenciamento 1.0
mfaisalhyder
2

Eu estava tendo problemas para criar notificações (desenvolvendo apenas para Android 4.0+). Este link me mostrou exatamente o que eu estava fazendo de errado e diz o seguinte:

Required notification contents

A Notification object must contain the following:

A small icon, set by setSmallIcon()
A title, set by setContentTitle()
Detail text, set by setContentText()

Basicamente, eu estava perdendo um desses. Apenas como base para a solução de problemas com isso, certifique-se de ter pelo menos tudo isso. Espero que isso evite que alguém tenha dor de cabeça.

Nlinscott
fonte
Então, se você pensar: "Eu encontrarei um ícone mais tarde", você não receberá nenhuma notificação de amor. Obrigado por este;)
Nanne
1

Caso isso ajude alguém ... Eu estava tendo muitos problemas com a configuração de notificações usando o pacote de suporte ao testar uma API mais recente. Consegui fazer com que funcionassem no dispositivo mais recente, mas obtive um erro ao testar o dispositivo antigo. O que finalmente funcionou para mim foi excluir todas as importações relacionadas às funções de notificação. Em particular, o NotificationCompat e o TaskStackBuilder. Parece que durante a configuração do meu código no início as importações foram adicionadas da compilação mais recente e não do pacote de suporte. Então, quando quis implementar esses itens mais tarde no eclipse, não fui solicitado a importá-los novamente. Espero que isso faça sentido e que ajude outra pessoa :)

snatr
fonte
1

Funciona mesmo na API 8, você pode usar este código:

 Notification n = 
   new Notification(R.drawable.yourownpicturehere, getString(R.string.noticeMe), 
System.currentTimeMillis());

PendingIntent i=PendingIntent.getActivity(this, 0,
             new Intent(this, NotifyActivity.class),
                               0);
n.setLatestEventInfo(getApplicationContext(), getString(R.string.title), getString(R.string.message), i);
n.number=++count;
n.flags |= Notification.FLAG_AUTO_CANCEL;
n.flags |= Notification.DEFAULT_SOUND;
n.flags |= Notification.DEFAULT_VIBRATE;
n.ledARGB = 0xff0000ff;
n.flags |= Notification.FLAG_SHOW_LIGHTS;

// Now invoke the Notification Service
String notifService = Context.NOTIFICATION_SERVICE;
NotificationManager mgr = 
   (NotificationManager) getSystemService(notifService);
mgr.notify(NOTIFICATION_ID, n);

Ou sugiro seguir um excelente tutorial sobre este

Dondondon
fonte
1

Eu tenho usado

Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Firebase Push Notification")
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder.build());
Nilesh
fonte
0
          // This is a working Notification
       private static final int NotificID=01;
   b= (Button) findViewById(R.id.btn);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Notification notification=new       Notification.Builder(MainActivity.this)
                    .setContentTitle("Notification Title")
                    .setContentText("Notification Description")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .build();
            NotificationManager notificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
            notification.flags |=Notification.FLAG_AUTO_CANCEL;
            notificationManager.notify(NotificID,notification);


        }
    });
}
Manoj Perumarath
fonte
0

Exemplo independente

Mesma técnica desta resposta, mas:

  • independente: copie, cole e ele irá compilar e executar
  • com um botão para você gerar quantas notificações quiser e brincar com IDs de intenção e notificação

Fonte:

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Main extends Activity {
    private int i;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Button button = new Button(this);
        button.setText("click me");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final Notification notification = new Notification.Builder(Main.this)
                        /* Make app open when you click on the notification. */
                        .setContentIntent(PendingIntent.getActivity(
                                Main.this,
                                Main.this.i,
                                new Intent(Main.this, Main.class),
                                PendingIntent.FLAG_CANCEL_CURRENT))
                        .setContentTitle("title")
                        .setAutoCancel(true)
                        .setContentText(String.format("id = %d", Main.this.i))
                        // Starting on Android 5, only the alpha channel of the image matters.
                        // https://stackoverflow.com/a/35278871/895245
                        // `android.R.drawable` resources all seem suitable.
                        .setSmallIcon(android.R.drawable.star_on)
                        // Color of the background on which the alpha image wil drawn white.
                        .setColor(Color.RED)
                        .build();
                final NotificationManager notificationManager =
                        (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.notify(Main.this.i, notification);
                // If the same ID were used twice, the second notification would replace the first one. 
                //notificationManager.notify(0, notification);
                Main.this.i++;
            }
        });
        this.setContentView(button);
    }
}

Testado em Android 22.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fonte