Die Android-Benachrichtigung wird nicht angezeigt


115

Ich benötige ein Programm, das eine Benachrichtigung auf Android hinzufügt. Und wenn jemand auf die Benachrichtigung klickt, sollte dies ihn zu meiner zweiten Aktivität führen.

Ich habe Code eingerichtet. Die Benachrichtigung sollte funktionieren, aber aus irgendeinem Grund funktioniert sie nicht. Das Notificationwird überhaupt nicht angezeigt. Ich weiß nicht, was ich vermisse.

Code dieser Dateien:

Notification n = new Notification.Builder(this)
        .setContentTitle("New mail from " + "test@gmail.com")
        .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);

Bitte versuchen Sie, präziser zu sein, wenn Sie Fragen stellen. Sie erwähnen nicht, was nicht funktioniert. Tatsächlich erwähnen Sie nicht einmal, dass etwas nicht funktioniert. Wird das Activitynicht gestartet? Wird das Notificationnicht angezeigt?
Slinden77

3
@dmmh ich sagte in meiner Frage, was ist mein Problem! Und ich fand nichts falsch mit der Frage. Meine Frage war spezifisch für das Problem. Wenn Sie kein Experte sind, müssen Sie nicht stupsen! Und die Antwort von tato469 war in Ordnung.
Choudhury AM

3
Ich weise darauf hin, dass der Zweck dieser Website nicht darin besteht, dass Sie Ihre Probleme beheben, sondern dass andere in der Lage sind, auch eine Lösung für Probleme zu finden. Ich stupse nicht. Es tut mir leid, dass ich Ihre Gefühle verletzt habe, aber Tatsache ist, dass Ihre Frage falsch war, die Antwort falsch war und all diese irreführenden Informationen dazu führen werden, dass andere unerfahrene Programmierer, die das gleiche Problem wie Sie haben, Lösungen ausprobieren, die nicht funktionieren basierend auf dem von Ihnen angegebenen Code. Es ist in keinem Fall relevant oder nicht, ob ich ein Experte bin oder nicht. Vor allem nicht, weil ich Recht habe, Ihre Frage ist vage und die andere Antwort ist falsch.
Slinden77

Ich werde darum bitten, diese Frage und die Antwort zu entfernen, da sie irreführend ist. Haben Sie einen guten Tag.
Slinden77

1
hat die Frage geändert, damit die Leute verstehen, was das Problem ist.
Choudhury AM

Antworten:


411

Der Code funktioniert ohne Symbol nicht. Fügen Sie der setSmallIconBuilder-Kette den Aufruf wie folgt hinzu, damit er funktioniert:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) und höher

Android 8 führte eine neue Anforderung zum Festlegen der channelIdEigenschaft mithilfe von a ein 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());

Wie bekomme ich CHANNEL_ID? Bitte helfen Sie
Ananta Prasad

@LAnantaPrasad CHANNEL_ID soll eine Kennung für Sie sein. Es ist das, wonach Sie Benachrichtigungen gruppieren, z. B. eine Chat-Konversation oder einen Gruppenchat.
Casey Daniel

Danke, setChannelIdsind erforderlich. Bevor ich das hinzufüge, wird eine Benachrichtigung auf meinem SONY-Gerät angezeigt, jedoch nicht auf dem SAMSUNG-Gerät.
Wesely


2
Schließen Sie auch die Prüfung ein, if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }da ohne diese Prüfung die Benachrichtigung nicht angezeigt wird, selbst wenn Ihre Geräte-API> = 26 ist.
Koushik Shom Choudhury

57

Eigentlich die Antwort von ƒernando Valle scheint nicht richtig zu sein. Andererseits ist Ihre Frage zu vage, weil Sie nicht erwähnen, was falsch ist oder nicht funktioniert.

Wenn ich mir Ihren Code ansehe, gehe ich davon aus, dass Notification einfach nicht angezeigt wird.

Ihre Benachrichtigung wird nicht angezeigt, da Sie kein Symbol angegeben haben. Obwohl in der SDK-Dokumentation nicht erwähnt wird, dass dies erforderlich ist, ist dies in der Tat sehr wichtigNotification werden es ohne eines nicht anzeigen.

