How to get value from FCM data message in Android?

2020-02-06 03:02发布

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!

3条回答
Melony?
2楼-- · 2020-02-06 03:43

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);
}}
查看更多
放我归山
3楼-- · 2020-02-06 03:45

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.

查看更多
该账号已被封号
4楼-- · 2020-02-06 03:47

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
    }
 }
查看更多
登录 后发表回答