Reputation: 1861
FCM service:
public class FCMService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.i(Constants.TAG,"onMessageReceived");
Log.i(Constants.TAG, "From: " + remoteMessage.getFrom());
if (remoteMessage.getData().size() > 0) {
Log.d(Constants.TAG, "Message data payload: " + remoteMessage.getData());
}
if (remoteMessage.getNotification() != null) {
Log.d(Constants.TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
}
}
App Gradle:
compile 'com.google.firebase:firebase-messaging:10.2.6'
Manifest:
<service android:name="communications.FCMService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
-I send message from FCM console and don´t arrives. FCM console show me OK when message is sent.
-I send message from java server and message don´t arrives. Java server show me OK when message is sent.
-To send messages I use generated token in Android device.
-Before, I had a mistake to import the FCM library badly, that error is solved. When that past error occurred every time a message was sent, an exception occurred on Android. Now nothing is received.
-I have on the Android device an Internet connection and I receive messages via GCM (not FCM) from another application that I implemented in the past.
-App is in foreground.
Some log with "fcm" filter. I get this log when I send message.
08-14 12:09:25.640 800-4739/? D/PowerManagerService: acquireWakeLockInternal: lock=862109980, flags=0x1, tag="wake:bidsy.app.bidsy/communications.FCMService", ws=null, uid=10354, pid=24073
08-14 12:09:25.640 800-4739/? D/PowerManagerNotifier: onWakeLockAcquired: flags=1, tag="wake:bidsy.app.bidsy/communications.FCMService", packageName=bidsy.app.bidsy, ownerUid=10354, ownerPid=24073, workSource=null
08-14 12:09:25.683 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Creating service: CreateServiceData{token=android.os.BinderProxy@1c269013 className=communications.FCMService packageName=bidsy.app.bidsy intent=null}
08-14 12:09:25.683 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-CREATE_SERVICE handled : 0 / CreateServiceData{token=android.os.BinderProxy@1c269013 className=communications.FCMService packageName=bidsy.app.bidsy intent=null}
08-14 12:09:25.685 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-SERVICE_ARGS handled : 0 / ServiceArgsData{token=android.os.BinderProxy@1c269013 startId=1 args=Intent { act=com.google.firebase.MESSAGING_EVENT pkg=bidsy.app.bidsy cmp=bidsy.app.bidsy/communications.FCMService (has extras) }}
08-14 12:09:25.684 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Calling onStartCommand: communications.FCMService@3e035250, flags=0, startId=1
08-14 12:09:25.691 800-1592/? D/PowerManagerService: releaseWakeLockInternal: lock=862109980 [wake:bidsy.app.bidsy/communications.FCMService], flags=0x0, total_time=52ms
08-14 12:09:25.691 800-1592/? D/PowerManagerNotifier: onWakeLockReleased: flags=1, tag="wake:bidsy.app.bidsy/communications.FCMService", packageName=bidsy.app.bidsy, ownerUid=10354, ownerPid=24073, workSource=null
08-14 12:09:25.692 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Destroying service: communications.FCMService@3e035250
It seems like the message arrives at the service but does not show it.
Of course I do not use any filters in the log to check if the message gets to onMessageReceived
I find similar question here not answered, has same log:
Can't receive the push notification message
After looking at the whole log in detail I have seen that when I send a message the following Firebase error occurs:
D / FirebaseMessaging: Unknown intent action: com.google.firebase.MESSAGING_EVENT
Solution to my problem is here:
Upvotes: 13
Views: 18499
Reputation: 3512
Your messages, that are send from somewhere, need to have a data payload and no notification payload, or they won't arrive consistently inside of "onMessageReceived" in your MessagingService.
Notification messages contain a predefined set of user-visible keys. Data messages, by contrast, contain only your user-defined custom key-value pairs. Notification messages can contain an optional data payload.
("Notification messages can contain an optional data payload"
, this will only get submitted to your service, if your application is in foreground!)
Messages created from the console will always be notification-messages!
You can't send plain data-messages, that will consistently arrive at your service through the firebase-console. This is only possible via the REST-API (FCM protocols) or the Admin SDK.
One more important thing:
If you send Notification Messages with a data payload, that you wish to handle, you must handle not only it via the service if the app is in foreground, but also gathering the data from the Intent that your Launch-Activity will receive, which will be opened, if the user clicks the notification! The data payload will be inside of the intent!
Notification Messages and Data Messages.
If the app is in foreground, they will call onMessageReceived
(you need to handle the display of the notification on your own)
If the application is background, the notification will be displayed (user system tray) and if there is a data payload, it is delivered in the extras of the intent of your launcher Activity.
From the docs:
Client app is responsible for processing data messages. Data messages have only custom key-value pairs. (! once again - only custom key-value pairs)
You can read about the message types here: Fcm Message Types
The data payload is a simple json entry, additionally in your payload and can have simple key, value pairs.
Example:
"data": {
"eventId" : "1",
"flavors" : "alpha",
"minFcmVersion" : "3",
"showFallbackOnLowVersion" : "false"
}
Inside of the console, you can add the data payload, if you enter something below the "extended options" field:
Messages created from the console will always be notification-messages!
At first, send a firebase cloud message via the console, directly to your device (use the fcm token) and add a simple data-payload with example values. Now check if your services onMessageReceived is called. (You app must be in foreground!)
Backend
With the REST API you can send Data-Messages, that only contain custom key-value pairs and will always arrive to your service!
Your backend should compose the message itself and add a data payload. This is somewhat described here: HTTP protocol data payload
You can also test a backend wise sent message via one of the several http request builder you find online. I like: hurl.it and
Post
to:
com.google.firebase:firebase-messaging:20.0.0
<- use this, or higher
That said, there was a bug in versions lower then '11.0.4'
.
Further good to read documentation here: Receive Messages Documentation And a good explanation on message types as an SOF Answer: SOF - Answer - Message Types
Upvotes: 21
Reputation: 4510
try below cases
Make sure your java server code are in right order , for example
HttpResponse response = Unirest.post("https://fcm.googleapis.com/fcm/send") .header("authorization", "key=your_firebase_key") .header("content-type", "application/json") .header("cache-control", "no-cache") .header("postman-token", "836e187a-c342-ce8a-3a2d-f541a4d8e416") .body("{\r\n\"to\" :\"your_device_token\",\r\n\"data\" : {\r\n\"message\": \"Checking pushnotification\"\r\n}\r\n\t\r\n}") .asString();
Upvotes: 0