addActionist erst seit 4.1 verfügbar. Zuvor haben Sie die verwendet PendingIntent, um eine zu starten Activity. Sie scheinen a anzugeben PendingIntent, daher liegt Ihr Problem woanders. Logischerweise muss man daraus schließen, dass es das fehlende Symbol ist.


Ich habe dieses Problem gefunden. Aber danke für die richtige Antwort. Ich schätze deine Hilfe sehr.
Choudhury AM

1
Sie sagten, dass addAction erst seit 4.1 verfügbar ist, aber es ist falsch, ich habe es in 2.3 verwendet. Im Referenzhandbuch wird über die Schaltfläche und nicht über die Benachrichtigung gesprochen: "Aktionsschaltflächen werden auf Plattformen vor Android 4.1 nicht angezeigt." Sie können hier überprüfen: AddAction ist in android.support.v4.app enthalten
ƒernando Valle

1
Das OP verwendet Notification.Buildernicht NotificationCompat.Builder, wie Sie vorschlagen. Nur weil es eine Kompatibilitätsbibliothek gibt und diese verwendet werden kann, bedeutet dies nicht, dass die Funktion in der normalen API verfügbar ist. Der von Ihnen bereitgestellte Link legt dies tatsächlich fest. Diese Frage hängt eindeutig zusammen Notification.Builder, wie das Beispiel zeigt. Und die Kompatibilitätsbibliothek enthielt diese Funktion wahrscheinlich erst, nachdem 4.1 verfügbar war. Ihre Antwort ist irreführend, da Sie jetzt vorschlagen, dass sie seit 2.3 verfügbar ist.
Slinden77

Entschuldigung, wenn ich falsch geschrieben habe, ich meine, das ist möglich in 2.3
ƒernando Valle

4
Argh das Symbol !! Ich wusste nicht einmal, dass es fehlte, aber das Hinzufügen behebt das Problem. Habe in der Konsole nichts Nützliches über ein fehlendes Symbol gesehen, scheint lautlos zu scheitern.
Pete

33

Ihnen fehlte das kleine Symbol. Ich habe den gleichen Fehler gemacht und der obige Schritt hat ihn behoben.

Gemäß der offiziellen Dokumentation: Ein Benachrichtigungsobjekt muss Folgendes enthalten:

  1. Ein kleines Symbol, gesetzt von setSmallIcon ()

  2. Ein von setContentTitle () festgelegter Titel

  3. Detailtext , festgelegt durch setContentText ()

  4. Unter Android 8.0 (API-Stufe 26) und höher eine gültige Benachrichtigungskanal-ID, die von setChannelId () festgelegt oder beim Erstellen eines Kanals im NotificationCompat.Builder-Konstruktor bereitgestellt wird.

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


3
Das ist nicht wahr. Wenn Sie mit setContent ein benutzerdefiniertes Benachrichtigungslayout verwenden, ist kein Titel oder Text erforderlich.
Ray Li

11

Dieses ausgelöst mich bis heute, aber ich merkte , es war , weil auf Android 9.0 (Pie), Stören Sie nicht standardmäßig auch alle Benachrichtigungen versteckt, anstatt nur sie wie in Schweigen zu bringen Android 8.1 (Oreo) und vor. Dies gilt nicht für Benachrichtigungen.

Ich mag es, wenn DND für mein Entwicklungsgerät aktiviert ist. Wenn ich also in die DND-Einstellungen gehe und die Einstellung ändere, um die Benachrichtigungen einfach auszuschalten (aber nicht auszublenden), wurde dies für mich behoben.


9

Das Erstellen von Benachrichtigungskanälen ist für Android-Versionen nach Android 8.1 (Oreo) obligatorisch, um Benachrichtigungen sichtbar zu machen. Wenn in Ihrer App keine Benachrichtigungen für Oreo + Androids angezeigt werden, müssen Sie beim Start Ihrer App die folgende Funktion aufrufen:

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

1

Ich denke, dass du das vergisst

addAction(int icon, CharSequence title, PendingIntent intent)

Schauen Sie hier: Aktion hinzufügen


1
Die Methode addAction()ist am nicht verfügbar Notification.Builder.
Slinden77

1
Es existiert, ist aber veraltet. Stattdessen können Sie eine ActionInstanz übergeben, mit der Sie erstellen können Notification.Action.Builder. PS: Verwenden Sie immer die Compat-Alternative (dh NotificationCompat), da Google dazu neigt, Fehler zu beheben und eine bessere Kompatibilität mit ihnen bereitzustellen
Gökhan Barış Aker,

