getNotification().getBody() не работает

Я пытаюсь извлечь сообщение из сообщения уведомления google firebase.

вот мой код:

@Override
public void onMessageReceived(RemoteMessage remoteMessage)
{

    Log.d("FROM", "From: " + remoteMessage.getFrom() );
    sendNotification(remoteMessage.getNotification().getBody());
}

remoteMessage.getFrom() возвращает правильное значение, а remoteMessage.getNotification().getBody() вылетает со следующим журналом:

.example.mturky.testfirebase W/dalvikvm: threadid=16: thread exiting with uncaught exception (group=0x4199ccf8)
05-29 18:26:09.886 15436-15583/com.example.mturky.testfirebase W/dalvikvm: threadid=16: uncaught exception occurred
05-29 18:26:09.887 15436-15583/com.example.mturky.testfirebase W/System.err: java.lang.NullPointerException
05-29 18:26:09.887 15436-15583/com.example.mturky.testfirebase W/System.err:     at com.example.mturky.testfirebase.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:31)
05-29 18:26:09.888 15436-15583/com.example.mturky.testfirebase W/System.err:     at com.google.firebase.messaging.FirebaseMessagingService.zzo(Unknown Source)
05-29 18:26:09.888 15436-15583/com.example.mturky.testfirebase W/System.err:     at com.google.firebase.messaging.FirebaseMessagingService.zzn(Unknown Source)
05-29 18:26:09.888 15436-15583/com.example.mturky.testfirebase W/System.err:     at com.google.firebase.messaging.FirebaseMessagingService.zzm(Unknown Source)
05-29 18:26:09.888 15436-15583/com.example.mturky.testfirebase W/System.err:     at com.google.firebase.iid.zzb$2.run(Unknown Source)
05-29 18:26:09.888 15436-15583/com.example.mturky.testfirebase W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-29 18:26:09.889 15436-15583/com.example.mturky.testfirebase W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-29 18:26:09.889 15436-15583/com.example.mturky.testfirebase W/System.err:     at java.lang.Thread.run(Thread.java:841)
05-29 18:26:09.889 15436-15583/com.example.mturky.testfirebase W/dalvikvm: threadid=16: calling UncaughtExceptionHandler
05-29 18:26:09.890 15436-15583/com.example.mturky.testfirebase E/AndroidRuntime: FATAL EXCEPTION: pool-4-thread-1 
Process: com.example.mturky.testfirebase, PID: 15436
java.lang.NullPointerException
at com.example.mturky.testfirebase.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:31)
at com.google.firebase.messaging.FirebaseMessagingService.zzo(Unknown Source)
at com.google.firebase.messaging.FirebaseMessagingService.zzn(Unknown Source)
at com.google.firebase.messaging.FirebaseMessagingService.zzm(Unknown Source)
at com.google.firebase.iid.zzb$2.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

Любая идея, как это исправить?


person Mohammed Turky    schedule 29.05.2016    source источник
comment
Вы получаете исключение NullPointerException - вероятно, remoteMessage равно null или remoteMessage.getNotification() возвращает null, поэтому вызов .getBody() вызывает NullPointerException .   -  person ishmaelMakitla    schedule 29.05.2016
comment
@ishmaelMakitla не нуль, потому что возвращает значение from   -  person Mohammed Turky    schedule 29.05.2016
comment
Но это то, что говорит ваш журнал ошибок: java.lang.NullPointerException at com.example.mturky.testfirebase.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:31) - проверьте конкретную строку.   -  person ishmaelMakitla    schedule 29.05.2016
comment
@ishmaelMakitla да, я знаю, поэтому я не понимаю, в чем проблема   -  person Mohammed Turky    schedule 29.05.2016
comment
Возможно, вам следует добавить оператор журнала для remoteMessage.getNotification() и посмотреть, что он выведет — я подозреваю, что, возможно, это NULL.   -  person ishmaelMakitla    schedule 29.05.2016
comment
Строка 31 @ishmaelMakitla — это строка, в которой существует getNotification().getBody.   -  person Mohammed Turky    schedule 29.05.2016
comment
как вы отправляете сообщение? вы используете свой собственный сервер или консоль firebase?   -  person Diego Giorgini    schedule 30.05.2016
comment
@DiegoGiorgini мой собственный сервер.   -  person Mohammed Turky    schedule 30.05.2016
comment
getBody доступно только в том случае, если вы устанавливаете опцию уведомления: {тело: мое тело} при отправке сообщения. Если вы отправляете полезную нагрузку данных, вы должны использовать метод getData()   -  person Diego Giorgini    schedule 30.05.2016
comment
@DiegoGiorgini .. Большое спасибо, это был трюк :)   -  person Mohammed Turky    schedule 30.05.2016


Ответы (5)


Чтобы расширить мой комментарий, размещенный под вопросом:

remoteMessage.getNotification().getBody() доступен, только если вы отправляете сообщение-уведомление. Либо с помощью консоли firebase, либо с помощью server-api с
полезной нагрузкой = { "notification" : { "body" : "my body"} }

если вы отправляете сообщение с данными, например { "data" : { "mykey" : "myvalue"} }, то на клиенте вы должны использовать метод: remoteMessage.getData()

person Diego Giorgini    schedule 30.05.2016
comment
полезный..!! подскажите, пожалуйста, как отобразить только тело данных, полученных из метода remoteMessage.getData(). В настоящее время я получаю всю полезную нагрузку в виде уведомления в своем приложении, например: {time=01-08-2016 12:35:22, message=demo message} - person Yogesh Patel; 01.08.2016

sendNotification(remoteMessage.getNotification().getBody()); 
  • это для push-уведомления консоли разработчика по умолчанию.

Вы должны использовать

sendNotification(remoteMessage.getData().get("message"));
  • это для пользовательского нажатия с любого сервера, «сообщение» обозначается на стороне сервера.
person Jayakumar    schedule 24.02.2017
comment
Работал для меня .. Большое спасибо :) :) :) :) - person Vatsal Harde; 26.05.2017

Ваш объект post json должен выглядеть так, как показано ниже.

Заголовки:

Content-Type : application/json
Authorization: key=API KEY

JSON-объект

{

    "notification": {
        "title": "Title for the message",
        "body": "message content here"
    },
    "to": "registration id"
}

и используйте строку ниже для вызова метода showNotification, как показано ниже в java.

showNotification(remoteMessage.getData().put("","message"));
person Raman B    schedule 20.10.2016

Ответ: (от @DiegoGiorgini):

getBody доступно только в том случае, если вы устанавливаете опцию уведомления: {тело: "мое тело"} при отправке сообщения. Если вы отправляете полезную нагрузку данных, вы должны использовать метод getData()

person Mohammed Turky    schedule 30.05.2016

  showNotification(remoteMessage.getData().put("","message"));

Это будет работать, если уведомление придет на сервер, а не на консоль.

person Tarun Umath    schedule 20.09.2016
comment
showNotification(remoteMessage.getData().put(,сообщение)); - person Tarun Umath; 20.09.2016