Firebase Cloud Messaging - onMessageReceived not working

I want to create a simple notification function in my application. I followed this YouTube video and both the Firebase 1 and 2 documentation docs as well as the Firebase tool assistant in Android Studio (which says I'm connected to Firebase). For some reason, following these steps and the documents in my older application (which code is listed below), it will not allow me to receive notifications. However, if I follow the same steps in a completely new application, it works fine. I tested both applications on the same physical device and in the background, in active and completed states. Every time a new demo application created by me works without problems, but my old application that I want to receive does not work. Both are tested without obtaining a device identifier. I don't even get any error logs or TAG logs. I think one of my compiled projects is interfering, not exactly what, but I might have to look there.

I also checked all these SO posts: 1 2 3 or more

PS. I removed the name of my package below, I checked FireBase several times, and they match, so I know this is not a problem. However, my new FireBase demo application shows that my application is connected, but my old FireBase application did not. Also, I set the bounty before and still faced the same problem.

Here is my problematic code:

Notification.java (its service, as in the documentation)

public class Notification extends FirebaseMessagingService { public Notification() { } @Override public void onMessageReceived(RemoteMessage remoteMessage) { showNotification(remoteMessage.getData().get("message")); Log.d("FMC", "Message Notification Body: " + remoteMessage.getNotification().getBody()); } private void showNotification(String message) { Intent i=new Intent(this, SplashScreen.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent=PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder=new NotificationCompat.Builder(this) .setAutoCancel(true) .setContentTitle("FCM TITLE").setContentText(message) .setSmallIcon(R.drawable.pt_icon) .setDefaults(android.app.Notification.DEFAULT_ALL) .setContentIntent(pendingIntent); NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(0,builder.build()); } } 

Note that I did not even receive the log in the .java notification above.

Project.gradle

 buildscript { repositories { jcenter() maven { url 'https://maven.google.com/' name 'Google' } } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' classpath 'com.google.gms:google-services:3.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() maven { url "https://jitpack.io" } maven { url 'https://maven.google.com' } google() } } task clean(type: Delete) { delete rootProject.buildDir } 

app.gradle

 apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultConfig { minSdkVersion 16 targetSdkVersion 26 versionCode 16 versionName "2.6" } dexOptions { jumboMode = true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } //Code below is added to fix random error ("Fix the issues identified by lint") lintOptions { abortOnError false } productFlavors { } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') //compile project(path: ':backend', configuration: 'android-endpoints') //Removed the 0.2.+ compile 'com.daprlabs.aaron:cardstack:0.3.1-beta0' //noinspection GradleCompatible compile 'com.android.support:appcompat-v7:25.4.0' compile "com.android.support:appcompat-v7:19.0.+" compile 'com.android.support:design:23.4.0' compile 'com.android.support:recyclerview-v7:23.4.0' compile 'com.android.support:cardview-v7:23.4.0' compile 'com.github.danylovolokh:video-player-manager:0.2.0' compile 'com.github.danylovolokh:list-visibility-utils:0.2.0' implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.google.firebase:firebase-messaging:11.8.0' compile 'com.google.firebase:firebase-core:11.8.0' compile 'com.orhanobut:dialogplus: 1.11@aar ' compile 'com.nineoldandroids:library:2.4.0' compile files('libs/sinch-android-rtc-3.9.14.jar') compile 'com.amazonaws:aws-android-sdk-s3:2.4.4' compile 'com.github.chrisbanes:PhotoView:1.2.6' compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0' compile 'com.github.amlcurran.showcaseview:library:5.4.3' compile 'com.github.d-max:spots-dialog: 0.7@aar ' compile 'com.victor:lib:1.0.4' compile 'com.github.bumptech.glide:glide:3.5.2' compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.android.support:recyclerview-v7:23.0.0' compile 'me.grantland:autofittextview:0.2.0' compile 'com.wang.avi:library:1.0.5' compile 'com.nineoldandroids:library:2.4.0' compile 'com.braintreepayments.api:drop-in:2.3.8' compile 'com.braintreepayments.api:braintree:2.3.9' compile 'com.loopj.android:android-async-http:1.4.9' compile 'com.getbase:floatingactionbutton:1.10.1' compile 'com.mxn.soul:flowingdrawer-core:1.2.2' compile 'com.github.rengwuxian:MaterialEditText:2.1.4' compile 'com.github.PhilJay:MPAndroidChart:v3.0.1' compile 'net.gotev:uploadservice:3.2.5' compile 'in.srain.cube:ultra-ptr:1.0.11' compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha9' testCompile 'junit:junit:4.12' //implementation 'com.android.support:appcompat-v4:23.+' } apply plugin: 'com.google.gms.google-services' 

AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-feature android:name="android.hardware.microphone" android:required="false" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- so the app can be found on tablets Google Play <uses-permission android:name="android.permission.CALL_PHONE" /> --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> --> <!-- <uses-permission android:name="android.permission.WAKE_LOCK" /> --> <!-- <uses-permission android:name="android.permission.READ_PHONE_STATE" /> --> <grant-uri-permission android:path="string" android:pathPattern="string" android:pathPrefix="string" /> <application android:allowBackup="true" android:icon="@mipmap/_icon" android:label="" android:supportsRtl="true" android:theme="@style/Theme.AppCompat.Light.NoActionBar" tools:node="replace"> <activity android:name=".SplashScreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".Notification"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- &lt;!&ndash; --> <!-- Set custom default icon. This is used when no icon is set for incoming notification messages. --> <!-- See README() for more. --> <!-- &ndash;&gt; --> <!-- <meta-data --> <!-- android:name="com.google.firebase.messaging.default_notification_icon" --> <!-- android:resource="@drawable/pt_icon" /> --> <!-- &lt;!&ndash; --> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming --> <!-- notification message. See README() for more. --> <!-- &ndash;&gt; --> <!-- <meta-data --> <!-- android:name="com.google.firebase.messaging.default_notification_color" --> <!-- android:resource="@color/colorAccent" /> --> <activity android:name=".SignInForm" /> <activity android:name=".SignUpPage" /> <activity android:name=".SellerFillOutForm" /> <activity android:name=".BuyerFillOutForm" /> <activity android:name=".BuyerHomePage" android:label="@string/title_activity_buyer_home_page" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" /> <activity android:name=".VideoPlayerActivity" /> <activity android:name=".BackgroundTask" /> <service android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService" android:enabled="true" /> <activity android:name=".EnterCreditCard" /> <activity android:name=".PickMeeting" /> <activity android:name=".HowBillingWorks" /> <activity android:name=".ReBillingPlan" /> <activity android:name=".PayBill" /> <activity android:name=".Buyer_Home_Page" android:configChanges="locale|orientation" /> <activity android:name=".Seller_Home_Page" /> <activity android:name=".ProductList" /> <activity android:name=".EditProduct" /> <activity android:name=".EditSellerAccount" /> <activity android:name=".EditBuyerAccount" /> <activity android:name=".Video_Calling.incomingVideoCall" /> <activity android:name=".Video_Calling.CallScreenActivity" /> <activity android:name=".SellerAnalytics" /> <activity android:name=".Swipe_Layout.SwipeLayout" /> <activity android:name=".Swipe_Layout.PopUpActivity" /> </application> </manifest> 

The working code is below (the application I made to check my steps and works 100%):

Notifaction.java

 import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.support.v4.app.NotificationCompat; import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; import static android.content.ContentValues.TAG; public class Notifaction extends FirebaseMessagingService { public Notifaction() { } @Override public void onMessageReceived(RemoteMessage remoteMessage) { showNotification(remoteMessage.getData().get("message")); } private void showNotification(String message) { Intent i=new Intent(this,MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent=PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder=new NotificationCompat.Builder(this) .setAutoCancel(true) .setContentTitle("FCM TITLE").setContentText(message) .setSmallIcon(R.drawable.ic_launcher_background) .setDefaults(Notification.DEFAULT_ALL) .setContentIntent(pendingIntent); NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(0,builder.build()); } } 

AndroidManiest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package=""> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".Notifaction"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> </application> </manifest> 

app.gradle

 apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultConfig { applicationId "" minSdkVersion 14 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.google.firebase:firebase-messaging:11.8.0' compile 'com.google.firebase:firebase-core:11.8.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' } apply plugin: 'com.google.gms.google-services' 

Project.grdle

  // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' classpath 'com.google.gms:google-services:3.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } 

In addition, I added a .json file for both projects. Here is a screenshot: link .

+13
java android firebase firebase-cloud-messaging
source share
13 answers

If you look at this document, you do not have a service that extends the FirebaseInstanceIdService to control the creation / rotation of the token. Here is a sample code. This token that you need to send push notifications to a specific device is received by this class.

 <service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> 

EDIT :

OK, this error is causing me now. I looked at your dependency tree, and I see that you are repeating some of them. For example, you have three versions:

 compile 'com.android.support:appcompat-v7:25.4.0' 

Perhaps you should upgrade this version to the latest version or map it to the working version. You also use the new gradle plugin, but in most cases you did not update your dependencies to use implementation instead of compile , maybe try this? That is why you should do it.

 dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') //compile project(path: ':backend', configuration: 'android-endpoints') //Removed the 0.2.+ compile 'com.daprlabs.aaron:cardstack:0.3.1-beta0' //noinspection GradleCompatible compile 'com.android.support:appcompat-v7:25.4.0' compile "com.android.support:appcompat-v7:19.0.+" compile 'com.android.support:design:23.4.0' compile 'com.android.support:recyclerview-v7:23.4.0' compile 'com.android.support:cardview-v7:23.4.0' compile 'com.github.danylovolokh:video-player-manager:0.2.0' compile 'com.github.danylovolokh:list-visibility-utils:0.2.0' implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.google.firebase:firebase-messaging:11.8.0' compile 'com.google.firebase:firebase-core:11.8.0' compile 'com.orhanobut:dialogplus: 1.11@aar ' compile 'com.nineoldandroids:library:2.4.0' compile files('libs/sinch-android-rtc-3.9.14.jar') compile 'com.amazonaws:aws-android-sdk-s3:2.4.4' compile 'com.github.chrisbanes:PhotoView:1.2.6' compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0' compile 'com.github.amlcurran.showcaseview:library:5.4.3' compile 'com.github.d-max:spots-dialog: 0.7@aar ' compile 'com.victor:lib:1.0.4' compile 'com.github.bumptech.glide:glide:3.5.2' compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.android.support:recyclerview-v7:23.0.0' compile 'me.grantland:autofittextview:0.2.0' compile 'com.wang.avi:library:1.0.5' compile 'com.nineoldandroids:library:2.4.0' compile 'com.braintreepayments.api:drop-in:2.3.8' compile 'com.braintreepayments.api:braintree:2.3.9' compile 'com.loopj.android:android-async-http:1.4.9' compile 'com.getbase:floatingactionbutton:1.10.1' compile 'com.mxn.soul:flowingdrawer-core:1.2.2' compile 'com.github.rengwuxian:MaterialEditText:2.1.4' compile 'com.github.PhilJay:MPAndroidChart:v3.0.1' compile 'net.gotev:uploadservice:3.2.5' compile 'in.srain.cube:ultra-ptr:1.0.11' compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha9' testCompile 'junit:junit:4.12' //implementation 'com.android.support:appcompat-v4:23.+' } 

Also, update your dependencies and use the implementation instead of compiling:

 implementation 'com.google.firebase:firebase-messaging:15.0.2' implementation 'com.google.firebase:firebase-core:15.0.2' 
+4
source share

If you get a device token and you have an api server key, check if your code is working correctly or not, pushtry . this will lead to an error, for example, Incorrect registration , 404 Error , etc., if you make any mistake in your code. and to implement FCM you can follow this guide - FCM Tutorial

Another thing that I noticed in your build.gradle file build.gradle that the applicationId "Package Name" in defaultConfig does not exist. I'm not sure, but this is the name of the package and is used when creating a project on the firebase console (name of the project with the package)

+4
source share

Most likely, your notifications are not displayed due to Android Oreo's new notification model , which requires you to specify channel definitions to create and display notifications. Also in your app.gradle you are setting up the Android version of version 26 , which is Android Oreo , so you will have to implement the code below anyway.

Easy to take. all you have to do is:

1. define the notification channel in your application YourApplicationClass.onCreate ()

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel chan1 = new NotificationChannel( YOUR_DESIRED_CHANNEL_ID_STRING, YOUR_DESIRED_CHANNEL_LABEL_STRING, NotificationManager.IMPORTANCE_DEFAULT); chan1.setDescription(YOUR_DESIRED_CHANNEL_DESC_STRING);//OPTIONAL chan1.setLightColor(Color.BLUE);//OPTIONAL chan1.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);//OPTIONAL chan1.setShowBadge(true);//OPTIONAL getManager().createNotificationChannel(chan1); } 

2. replace the notification creator with this constructor

  NotificationCompat.Builder builder= new NotificationCompat.Builder(this, YOUR_DESIRED_CHANNEL_ID_STRING); 

It’s useful to know that you can define more than one channel with various properties oriented to Android Oreo and higher

+4
source share

// this help allows you to start the FCM service in the background when the phone restarts.

 Add receiver in Manifest.xml <uses-permission android:name="android.permission.WAKE_LOCK" /> <receiver android:name=".OnBootBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> OnBootBroadcastReceiver.class import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class OnBootBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent("com.examle.FirebaseMessagingReceiveService"); i.setClass(context, FirebaseMessagingReceiveService.class); context.startService(i); } } 
+3
source share

Extract the notification payload from your FCM messages to get the data payload using the onMessageReceived method.

Read the link below carefully.

When your application is in the background, the data payload is passed to the onMessageReceived method only if there is no payload for notifications. (Mark the words)

In case both payloads exist, the system automatically processes part of the notification (system tray), and your application receives a data payload in addition to assigning launch activity (after the user clicks on the notification).

To be able to successfully serve both platforms, Android and iOS, you may have to send various FCM messages according to the client OS.

+3
source share

We hope you know the types of notifications. To send notifications you need to use a custom server or something like a postman, for more information, please answer the answer to this question:

How to handle notification when an application is in the background in Firebase

In any case, you need to call the handleIntent method (intent intent) in your FirebaseMessagingService to call the onMessageReceived () method.

Here is my full working code, notification-when-app-in-background-in-firebase.

build.gradle:

 apply plugin: 'com.android.application' android { compileSdkVersion 26 buildToolsVersion '26.0.3' defaultConfig { applicationId "com.abc.xyz" minSdkVersion 17 targetSdkVersion 26 multiDexEnabled true versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } dexOptions { javaMaxHeapSize "4g" } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:support-v4:26.1.0' implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support:design:26.1.0' implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.android.support:cardview-v7:26.1.0' //firebase analytics and ads implementation 'com.google.firebase:firebase-ads:11.4.2' implementation 'com.google.firebase:firebase-core:11.4.2' implementation 'com.google.firebase:firebase-messaging:11.4.2' implementation 'com.firebase:firebase-jobdispatcher:0.8.5' } apply plugin: 'com.google.gms.google-services' 

AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.abc.xyz"> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- [START fcm_default_icon] --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" /> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" /> <!-- [END fcm_default_icon] --> <!-- [START fcm_default_channel] --> <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" /> <!-- [END fcm_default_channel] --> <service android:name=".services.MyFirebaseMessagingService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <service android:name=".services.MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> <service android:name=".services.MyJobService" android:exported="false"> <intent-filter> <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE" /> </intent-filter> </service> </application> </manifest> 

MyFirebaseMessagingService.java:

 public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseMsgService"; @Override public void handleIntent(Intent intent) { Log.e(TAG, "handleIntent"); try { if (intent.getExtras() != null) { RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService"); for (String key : intent.getExtras().keySet()) { builder.addData(key, intent.getExtras().get(key).toString()); } onMessageReceived(builder.build()); } else { super.handleIntent(intent); } } catch (Exception e) { super.handleIntent(intent); } } /** * Called when message is received. * * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. */ // [START receive_message] @Override public void onMessageReceived(RemoteMessage remoteMessage) { // [START_EXCLUDE] // There are two types of messages data messages and notification messages. Data messages are handled // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app // is in the foreground. When the app is in the background an automatically generated notification is displayed. // When the user taps on the notification they are returned to the app. Messages containing both notification // and data payloads are treated as notification messages. The Firebase console always sends notification // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options // [END_EXCLUDE] // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: Log.e(TAG, "Notification received Successfully"); Log.e(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.e(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.e(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. } // [END receive_message] /** * Schedule a job using FirebaseJobDispatcher. */ private void scheduleJob() { // [START dispatch_job] FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this)); Job myJob = dispatcher.newJobBuilder() .setService(MyJobService.class) .setTag("my-job-tag") .build(); dispatcher.schedule(myJob); // [END dispatch_job] } /** * Handle time allotted to BroadcastReceivers. */ private void handleNow() { Log.e(TAG, "Short lived task is done."); } /** * Create and show a simple notification containing the received FCM message. * * @param messageBody FCM message body received. */ private void sendNotification(String messageBody) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); String channelId = getString(R.string.default_notification_channel_id); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.ic_stat_ic_notification) .setContentTitle("FCM Message") .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } } 