Wenn Sie keine Aktion angeben möchten, verwenden Sie diese einfach .setContentIntent(null)mit dem Builder.
Gökhan Barış Aker

1

Ich hatte das gleiche Problem mit meiner Android-App. Ich habe Benachrichtigungen ausprobiert und festgestellt, dass Benachrichtigungen auf meinem Android-Emulator angezeigt wurden, auf dem ein Android 7.0 (Nougat) -System ausgeführt wurde, während sie auf meinem Telefon mit Android 8.1 (Oreo) nicht ausgeführt wurden.

Nachdem ich die Dokumentation gelesen hatte, stellte ich fest, dass Android eine Funktion namens Benachrichtigungskanal hatte, ohne die Benachrichtigungen auf Oreo-Geräten nicht angezeigt werden. Unten finden Sie den Link zur offiziellen Android-Dokumentation zu Benachrichtigungskanälen.


1

Für mich war es ein Problem mit deviceToken . Überprüfen Sie, ob das Empfänger- und Absender-Token in Ihrer Datenbank ordnungsgemäß aktualisiert wurde oder wo immer Sie darauf zugreifen, um Benachrichtigungen zu senden.

Verwenden Sie beispielsweise Folgendes, um das Gerätetoken beim Start der App zu aktualisieren. Daher wird es immer richtig aktualisiert.

// 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) {

                    }
                });
    }
});

Wo ist das deviceTokendeklariert?
Peter Mortensen

Warum ist onSuccessleer?
Peter Mortensen

@PeterMortensen .. bei Erfolg können Sie alles tun, was Ihre Logik zulässt, z. B. eine neue Absicht beginnen, einen Toast geben oder auf derselben Seite bleiben. Die deviceToken-Deklaration kann vor onCreate auf Ihrer Seite als Private String deviceToken deklariert werden
DragonFire

(Um meinen eigenen Kommentar klarer zu machen: Es gibt zwei onSuccesss - ich bezog mich auf das innere (das leer ist))
Peter Mortensen

1

Sie müssen auch die Datei build.gradle ändern und die verwendete Android SDK-Version hinzufügen:

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

Das hat in meinem Fall wie ein Zauber gewirkt.


0

Benachrichtigungen werden möglicherweise nicht angezeigt, wenn Sie die Benachrichtigungen schnell nacheinander anzeigen oder eine vorhandene stornieren und sie dann sofort wieder anzeigen (z. B. um eine Heads-up-Benachrichtigung auszulösen, um den Benutzer über eine Änderung einer laufenden Benachrichtigung zu benachrichtigen). In diesen Fällen ist das System kann sich entscheiden, nur die Meldung zu blockieren , wenn es darum geht , sie könnten für den Benutzer zu überwältigend / spammy werden.

Bitte beachten Sie, dass dieses Verhalten zumindest auf Lager Android (getestet mit 10) von außen etwas zufällig aussieht: Es passiert nur manchmal und manchmal nicht. Ich vermute, es gibt einen sehr kurzen Zeitraum, in dem Sie nicht zu viele Benachrichtigungen senden dürfen. Ein Anruf NotificationManager.cancel()und dann NotificationManager.notify()kann dann manchmal dieses Verhalten verursachen.

Wenn Sie die Option haben, brechen Sie beim Aktualisieren einer Benachrichtigung diese nicht vorher ab, sondern rufen Sie einfach NotificationManager.notify()mit der aktualisierten Benachrichtigung an. Dies scheint die oben erwähnte Blockierung durch das System nicht auszulösen.


-1

Wenn Sie während der Verwendung eines Benachrichtigungskanals Version> = Android 8.1 (Oreo) verwenden, setzen Sie dessen Bedeutung auf hoch:

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);

1
Was meinst du mit "eine Version> =" ? Meinen Sie "auf Version 8.1 (oder höher)" ? Bitte antworten Sie, indem Sie Ihre Antwort bearbeiten , nicht hier in den Kommentaren (falls zutreffend).
Peter Mortensen

@ PeterMortensen verzeihen Sie mir, dass es nur ein Typ war, danke, dass Sie mich korrigiert haben
Faisal Naseer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.