Xero
Xero

Reputation: 4175

Notification android on foreground not displayed (Oreo)

I'm trying to display an notification with firebase when the app is in the foreground. The onMessageReceived method is called when I push the notification from the server, but the notification is not displayed.

Here my code :

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(final RemoteMessage remoteMessage) {
        Timber.d("FCM-From: " + remoteMessage.getFrom());

            new Handler(Looper.getMainLooper()).post(new Runnable() {
                public void run() {
                    if (remoteMessage.getNotification() != null) {
                        Timber.d("FCM-Message Notification Body: " + remoteMessage.getNotification().getBody());

                        NotificationCompat.Builder builder = new  NotificationCompat.Builder(
                                getApplicationContext(), "CHANNEL_NOTIF")
                                .setSmallIcon(R.mipmap.ic_launcher)
                                .setContentTitle("test")
                                .setContentText("test content");
                        NotificationManager manager = (NotificationManager)     getSystemService(NOTIFICATION_SERVICE);
                        if (manager != null) {
                            Timber.d("FCM-Notif");
                            manager.notify(1, builder.build());
                        }
                    }
                }
            });
    }
}

In my logcat I can see :

FCM-Message Notification Body: 202018105166

FCM-From: 1049809400953

FCM-Notif

I followed https://developer.android.com/training/notify-user/build-notification.html#builder

I'am running on Oreo

SOLUTION

Found the answer here : Android foreground service notification not showing

It was an Oreo issue, thank to @Yashaswi N P

Upvotes: 2

Views: 7917

Answers (4)

Yogesh Nikam Patil
Yogesh Nikam Patil

Reputation: 1280

I have added the following permission in the manifest file.

My issue solved.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

Upvotes: 0

user311086
user311086

Reputation: 1088

This happened because of Android Oreo and higher API levels. So You must create the notification channel before posting any notifications on Android 8.0 and higher, you should execute this code as soon as your app starts. It's safe to call this repeatedly because creating an existing notification channel performs no operation.

And use following code to solve this problem:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = MyFirebaseMessagingService.class.getSimpleName();
    private NotificationUtils notificationUtils;
    private String title,message,click_action;
    private  String CHANNEL_ID = "MyApp";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {

            try {
                JSONObject data = new JSONObject(remoteMessage.getData());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
             title = remoteMessage.getNotification().getTitle(); //get title
             message = remoteMessage.getNotification().getBody(); //get message
             click_action = remoteMessage.getNotification().getClickAction(); //get click_action

            Log.d(TAG, "Notification Title: " + title);
            Log.d(TAG, "Notification Body: " + message);
            Log.d(TAG, "Notification click_action: " + click_action);

            sendNotification(title, message,click_action);
        }
    }

    private void sendNotification(String title,String messageBody, String click_action) {
        Intent intent = new Intent(this, TargetActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setSmallIcon(R.drawable.logo_heart)
                .setContentTitle(title)
                .setContentText(messageBody)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent)// Set the intent that will fire when the user taps the notification
                .setAutoCancel(true);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

        // notificationId is a unique int for each notification that you must define
        notificationManager.notify(1, mBuilder.build());

        createNotificationChannel();
    }

    private void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.app_name);
            String description = getString(R.string.description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance or other notification behaviors after this
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }

}

Upvotes: 2

S.Shaily
S.Shaily

Reputation: 11

The below mentioned line of code snippet will help you fix it:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = new 
NotificationChannel(NOTIFICATION_CHANNEL_ID, title, importance);
mChannel.setDescription(notification);
mChannel.enableLights(true);
mChannel.setLightColor(ContextCompat.getColor
(getApplicationContext(),R.color.colorPrimary));
notificationManager.createNotificationChannel(mChannel);

}

I have used this code snippet in my project and it really resolved the issue.

Upvotes: 1

Xero
Xero

Reputation: 4175

Found the answer here : Android foreground service notification not showing

Need to handle channel with Oreo

   mNotifyManager = (NotificationManager) mActivity.getSystemService(Context.NOTIFICATION_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) createChannel(mNotifyManager);
    mBuilder = new NotificationCompat.Builder(mActivity, "YOUR_TEXT_HERE").setSmallIcon(android.R.drawable.stat_sys_download).setColor
            (ContextCompat.getColor(mActivity, R.color.colorNotification)).setContentTitle(YOUR_TITLE_HERE).setContentText(YOUR_DESCRIPTION_HERE);
    mNotifyManager.notify(mFile.getId().hashCode(), mBuilder.build());

@TargetApi(26)
private void createChannel(NotificationManager notificationManager) {
    String name = "FileDownload";
    String description = "Notifications for download status";
    int importance = NotificationManager.IMPORTANCE_DEFAULT;

    NotificationChannel mChannel = new NotificationChannel(name, name, importance);
    mChannel.setDescription(description);
    mChannel.enableLights(true);
    mChannel.setLightColor(Color.BLUE);
    notificationManager.createNotificationChannel(mChannel);
}

Thank to @Yashaswi N P

Upvotes: 1

Related Questions