La notification Android ne s'affiche pas

115

J'ai besoin d'un programme qui ajoutera une notification sur Android. Et quand quelqu'un clique sur la notification, cela devrait le conduire à ma deuxième activité.

J'ai établi le code. La notification devrait fonctionner, mais pour une raison quelconque, elle ne fonctionne pas. Le Notificationne montre pas du tout. Je ne sais pas ce qui me manque.

Code de ces fichiers:

Notification n = new Notification.Builder(this)
        .setContentTitle("New mail from " + "[email protected]")
        .setContentText("Subject")
        .setContentIntent(pIntent).setAutoCancel(true)
        .setStyle(new Notification.BigTextStyle().bigText(longText))
        .build();

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after it's selected

notificationManager.notify(0, n);
Choudhury AM
la source
Veuillez essayer d'être plus concis lorsque vous posez des questions. Vous oubliez de mentionner ce qui ne fonctionne pas. En fait, vous ne mentionnez même pas que quelque chose ne fonctionne pas. N'est-ce Activitypas lancé? N'est-ce Notificationpas visible?
slinden77
3
@dmmh j'ai dit dans ma question quel est mon problème! Et je n'ai rien trouvé de mal à la question. Ma question portait spécifiquement sur le problème. Si vous n'êtes pas un expert, pas besoin de piquer! Et la réponse de tato469 était très bien.
Choudhury AM
3
Je souligne que le but de ce site n'est pas que vous résolviez vos problèmes, mais que les autres puissent également trouver une solution aux problèmes. Je ne pique pas. Je suis désolé d'avoir blessé vos sentiments, mais le fait est que votre question était fausse, la réponse était fausse et toutes ces informations trompeuses conduiront d'autres programmeurs novices, qui ont le même problème que vous décrivez, à recourir à des solutions qui ne fonctionnent pas. basé sur le code que VOUS avez fourni. Ce n'est en aucun cas pertinent ou non si je suis un expert ou non. Surtout pas puisque j'ai raison, votre question est vague et l'autre réponse est fausse.
slinden77
Je vais demander de supprimer cette question et la réponse car elle est trompeuse. Bonne journée.
slinden77
1
changé la question, afin que les gens puissent comprendre quel est le problème.
Choudhury AM

Réponses:

412

Le code ne fonctionnera pas sans icône. Alors, ajoutez l' setSmallIconappel à la chaîne de construction comme ceci pour que cela fonctionne:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) et supérieur

Android 8 a introduit une nouvelle exigence de définition de la channelIdpropriété à l'aide d'un fichier NotificationChannel.

private NotificationManager mNotificationManager;

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);

NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");

mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);

mNotificationManager =
    (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

// === Removed some obsoletes
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
    String channelId = "Your_channel_id";
    NotificationChannel channel = new NotificationChannel(
                                        channelId,
                                        "Channel human readable title",
                                        NotificationManager.IMPORTANCE_HIGH);
   mNotificationManager.createNotificationChannel(channel);
  mBuilder.setChannelId(channelId);
}

mNotificationManager.notify(0, mBuilder.build());
Md Imran Choudhury
la source
Comment obtenir CHANNEL_ID? s'il vous plaît aider
Ananta Prasad
@LAnantaPrasad CHANNEL_ID est censé être un identifiant pour vous. C'est ce par quoi vous groupez les notifications, comme une conversation de chat ou une discussion de groupe.
Casey Daniel
Merci, setChannelIdsont nécessaires. Avant d'ajouter cela, la notification s'affiche sur mon appareil SONY mais pas sur l'appareil SAMSUNG.
Wesely
2
Incluez également la vérification if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }car sans cette vérification, la notification n'apparaîtra pas, même si l'API de votre appareil> = 26.
Koushik Shom Choudhury
58

En fait, la réponse de ƒernando Valle ne semble pas correcte. Là encore, votre question est trop vague parce que vous omettez de mentionner ce qui ne va pas ou ce qui ne fonctionne pas.

En regardant votre code, je suppose Notificationque cela ne s'affiche tout simplement pas.

Votre notification ne s'affiche pas, car vous n'avez pas fourni d'icône. Même si la documentation du SDK ne mentionne pas qu'il est nécessaire, c'est en fait tout à fait le cas et vous Notificationne serez pas affiché sans un.

