wake-up-neo.com

Rufen Sie Benachrichtigungswerte aus einer Benachrichtigung in der Taskleiste des Android Firebase FCM ab

Ich verwende Firebase, um Benachrichtigungen an meine App zu senden. Ich möchte die auf jedem Gerät empfangenen Benachrichtigungen in einer lokalen Datenbank speichern. Das Problem ist, dass die Methode onMessageReceived() nicht aufgerufen wird, wenn sich die App im Hintergrund befindet und eine Benachrichtigung empfangen wird. Stattdessen wird die Benachrichtigung gemäß der Dokumentation zur Taskleiste hinzugefügt. In der Dokumentation wird außerdem Folgendes erwähnt, wenn Sie eine Benachrichtigung erhalten, wenn sich die App im Hintergrund befindet: 

In diesen Fällen wird die Benachrichtigung an die Systemablage des Geräts gesendet, und die Datennutzlast wird in den Extras der Absicht Ihrer Starteraktivität geliefert.

Wenn ich also versuche, auf die Extras in der Absicht zuzugreifen, werden die Schlüssel der Benachrichtigung nicht gefunden. Mein Code in MainActivity.Java:

if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Toast.makeText(this, "Key: " + key + " Value: " + value, Toast.LENGTH_LONG).show();
        }
    }

Die Benachrichtigung, die wir vom Server senden:

{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
  "body" : "great match!",
  "title" : "Portugal vs. Denmark",
  "icon" : "myicon"
  }
}

Hat jemand eine Idee, wie ich die Werte in der Benachrichtigung abrufen kann?

7
riadrifai

Dies ist das beabsichtigte Verhalten (wie Sie in der Dokumentation gesehen haben). Wenn Sie eine notification-only - Nachrichtennutzlast verwenden (die Sie sind), wird onMessageReceived() nur aufgerufen, wenn sich Ihre App in Vordergrund befindet. Andernfalls empfängt die Taskleiste sie.

Die data, auf die in (Hervorhebung meines) verwiesen wird:

In diesen Fällen wird die Benachrichtigung an die Systemablage des Geräts gesendet, und die data - Nutzlast wird in den Extras der Absicht Ihrer Starteraktivität geliefert.

ist die data-Nachrichtennutzlast (siehe Nachrichtentypen ).

Sie müssen eine Payload mit notification und data senden. So wie:

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "notification" : {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
    },
  "data": {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
  }
}

Siehe auch meine Antwort hier .

2
AL.

Sie müssen lediglich Ihr Benachrichtigungs-Push-Format aktualisieren.

Von:

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "notification" : {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
   }
}

Zu

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "data" : {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
   }
}

Erläuterung:

In Ihrem System wird ein Firebase-Dienst ausgeführt, der für alle Apps funktioniert und alle Push-Benachrichtigungen verarbeitet, wenn sie das Tag "notification" enthalten. Wenn jedoch das "data" -Tag enthalten ist, wird nur die Aufgabe an den von der App erstellten Dienst übergeben, wo Sie alles tun können. Für mehr lesen Sie hier Dokumentation: Handle Messages .

2

Es ist keine einfache oder saubere Lösung, Sie können jedoch einen NotificationListenerService verwenden, um für jede Benachrichtigung einen Rückruf zu erhalten. Eine weitere Einschränkung ist, dass nur API 18 und höher unterstützt wird.

0
Bob Snyder

Fügen Sie dies zur Manifestdatei hinzu

        <intent-filter>
            <action Android:name=".MainActivity" />
            <category Android:name="Android.intent.category.DEFAULT" />
        </intent-filter>
0
Amine Laieb