MyFirebaseInstanceIDService.java:

 public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "MyFirebaseIIDService"; /** * Called if InstanceID token is updated. This may occur if the security of * the previous token had been compromised. Note that this is called when the InstanceID token * is initially generated so this is where you would retrieve the token. */ // [START refresh_token] @Override public void onTokenRefresh() { // Get updated InstanceID token. Log.e(TAG, "onTokenRefresh"); String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.e(TAG, "Refreshed token: " + refreshedToken); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // Instance ID token to your app server. sendRegistrationToServer(refreshedToken); } // [END refresh_token] /** * Persist token to third-party servers. * * Modify this method to associate the user FCM InstanceID token with any server-side account * maintained by your application. * * @param token The new token. */ private void sendRegistrationToServer(String token) { // TODO: Implement this method to send token to your app server. } } 

MyJobService.java

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public class MyJobService extends JobService { private static final String TAG = "MyJobService"; @Override public boolean onStartJob(JobParameters job) { // Do some work here Log.e(TAG, "Inside MyJobService"); return false; // Answers the question: "Is there still work going on?" } @Override public boolean onStopJob(JobParameters job) { Log.e(TAG, "Inside MyJobService"); return false; // Answers the question: "Should this job be retried?" } } 

MyApplication.java:

 public class MyApplication extends MultiDexApplication { @Override public void onCreate() { super.onCreate(); // active JobSchedulerReceiver Intent intent = new Intent(); intent.setAction(getPackageName() + ".receiver.JobSchedulerReceiver"); sendBroadcast(intent); } @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } } 

MainActivity.java:

 public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e(TAG, "Inside MainActivity"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Create channel to show notifications. String channelId = getString(R.string.default_notification_channel_id); String channelName = getString(R.string.default_notification_channel_name); NotificationManager notificationManager = getSystemService(NotificationManager.class); assert notificationManager != null; notificationManager.createNotificationChannel(new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_LOW)); } // If a notification message is tapped, any data accompanying the notification // message is available in the intent extras. In this sample the launcher // intent is fired when the notification is tapped, so any accompanying data would // be handled here. If you want a different intent fired, set the click_action // field of the notification message to the desired intent. The launcher intent // is used when no click_action is specified. // // Handle possible data accompanying notification message. // [START handle_data_extras] if (getIntent().getExtras() != null) { for (String key : getIntent().getExtras().keySet()) { Object value = getIntent().getExtras().get(key); Log.e(TAG, "Key: " + key + " Value: " + value); } } // [END handle_data_extras] Button subscribeButton = findViewById(R.id.subscribeButton); subscribeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // [START subscribe_topics] FirebaseMessaging.getInstance().subscribeToTopic("news"); // [END subscribe_topics] // Log and toast String msg = getString(R.string.msg_subscribed); Log.e(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } }); Button logTokenButton = findViewById(R.id.logTokenButton); logTokenButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Get token String token = FirebaseInstanceId.getInstance().getToken(); // Log and toast String msg = getString(R.string.msg_token_fmt, token); Log.e(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } }); } } 
+3
source share

Since you did not receive any log event from Firebase, follow these steps:

  • Go to your Firebase project console, enter the project parameters and verify the package name is correct.
  • Download the JSON file again and copy it to the app/ module (change the project perspective from Android to the project), SAVE google-services.json file name
  • Run the project, go to the search for the Firebase keyword, if successful, you will see a message:

I / FirebaseInitProvider: successful initialization of FirebaseApp

+2
source share

Even I ran into the same problem, it was solved by adding the full android path : service name in AndroidManifest.xml

 <service android:name="com.testapp.Notifaction"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> 

try once and let me know if you have any problems.

+2
source share

Release step by step to test all your code compared to my actual project, which is in production running the latest version of Firebase Messaging:

  • Your gradle dependencies look great, but you just need the implementation "com.google.firebase:firebase-messaging:15.0.2"

  • Could you rename your class to something else? The Notification name can be associated with the Android Notification native class. Also remember that it should have an empty constructor (but I see in your code what you have)

Name it MessagingController, for example, and put it in your manifest inside <application> for example:

  <!--Service to control messaging requests--> <service android:name=".messaging.controller.MessagingController" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> </application> 

Also, do not forget that you need an instance of FirebaseInstanceService , this is required, as in the Official Dock :

A service that extends FirebaseInstanceIdService to handle the creation, rotation, and updating of registration tokens. This is necessary to send to specific devices or to create device groups.

 <!--Firebase instance service to renew messaging tokens--> <service android:name=".messaging.service.FirebaseInstanceService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> 
  • Are you sending notifications from the Firebase Console? Or use the features of Cloud Firebase? In both cases, do you enter the correct token? If you set a timeout, then the Firebase console will show you an error, you should add a notification as follows:

enter image description here

  • Well, for now, with your code, it should be at least getting notifications in your logs,

  • If you want, you can check out the next project, which is a Skeleton application for creating a notification system. Maybe this will help too: https://github.com/FrangSierra/PushNotificationSkeleton

  • Finally, if you want to check the cloud function code on how to send notifications from the server, I suggest you look at this repository

+2
source share

Let the application listen for some value in the firebase database and change it as the desired message. I do this with my applications and work like a charm.

+1
source share

Have you registered your application with the FCM? And added the .json file to your application?

+1
source share

There are two types of notification data 1) The notification payload 2) The data payload if you are sending data from the server in the notification notification tool. there is a chance that you did not call onMessageRecieved () from the FirbaseMessagingService, see this link

+1
source share

This is just a simple suggestion, but what caused a similar error for me a couple of weeks ago was that I sent the wrong notification form. I sent quiet notifications, although I had to send out loud. Check how your server sends messages. I also messed up the order in which the FCM API expects keys.

Here is my code for working loud notifications that are sent by the Django Python server:

 def _build_loud_message(not_id, data): """Construct loud notifiation message. Loud means that this message will show up in the notifications hub of the app. """ return { 'message': { 'notification': { 'title': 'New activity', 'body': 'Hey you have some new activity!' }, 'data': {"data": data}, 'apns': { 'payload': { "notId": not_id, # notId HAS TO BE FIRST!!! 'aps': { 'badge': 1, 'sound': 'default', 'content-available': 1 } }, 'headers': { 'apns-priority': '10', 'apns-collapse-id': 'myid-1' } }, 'android': { 'priority': "high", 'data': { "androidData": data }, 'notification': { 'sound': 'default', 'tag': 'mytag-1' } } } } 

Also pay close attention to the order in which the dic keys are mentioned. Changing them may cause the message to not be sent successfully from FCM to the device, although the FCM api says that it was sent successfully.

+1
source share

All Articles