addActionn'est disponible que depuis la version 4.1. Avant cela, vous utilisiez PendingIntentpour lancer un fichier Activity. Vous semblez spécifier a PendingIntent, votre problème est donc ailleurs. Logiquement, il faut en conclure que c'est l'icône manquante.

slinden77
la source
j'ai trouvé ce problème. Mais merci pour la bonne réponse. J'apprécie vraiment votre aide.
Choudhury AM
1
Vous avez dit que addAction n'est disponible que depuis la version 4.1 mais c'est faux, je l'ai utilisé dans la version 2.3. Le manuel de référence parle du bouton et non de la notification: "Les boutons d'action n'apparaîtront pas sur les plates-formes antérieures à Android 4.1." vous pouvez vérifier ici: AddAction est inclus dans android.support.v4.app
ƒernando Valle
1
L'OP utilise Notification.Builder, non NotificationCompat.Builder, comme vous le suggérez. Ce n'est pas parce qu'il existe une bibliothèque de compatibilité et qu'elle peut être utilisée que la fonction est disponible dans l'API normale. Le lien que vous fournissez le stipule en fait. Cette question est clairement liée Notification.Builder, comme le montre l'exemple. Et la bibliothèque de compatibilité n'a probablement inclus cette fonction qu'après la disponibilité de la version 4.1. Votre réponse est trompeuse, car vous suggérez maintenant qu'elle est disponible depuis 2.3.
slinden77
Désolé si je me suis mal exprimé, je veux dire que c'est possible dans 2.3
ƒernando Valle
4
Argh l'icône !! Je n'ai même pas réalisé qu'il manquait, mais l'ajout a résolu le problème. Je n'ai rien vu d'utile dans la console à propos d'une icône manquante, semble échouer silencieusement.
Pete
33

Il vous manquait la petite icône. J'ai fait la même erreur et l'étape ci-dessus l'a résolue.

Selon la documentation officielle: un objet Notification doit contenir les éléments suivants:

  1. Une petite icône, définie par setSmallIcon ()

  2. Un titre, défini par setContentTitle ()

  3. Texte détaillé, défini par setContentText ()

  4. Sur Android 8.0 (niveau d'API 26) et supérieur , un ID de canal de notification valide, défini par setChannelId () ou fourni dans le constructeur NotificationCompat.Builder lors de la création d'un canal.

Voir http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Vijay Srinivasan
la source
3
Ce n'est pas vrai. Si vous utilisez une mise en page de notification personnalisée à l'aide de setContent, aucun titre ou texte n'est requis.
Ray Li
11

Cela m'a fait trébucher aujourd'hui, mais j'ai réalisé que c'était parce que sur Android 9.0 (Pie), Ne pas déranger par défaut masque également toutes les notifications, plutôt que de simplement les faire taire comme dans Android 8.1 (Oreo) et avant. Cela ne s'applique pas aux notifications.

J'aime avoir DND activé pour mon appareil de développement, alors aller dans les paramètres DND et modifier le paramètre pour simplement faire taire les notifications (mais pas les masquer) l'a corrigé pour moi.

Chee-Yi
la source
9

La création de canaux de notification est obligatoire pour les versions d' Android après Android 8.1 (Oreo) pour rendre les notifications visibles. Si les notifications ne sont pas visibles dans votre application pour Oreo + Androids, vous devez appeler la fonction suivante lorsque votre application démarre -

private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name,
       importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviours after this
        NotificationManager notificationManager =
        getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
   }
}
Amit Jaiswal
la source
1

Je pense que tu oublies le

addAction(int icon, CharSequence title, PendingIntent intent)

Regardez ici: Ajouter une action

ƒernando Valle
la source
1
la méthode addAction()n'est pas disponible sur Notification.Builder.
slinden77
1
Il existe, mais obsolète. Au lieu de cela, vous pouvez transmettre une Actioninstance avec laquelle vous pouvez créer Notification.Action.Builder. PS, utilisez toujours l'alternative Compat (c.-à-d. NotificationCompat), car Google a tendance à corriger les bogues et à fournir une meilleure compatibilité avec eux
Gökhan Barış Aker
Si vous ne souhaitez spécifier aucune action, utilisez simplement .setContentIntent(null)avec le générateur.
Gökhan Barış Aker
1

