Firebase Cloud Messaging - onMessageReceived not working
Solution 1
If you are receiving device token and you have server api key then check your code working properly or not using pushtry . it will give error like Invalid Registration, 404 Error etc if you have done any mistake in your code. and for implementation of FCM, you can follow this tutorial- FCM Tutorial
One more thing i have notice in your build.gradle
file there is no any applicationId "Package Name"
in defaultConfig
.
I am not sure but this is package name and used when we create project on firebase console (Project name with package)
Solution 2
Most likely your notifications are not showing due to Android Oreo new notifications model which requires to specify channels definitions in order to build and show notifications. Also in your app.gradle, you are targeting android version 26 which is Android Oreo, so you will have to implement the code below either way.
It is easy to adopt. all you need to do is:
1. define a notification channel in your 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 you notification builder with this constructor
NotificationCompat.Builder builder=
new NotificationCompat.Builder(this, YOUR_DESIRED_CHANNEL_ID_STRING);
Good to know that you can define more than one channel with different properties targeting Android Oreo and higher
Solution 3
If you take a look at this doc
You don't seem to have a service that extends FirebaseInstanceIdService
to manage the token creation/rotation. Here is a example code. The token you need to send the 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:
Okay, this error is bugging me now. I looked at your dependency tree and I see you're repeating some of them. For example you have three version of:
compile 'com.android.support:appcompat-v7:25.4.0'
Maybe you should clear that out to the newest version, or match it with the working version. Also you're using the new gradle plugin, but you haven't updated your depedencies to use implementation
instead of compile
in most cases, maybe try that as well? Here's 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 implementation instead of compile:
implementation 'com.google.firebase:firebase-messaging:15.0.2'
implementation 'com.google.firebase:firebase-core:15.0.2'
Solution 4
// this help to start FCM service in background when phone restart.
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);
}
}
Solution 5
Hope you know the types of notifications, For sending notification you have to use custom server or something like postman , for more information, please refer the answer of these question :
How to handle notification when app in background in Firebase
Anyways, you have to call handleIntent(Intent intent) method in your FirebaseMessagingService in order to call onMessageReceived() method..
Here is my complete 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's 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();
}
});
}
}
Lazar Kukolj
“If you are depressed you are living in the past. If you are anxious you are living in the future. If you are at peace you are living in the present.” ― Lao Tzu This site helps out a lot and i wouldn't be in the situation that i am in right now if it wasn't for it!
Updated on June 17, 2022Comments
-
Lazar Kukolj almost 2 years
I want to make a simple notification feature in my app. I followed this YouTube video and both of these Firebase documentation URLs 1 and 2 plus the Firebase tool assistant in Android Studio (which says I'm connected to Firebase). For some reason, following these steps and documents on my older app (which code is posted below), it won't allow me to receive notifications. However, if I follow the same steps on a brand new app it works perfectly. I tested both apps on the same physical device and environment in the background, active and terminated states. Every time the new demo app I created works with no issue but my older app which I want notifications in does not work. Both tested without getting the device ID. I do not even get any error logs or any TAG log. I think one of my compiled projects is interfering, not sure exactly what but I might have to look there.
I also checked out all these SO posts already: 123 and more
PS. I removed my package name below, I checked multiple times on FireBase and they match so I know that is not the issue. However, my new demo app's FireBase shows that my app connected but my older app's FireBase did not. Also, I've set a bounty before and still running into the same issue.
Here's my problematic code:
Notification.java (its a service like the documentation asks)
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()); } }
Notice I do not even get a log in the notification.java 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> <!-- <!– --> <!-- Set custom default icon. This is used when no icon is set for incoming notification messages. --> <!-- See README() for more. --> <!-- –> --> <!-- <meta-data --> <!-- android:name="com.google.firebase.messaging.default_notification_icon" --> <!-- android:resource="@drawable/pt_icon" /> --> <!-- <!– --> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming --> <!-- notification message. See README() for more. --> <!-- –> --> <!-- <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>
Working code below (the app I made just to test 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 }
Also, I added the .json file to both projects. Here is a screenshot: .
-
Lazar Kukolj about 6 yearsI dont have it in my quick app that i made and it works
-
Levi Moreira about 6 yearsin the video you said you used, around 11:03 the guy teaches how to create the FirebaseInstanceIdService, did you use the video for the quick app?
-
Lazar Kukolj about 6 yearsNo the ID service is used to gain the token to subscribe to topic notifications but i just want to send a notification to everyone, I will play with topics and more after
-
Levi Moreira about 6 yearsOkay, if you're not sending the notification to the device via token, how are you sending it?
-
Levi Moreira about 6 yearsBecause the ID service is also used to generate the token to send to the server for communication. For example, if I want my app to have push notifications from firebase I save that token to the real time database and use it to direct messages to my device.
-
Lazar Kukolj about 6 yearsThats if you want to send to a single device or use the token to subscribe the phone to a notification topic. I want to send a notification to everyone like in the quick app i made. Do you want to see the working code?
-
jessica about 6 years1. Have you check the type of notification (message or Data) becuase in your onMessageReceived you have handle only data message. try to print log in this message. 2. if you have implement GCM in previous project and GCM dependencies, may be some confict with fcm.
-
Lazar Kukolj about 6 yearsEvery time I test I check my logs for "FCM" and it has never shown up. Also, I believe I used GCM awhile ago, can you help me point out how to get rid of it?
-
Lazar Kukolj about 6 yearsI made the Firebase project, added the .json, then connected my project from the Assistant Tool
-
jessica about 6 yearswhen you send notification to device, try to get the log, this will help.. and check that fcm token generate or not, if token is valid then only you receive notification.
-
Lazar Kukolj about 6 yearsAgain every time I test anything I always check my logs for "FMC" and I do not want to send the notification to my device only, I want to send a notification to everyone.
-
jessica about 6 yearsfirst check with your device fcm token, you can use advance rest client chrome extension to send notification
-
jessica about 6 yearscheck from this below link stackoverflow.com/questions/43816663/…
-
Lazar Kukolj about 6 yearsI removed the package name it has private info but I connected it with the Firebase Assistant Tool in Android Studio and on the Firebase website. Everything says its connected. Also, I did add the .json file.
-
Lazar Kukolj about 6 yearsJust posted it, check above
-
Lazar Kukolj about 6 yearsI test by sending notifications while the app is in background and removed from activity. My demo app works while the main app doe not.
-
tushar about 6 yearsif you want to send notification to all mobile devices then you have to store device id of mobile to your server and then notification will come to all devices.
-
Lazar Kukolj about 6 yearsThats not true because I recreated the steps on a new app which works fine without storing device ID's. Check above for updated question.
-
Lazar Kukolj about 6 yearsIf that's the case shouldn't my new app not work because it also targets Android Oreo and it doesn't follow the new notifications model?
-
Bassel Mourjan about 6 yearsyou might be facing a different kind of problem or bug, but I am 100% sure that without specifying channels, your app will fail to show notifications on devices running android O (26)... are you testing both of your apps on the same device/android version? also do both apps have the same code implementation? (maybe I could help further)
-
Lazar Kukolj about 6 yearsI do test both apps on the same device and both apps have all there respected code above
-
Bassel Mourjan about 6 years2 silly questions but helps debugging: - did you place the same json file in both projects? - how are you sending your notifications to devices? firebase console? after a second look.. your code looks fine
-
Lazar Kukolj about 6 yearsI have their .json file for each project and I'm sending a notification via firebase console. Exactly that's why I am super stuck :/
-
Bassel Mourjan about 6 yearsIn that case, you are left with one of the following: 1 make sure not to use the same push ID for both apps cause its unique by app and not by device. 2 make sure that you are using the correct and up-to-date Push ID since push Ids get changed every now and then. Therefore I suggest that you implement FirebaseInstanceIdService (firebase.google.com/docs/reference/android/com/google/firebase/…) which I fail to see implemented in your code.
-
Lazar Kukolj about 6 yearsthis answer was auto-selected for the +25. This answer did not solve my issue.
-
Levi Moreira almost 6 yearsthis is a wild guess, but have you tried make the manifest equal. I mean, just testing removing your other activities and leaving just the launcher activity like in the app that's working? The same with the build.gradle, you two options (besides the dependencies) that you don't have in the other app dexOptions, lintOptions and productFlavors
-
Morteza Rastgoo over 5 years@aj0822ArpitJoshi May I have another question for you? I have a project which testing from Firebase console works fine on debug but release version with proguard rules set not working. I test it using pushtry and it works fine. any opinion what whould be the problem?