如何从Android中的FCM数据消息中获取价值?

M.Y*_*ran 5 android firebase firebase-cloud-messaging

我正在尝试在我的应用中实施FCM通知.我已阅读FCM数据消息类型即使在应用程序处于后台时也会收到通知,所以我试图在onMessageRecieved方法中实现这样的意外响应,如下所示:

{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}}
Run Code Online (Sandbox Code Playgroud)

不知道如何解析这个从标题和消息中获取单独的值让我发布我的firebase消息代码:

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());
// 
}
}
Run Code Online (Sandbox Code Playgroud)

在这条日志消息中我得到的反应是如何从中获取价值的尝试如下:

int title=data.get("title"); 
Run Code Online (Sandbox Code Playgroud)

获取空指针,因为它不是有效格式.在我的服务器端,我试图发布像这样的json格式:

{
   "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"
   }
Run Code Online (Sandbox Code Playgroud)

不知道我在哪里弄错了.谁能帮我?提前致谢!

raf*_*007 8

获取标题:来自消息有效负载

使用:

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


}
Run Code Online (Sandbox Code Playgroud)

编辑

检查您的remoteMessage是否包含特定密钥:

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);
}}
Run Code Online (Sandbox Code Playgroud)


Sum*_*kla 6

FCM 消息有两种类型:

1) 通知消息
2) 数据消息

通知消息结构:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

为了从通知负载/消息中获取数据:

  @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
        }
   }
Run Code Online (Sandbox Code Playgroud)

数据消息结构:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

为了从数据有效负载/消息中获取数据:

@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
    }
 }
Run Code Online (Sandbox Code Playgroud)