J'ai eu le même problème avec mon application Android. J'essayais des notifications et j'ai constaté que les notifications s'affichaient sur mon émulateur Android qui exécutait un système Android 7.0 (Nougat), alors qu'il ne fonctionnait pas sur mon téléphone doté d' Android 8.1 (Oreo).

Après avoir lu la documentation, j'ai trouvé qu'Android avait une fonctionnalité appelée canal de notification, sans laquelle les notifications ne s'afficheraient pas sur les appareils Oreo. Vous trouverez ci-dessous le lien vers la documentation Android officielle sur les canaux de notification.

SHIVAM CHAUDHARY
la source
1

Pour moi, c'était un problème avec deviceToken. Veuillez vérifier si le jeton du récepteur et de l'expéditeur est correctement mis à jour dans votre base de données ou partout où vous y accédez pour envoyer des notifications.

Par exemple, utilisez ce qui suit pour mettre à jour le jeton d'appareil au lancement de l'application. Par conséquent, il sera toujours mis à jour correctement.

// Device token for push notifications
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
  new OnSuccessListener<InstanceIdResult>() {

    @Override
    public void onSuccess(InstanceIdResult instanceIdResult) {

        deviceToken = instanceIdResult.getToken();

        // Insert device token into Firebase database
        fbDbRefRoot.child("user_detail_profile").child(currentUserId).child("device_token")).setValue(deviceToken)
                .addOnSuccessListener(
                  new OnSuccessListener<Void>() {

                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                });
    }
});
Feu du dragon
la source
Où est-ce deviceTokendéclaré?
Peter Mortensen
Pourquoi est onSuccessvide?
Peter Mortensen
@PeterMortensen .. en cas de succès, vous pouvez faire tout ce que votre logique vous permet, comme lancer une nouvelle intention, porter un toast ou rester sur la même longueur d'onde. En ce qui concerne la déclaration de deviceToken, vous pouvez la déclarer comme Private String deviceToken avant onCreate dans votre page
DragonFire
(Pour rendre mon propre commentaire plus clair: il y a deux onSuccesss - je faisais référence à l'intérieur (qui est vide))
Peter Mortensen
1

Vous devez également modifier le fichier build.gradle et y ajouter la version utilisée du SDK Android:

implementation 'com.android.support:appcompat-v7:28.0.0'

Cela a fonctionné comme un charme dans mon cas.

Ashwin Balani
la source
0

Les notifications peuvent ne pas s'afficher si vous affichez les notifications rapidement l'une après l'autre ou si vous annulez une notification existante, puis si vous l'affichez à nouveau immédiatement (par exemple, pour déclencher une notification pour informer l'utilisateur d'un changement dans une notification en cours). Dans ces cas, le système peut décider de simplement bloquer la notification lorsqu'il estime qu'elle risque de devenir trop envahissante / spammée pour l'utilisateur.

Veuillez noter qu'au moins en stock Android (testé avec 10) de l'extérieur, ce comportement semble un peu aléatoire: cela arrive parfois et parfois non. Je suppose qu'il y a un seuil de temps très court pendant lequel vous n'êtes pas autorisé à envoyer trop de notifications. L'appel NotificationManager.cancel()et puis NotificationManager.notify()peut parfois provoquer ce comportement.

Si vous avez la possibilité, lors de la mise à jour d'une notification, ne l'annulez pas avant, mais appelez simplement NotificationManager.notify()avec la notification mise à jour. Cela ne semble pas déclencher le blocage mentionné ci-dessus par le système.

ubuntudroid
la source
-1

Si vous utilisez la version> = Android 8.1 (Oreo) lorsque vous utilisez un canal de notification, définissez son importance sur élevé:

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
Faisal Naseer
la source
1
Qu'entendez-vous par "une version> =" ? Voulez-vous dire "sur la version 8.1 (ou supérieure)" ? Veuillez répondre en modifiant votre réponse , pas ici dans les commentaires (le cas échéant).
Peter Mortensen
@PeterMortensen pardonnez-moi pour cela c'était juste un type merci de m'avoir corrigé
Faisal Naseer