Получить значение из RemoteMessage из метода FCM onMessageReceived

У меня есть миграция gcm to fcm для push-уведомления. но как я получаю данные пакета из RemoteMessage, полученного методом onMesssageReceived.

Old GCM give bundle data onMessageReceiced method but in FCM there is RemoteMessage data.

Поэтому, пожалуйста, скажите мне, как я анализирую удаленное сообщение, чтобы получить всю ценность уведомления.

МОЯ ЗАРПЛАТА

{
"collapse_key":"score_update",
"priority":"high",
"content_available":true,
"time_to_live":108,
"delay_while_idle":true,
"data": 
{ 
    "message": "Message for new task",
    "time": "6/27/2016 5:24:28 PM"
},
"notification": {
    "sound": "simpleSound.wav",
    "badge": "6",
    "title": "Test app",
    "icon": "myicon",
    "body": "hello 6 app",
    "notification_id" : "1140",
    "notification_type" : 1,
    "notification_message" : "TEST MESSAGE",
    "notification_title" : "APP"
  },
"registration_ids": ["cRz9SJ-gGuo:APA91bFJPX7_d07AR7zY6m9khQro81GmSX-7iXPUaHqqcOT0xNTVsOZ4M1aPtoVloLNq71-aWrMCpIDmX4NhMeDIc08txi6Vc1mht56MItuVDdA4VWrnN2iDwCE8k69-V8eUVeK5ISer"
]
}

person Jatin Patel    schedule 07.07.2016    source источник
comment
Эта ссылка может вам помочь: stackoverflow.com/a/56231468/7254873   -  person Sumit Shukla    schedule 21.05.2019


Ответы (4)


В FCM вы получили RemoteMessage вместо Bundle.

Ниже приведен способ, который я использовал в своем приложении, где данные - это мой RemoteMessage.

Map<String, String> data = remoteMessage.getData()
int questionId = Integer.parseInt(data.get("questionId").toString());
String questionTitle = data.get("questionTitle").toString();
String userDisplayName = data.get("userDisplayName").toString();
String commentText = data.get("latestComment").toString();

Ниже приведены данные моего уведомления, которые я отправляю с сервера.

{
  "registration_ids": "",
  "data": {
    "questionId": 1,
    "userDisplayName": "Test",
    "questionTitle": "Test",
    "latestComment": "Test"
  }
}

Таким образом, вы должны проанализировать каждое поле в соответствии с вашим ответом. Поскольку я отладил код, вы получите карту в своем RemoteMessage и примените эти поля к соответствующим типам данных, поскольку все эти данные поступают в виде строки.

person Drup Desai    schedule 07.07.2016
comment
Спасибо за ваш ответ, но мои другие данные в объекте уведомления не в объекте данных, тогда как я могу его получить - person Jatin Patel; 07.07.2016
comment
Как вы уже упоминали в комментарии, вы получите результат от remoteMessage.getNotification(). Можете ли вы попробовать это.. - person Drup Desai; 08.07.2016
comment
нет функции message.get - person Dean Blakely; 27.06.2018
comment
get метод карты. Сначала вам нужно вызвать RemoteMessage.getData(). - person Drup Desai; 10.09.2018
comment
И не забудьте вызвать метод toString() для remoteMessage.getData.get(). - person mia; 20.09.2018
comment
У меня на самом деле нет метода get. У меня есть remoteMessage.zzds, и там есть ArrayMap с фактическими значениями. Любая идея, как получить его оттуда? - person f.trajkovski; 20.05.2020
comment
@f.trajkovski вы можете получить его с помощью метода remoteMessage.getData(), который фактически возвращает Map‹String, String› - person Drup Desai; 20.05.2020
comment
Я не смог получить такие данные, но моя проблема была на стороне сервера. Я отправлял сообщение в неправильном формате, поэтому у меня была пустая карта. - person f.trajkovski; 24.05.2020

Вот фрагмент кода, который в значительной степени говорит сам за себя.

Вы получаете данные в виде карты

public void onMessageReceived(RemoteMessage remoteMessage)
        {
            Log.e("dataChat",remoteMessage.getData().toString());
            try
            {
                Map<String, String> params = remoteMessage.getData();
                JSONObject object = new JSONObject(params);
                Log.e("JSON_OBJECT", object.toString());
          }
       }

Убедитесь, что с сервера вы отправляете данные в правильном формате, то есть в ключе «данные».

вот демонстрационный файл Json

{
  "to": "registration_ids",
  "data": {
    "key": "value",
    "key": "value",
    "key": "value",
    "key": "value"
  }
}
person Pritish Joshi    schedule 07.07.2016
comment
Спасибо за ваш ответ, но мои другие данные в объекте уведомления не в объекте данных, тогда как я могу их получить. - person Jatin Patel; 07.07.2016
comment
remoteMessage.getData() возвращает пустой массив - person Ajay Mistry; 02.08.2017

Для ваших данных, которые выглядят так:

"data":{ 
    "message": "Message for new task",
    "time": "6/27/2016 5:24:28 PM"
}

ты должен пройти через них

Log.d(TAG, "Key Data : " +  remoteMessage.getData().get("message").toString());
Log.d(TAG, "Key Data : " +  remoteMessage.getData().get("time").toString());

Оберните их в try catch, чтобы быть уверенным

person Al-Punk    schedule 17.01.2020

Тип развлечения getData() – это Map<String, String>. Таким образом, вы можете получить data значения объекта, как мы обычно получаем с Map<String, String>.

"data": {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4"
  }

тогда вам нужно получить вот так в котлине

val data = remoteMessage.data
val key1 = data[key1]
val key2  = data[key2]// you can fetch like this

Для getNotification() типом является Notification объект

val notification: Notification =  remoteMessage.notification
val message = notification.body
val title = notification.title // you can fetch by accessing Notification class member

Вот подробная информация о Объект уведомления

person Krishna Sony    schedule 08.02.2021