How to get value from FCM data message in Android?

17,589

Solution 1

To get the Title: from message payload

use:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {


    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    //In case when notification was send in "notification" parameter we need to check wheather data is null or not.
    if (remoteMessage.getData()!=null && remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
        String title = remoteMessage.getData().get("title").toString();
    }


}

EDIT

check if your remoteMessage contain the specific key:

if (remoteMessage.getData()!=null){
 for (Map.Entry<String, String> entry : remoteMessage.getData().entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    Log.d(TAG, "key, " + key + " value " + value);
}}

Solution 2

There are two types of FCM messages:

1) Notification Messages
2) Data Messages

Notification Message Structure:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}

In order to get data from the notification payload/messages:

  @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        if (remoteMessage.getNotification() != null) {
           Log.d(TAG, "Message From " + remoteMessage.getFrom()); //sender ID
           Log.d(TAG, "Notification Title " + remoteMessage.getNotification().getTitle()); //notification title
           Log.d(TAG, "Notification Body " + remoteMessage.getNotification().getBody()); //notification body
        }
   }

Data Message Structure:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

In order to get data from the data payload/messages:

@Override
 public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    if (remoteMessage.getData().size() > 0) {
       Log.d(TAG, "Data: " + remoteMessage.getData()); //Whole data
       Log.d(TAG, "Key Data : " +  remoteMessage.getData().get("key").toString()); //Get specific key data
    }
 }

Solution 3

After many search I have found this answer, it working perfect

To make firebase library to call your onMessageReceived() in the following cases

  1. App in foreground
  2. App in background
  3. App has been killed

you must not put JSON key 'notification' in your request to firebase API but instead use 'data', see below.

The following message will not call your onMessageReceived() when your app is in the background or killed, and you can't customize your notification.

{
   "to": "/topics/journal",
   "notification": {
   "title" : "title",
   "text": "data!",
   "icon": "ic_notification"
    }
}

but instead using this will work

{
  "to": "/topics/dev_journal",
   "data": {
       "text":"text",
       "title":"",
       "line1":"Journal",
       "line2":"刊物"
   }
}

Basically, the message is sent in the argument RemoteMessage along with your data object as Map, then you can manage the notification in onMessageReceived as in the snippet here

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();

     //you can get your text message here.
     String text= data.get("text");


     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        // optional, this is to make beautiful icon
             .setLargeIcon(BitmapFactory.decodeResource(
                                    getResources(), R.mipmap.ic_launcher))  
        .setSmallIcon(smallIcon)  //mandatory
      .......
    /*You can read more on notification here:
    https://developer.android.com/training/notify-user/build-notification.html
    https://www.youtube.com/watch?v=-iog_fmm6mE
    */
}

reference: How to handle notification when app in background in Firebase

Solution 4

You have an extra space character in your "title" parameter:

"title ":"1"

It's hard to see since it's just a space. It should be:

"title":"1"

The reason you're note getting any value is because technically, the key being sent is "title " (with a space), while in your client code, you're only using "title" (without a space).

You should be able to receive it correctly after you remove the extra space.

Share:
17,589

Related videos on Youtube

M.Yogeshwaran
Author by

M.Yogeshwaran

Updated on June 04, 2022

Comments

  • M.Yogeshwaran
    M.Yogeshwaran almost 2 years

    I'm trying to implement FCM notification in my app. I have read FCM data message type will receive notification even when app is in background so am trying to implementing that in onMessageRecieved method am getting unexpected response like this:

    {title =2, message={"Status":"UNASSIGNED","CompanyName":"gd","LastModifiedDateTime":"2017-04-25 18:59:41","IsPartRequired":false,"ProblemCategory":"CONFIGURATION","IsGeneralClaim":false,"RegistrationID":1057,"IncidentCode":"INS\/2017\/04\/25-0010","StatusID":0,"CreatedDateTime":"2017-04-25 18:59:41","IsInstallationCall":false}}
    

    Don't know how to parse this get separate value from title and message let me post my firebase message code:

    public class FireBaseMessage extends FirebaseMessagingService {
        private static final String TAG = "MyFirebaseMsgService";
    
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            super.onMessageReceived(remoteMessage);
          Map<String,String> data = remoteMessage.getData();
            Log.d(TAG, "From: " + data.toString());
    // 
    }
    }
    

    In this log message am getting response like that how to get value from that is try like:

    int title=data.get("title"); 
    

    getting null pointer as this is not in valid format. In my server side i have am trying to post json format like this:

    {
       "to":"es_OToDkj00:APA91bFqxbVMAaXy5fPtDbNVAkIwyVrPCmfGci2otHZPvdRoXPv-oDdjgtLR92Nqe8w6f57nCVceLbc3_zBWsInG9g1Pfdp3LvsMKyuaiYps0L1y3tn0N0XbzGseEI6jyiqs1r-sT9lb",
       "data":{
          "message":{
             "RegistrationID":1057,
             "IncidentCode":"INS/2017/04/25-0010",
             "CompanyName":"ABM INFOTECH",
             "StatusID":5,
             "Status":"ASSIGNED",
             "CreatedDateTime":"2017-04-25T12:03:45",
             "LastModifiedDateTime":"2017-04-25T18:59:41",
             "ProblemCategory":"CONFIGURATION",
             "IsPartRequired":false,
             "IsInstallationCall":false,
             "IsGeneralClaim":false
          },
          "title ":"1"
       }
    

    Don't know where I'm making a mistake. Can anyone help me? Thanks in advance!

    • AL.
      AL. almost 7 years
      Multi-posted question. From here.
  • M.Yogeshwaran
    M.Yogeshwaran almost 7 years
    but look at the json response am getting like this {title =2, message={"Status":"UNASSIGNED","CompanyName":"gd","LastModif‌​iedDateTime":"2017-0‌​4-25 18:59:41","IsPartRequired":false,"ProblemCategory":"CONFIGUR‌​ATION","IsGeneralCla‌​im":false,"Registrat‌​ionID":1057,"Inciden‌​tCode":"INS\/2017\/0‌​4\/25-0010","StatusI‌​D":0,"CreatedDateTim‌​e":"2017-04-25 18:59:41","IsInstallationCall":false}}
  • M.Yogeshwaran
    M.Yogeshwaran almost 7 years
    String title = remoteMessage.getData().get("title").toString();