Comment utiliser exactement Notification.Builder

100

J'ai trouvé que j'utilise une méthode obsolète pour les noficitations (notification.setLatestEventInfo ())

Il dit d'utiliser Notification.Builder.

  • Comment l'utiliser?

Lorsque j'essaye de créer une nouvelle instance, cela me dit:

Notification.Builder cannot be resolved to a type
Saariko
la source
J'ai remarqué que cela fonctionne à partir du niveau d'API 11 (Android 3.0).
mobiledev Alex

Réponses:

86

Ceci est dans l'API 11, donc si vous développez pour quelque chose d'avant 3.0, vous devez continuer à utiliser l'ancienne API.

Mise à jour : la classe NotificationCompat.Builder a été ajoutée au Support Package afin que nous puissions l'utiliser pour prendre en charge le niveau d'API v4 et plus:

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

Femi
la source
Merci. Je me demande pourquoi il ne mentionne pas cela sur les pages de fonctions elles
Saariko
15
Ouais: l'avertissement de dépréciation est un peu prématuré à mon avis, mais que sais-je.
Femi
152

Notification.Builder API 11 ou NotificationCompat.Builder API 1

Ceci est un exemple d'utilisation.

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
la source
13
Je vois qu'il existe une technique pour le faire dans le package de support v4: NotificationCompat.Builder
stanlick
6
Je pense que quelqu'un devrait dire à Google qu'il a de graves fautes de frappe dans la Notification.Builderpage de documentation. Je faisais ce qu'ils disaient mais cela n'avait aucun sens. Je viens ici et je vois que c'est différent. J'apprécie vraiment votre réponse car elle m'a fait prendre conscience de l'erreur qui se trouve sur la doc.
Andy
5
La documentation dit builder.getNotification()est obsolète. Il dit que vous devriez utiliser builder.build().
mneri
26
NotificationBuilder.build () nécessite le niveau d'API 16 ou supérieur. Tout ce qui se situe entre les niveaux d'API 11 et 15, vous devez utiliser NotificationBuilder.getNotification ().
Camille Sévigny
4
@MrTristan: comme indiqué dans la documentation setSmallIcon(), setContentTitle()et setContentText()sont les exigences minimales.
caw
70

en plus de la réponse sélectionnée, voici un exemple de code pour la NotificationCompat.Builderclasse de Source Tricks :

// 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);  
}  
ANémati
la source
5
Premier code utilisant le nouveau générateur de compatibilité qui a réellement fonctionné. Bien joué!
James MV
1
A bien fonctionné pour moi aussi. Deux remarques: 1) vous devrez créer une icône 32x32 pour le "ic_launcher". Dessin blanc sur fond transparent 2) vous devrez définir un nombre aléatoire pour int FM_NOTIFICATION_ID = [yourFavoriteRandom];
Anders8
1
merci beaucoup, mon problème était: quand j'ai cliqué sur la notification la deuxième fois, le fragment précédent était ouvert, et cette ligne "PendingIntent.FLAG_UPDATE_CURRENT" a résolu mon problème et a fait ma journée
Shruti
4

Notification Builder est strictement pour Android API de niveau 11 et supérieur (Android 3.0 et supérieur).

Par conséquent, si vous ne ciblez pas les tablettes Honeycomb, vous ne devriez pas utiliser le Générateur de notifications, mais plutôt suivre des méthodes de création de notifications plus anciennes comme l' exemple suivant .

Ye Myat Min
la source
4
Vous pouvez utiliser la bibliothèque de compatibilité afin de pouvoir l'utiliser sur l'API 4 ou une version ultérieure.
Leandros
3

MISE À JOUR android-N (mars-2016)

Veuillez visiter le lien Notifications des mises à jour pour plus de détails.

  • Réponse directe
  • Notifications groupées
  • Affichages personnalisés

Android N vous permet également de regrouper des notifications similaires pour qu'elles apparaissent comme une seule notification. Pour rendre cela possible, Android N utilise l'existantNotificationCompat.Builder.setGroup() méthode . Les utilisateurs peuvent développer chacune des notifications et effectuer des actions telles que répondre et ignorer chacune des notifications, individuellement à partir de la nuance de notification.

Il s'agit d'un exemple préexistant qui montre un service simple qui envoie des notifications à l'aide de NotificationCompat. Chaque conversation non lue d'un utilisateur est envoyée sous forme de notification distincte.

Cet exemple a été mis à jour pour tirer parti des nouvelles fonctionnalités de notification disponibles dans Android N.

exemple de code .

Amit Vaghela
la source
salut, pouvez-vous dire comment faire fonctionner cette méthode sous Android 6.0 lorsque nous utilisons downloader_library. Je suis sur Eclipse SDK - 25.1.7 || ADT 23.0.X malheureusement || Bibliothèque d'extension Google APK et bibliothèque de licences à la fois 1.0
mfaisalhyder
2

J'avais un problème à créer des notifications (en développement uniquement pour Android 4.0+). Ce lien m'a montré exactement ce que je faisais de mal et dit ce qui suit:

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()

En gros, il me manquait un de ceux-ci. Juste comme base de dépannage avec cela, assurez-vous que vous disposez au minimum de tous ces éléments. Espérons que cela évitera à quelqu'un d'autre un mal de tête.

Nlinscott
la source
Donc si vous pensez: "Je trouverai une icône plus tard", vous n'obtiendrez aucune notification-amour. Merci pour celui-ci;)
Nanne
1

Au cas où cela aiderait quelqu'un ... J'avais beaucoup de mal à configurer les notifications à l'aide du package de support lors des tests avec une API plus récente et plus ancienne. J'ai pu les faire fonctionner sur le nouvel appareil, mais j'obtiendrais un test d'erreur sur l'ancien appareil. Ce qui a finalement fonctionné pour moi, c'est de supprimer toutes les importations liées aux fonctions de notification. En particulier le NotificationCompat et le TaskStackBuilder. Il semble que lors de la configuration de mon code au début, les importations ont été ajoutées à partir de la version la plus récente et non du package de support. Ensuite, lorsque j'ai voulu implémenter ces éléments plus tard dans eclipse, je n'ai pas été invité à les importer à nouveau. J'espère que cela a du sens et que cela aide quelqu'un d'autre :)

snatr
la source
1

Cela fonctionne même dans l'API 8, vous pouvez utiliser ce code:

 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 je suggère de suivre un excellent tutoriel à ce sujet

Dunondon
la source
1

j'ai utilisé

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
la source
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
la source
0

Exemple autonome

Même technique que dans cette réponse mais:

  • autonome: copiez-collez et il sera compilé et exécuté
  • avec un bouton vous permettant de générer autant de notifications que vous le souhaitez et de jouer avec les identifiants d'intention et de notification

La source:

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);
    }
}

Testé sous Android 22.

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