web-dev-qa-db-fra.com

Récupérer les valeurs de notification d'une notification dans la barre d'état système Android firebase FCM

J'utilise firebase pour envoyer des notifications à mon application. Je souhaite enregistrer les notifications reçues sur chaque appareil dans une base de données locale. Le problème est que, lorsque l'application est en arrière-plan et qu'une notification est reçue, la méthode onMessageReceived() ne sera pas appelée, mais la notification sera ajoutée à la barre d'état système conformément à la documentation. La documentation mentionne également les éléments suivants pour recevoir une notification lorsque l'application est en arrière-plan: 

Dans ces cas, la notification est transmise à la barre d'état système du périphérique et la charge utile de données est livrée dans les extras de l'intention de votre activité de lanceur.

Ainsi, lorsque j'essaie d'accéder aux extras de l'intention, les clés de la notification ne sont pas trouvées ... Mon code dans 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();
        }
    }

La notification que nous envoyons du serveur:

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

Tout le monde a une idée de la façon dont je peux récupérer les valeurs dans la notification?

7
riadrifai

C'est le comportement prévu (comme vous l'avez vu dans la documentation ). Si vous utilisez une charge notification-only (que vous êtes), onMessageReceived() ne sera appelé que si votre application est en premier plan, sinon la corbeille système la recevra.

La data à laquelle il est fait référence dans (la soulignement)

Dans ce cas, la notification est transmise à la barre d'état système du périphérique et la charge utile data est livrée dans les extras de l'intention de votre activité de lanceur.

est la charge de message data (voir Types de message ).

Vous devrez envoyer une charge avec notification et data. Ainsi:

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

Voir aussi ma réponse ici .

2
AL.

Tout ce que vous avez à faire est de mettre à jour votre format de notification Push.

De:

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

À

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

Explication:

Votre système exécute un service firebase qui fonctionne pour toutes les applications et gère toutes les notifications Push s'il contient la balise "notification". mais si ne contient que la balise "data", il ne fait que transférer la tâche au service créé par l'application où vous pouvez tout faire. Dans votre cas, affichez la notification de l'utilisateur et enregistrez-la sur la base de données locale. Pour en savoir plus, lisez ici Documentation: Handle Messages .

2

Ce n'est pas une solution simple ou propre, mais vous pouvez utiliser un NotificationListenerService pour recevoir un rappel pour chaque notification. Une autre limitation est qu'il ne prend en charge que les API 18 et supérieures.

0
Bob Snyder

Ajouter ceci au fichier manifeste

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