Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Notification not showing up in Android O despite creating a channel

This is my code given below. This is unable to create any notifications on Android O, inspite of creating the Notification Channel.

private void weatherNotification(WeatherInfo weather) {
    Intent intent = new Intent(this, WeatherActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

    String temperatureScale = prefs.getUnits().equals("metric") ? getString(R.string.c) : getString(R.string.f);
    String speedScale = prefs.getUnits().equals("metric") ? getString(R.string.mps) : getString(R.string.mph);

    String temperature = getString(R.string.temperature , weather.getMain().getTemp() , temperatureScale);
    String city = getString(R.string.city , weather.getName() + ", " + weather.getSys().getCountry());
    String wind = getString(R.string.wind_ , weather.getWind().getSpeed(), speedScale);
    String humidity = getString(R.string.humidity , weather.getMain().getHumidity());
    String pressure = getString(R.string.pressure, weather.getMain().getPressure());

    String data = city + "\n" + temperature + "\n" + wind + "\n" + humidity + "\n" + pressure;

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        String id = "w01", name = getString(R.string.weather_notification_title);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        String desc = getString(R.string.weather_notification_description);

        NotificationChannel channel = new NotificationChannel(id, name, importance);
        channel.setDescription(desc);
        notificationManager.createNotificationChannel(channel);
    }
    Notification.Builder builder = new Notification.Builder(this);

    builder.setAutoCancel(false);
    builder.setContentTitle("Weather Notification");
    builder.setContentText(Math.round(weather.getMain().getTemp()) + temperatureScale + " at " + weather.getName());
    builder.setStyle(new Notification.BigTextStyle().bigText(data));
    builder.setSmallIcon(R.drawable.ic_notification_icon);
    builder.setContentIntent(pendingIntent);
    if (Build.VERSION.SDK_INT >= 24)
        builder.setColor(Color.parseColor("#ff0000"));
    Notification notification = builder.build();
    notificationManager.notify(0 , notification);
}

I believe I have followed all the steps that are required for creating a Notification on Android O - Creating Notification Channel using the notification manager, followed by building the notification on this manager. I don't know where I am going wrong.

EDIT 1: Made the following change in weatherNotification() method, still does not work:

private void weatherNotification(WeatherInfo weather) {

    ....

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        String id = "w01", name = getString(R.string.weather_notification_title);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        String desc = getString(R.string.weather_notification_description);

        NotificationChannel channel = new NotificationChannel(id, name, importance);
        channel.setDescription(desc);
        notificationManager.createNotificationChannel(channel);
        builder = new Notification.Builder(this , id);
    }
    builder = new Notification.Builder(this);
    builder.setAutoCancel(false);
    builder.setContentTitle("Weather Notification");
    builder.setContentText(Math.round(weather.getMain().getTemp()) + temperatureScale + " at " + weather.getName());
    builder.setStyle(new Notification.BigTextStyle().bigText(data));
    builder.setSmallIcon(R.drawable.ic_notification_icon);
    builder.setContentIntent(pendingIntent);
    if (Build.VERSION.SDK_INT >= 24)
        builder.setColor(Color.parseColor("#ff0000"));
    Notification notification = builder.build();
    notificationManager.notify(0 , notification);
    ....
}

EDIT 2: From Edit 1 Code, I found out that the builder was being regenerated again. So I made the following changes again:

private void weatherNotification(WeatherInfo weather) {
    ....
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        String id = "w01", name = getString(R.string.weather_notification_title);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        String desc = getString(R.string.weather_notification_description);

        NotificationChannel channel = new NotificationChannel(id, name, importance);
        channel.setDescription(desc);
        notificationManager.createNotificationChannel(channel);
        builder = new Notification.Builder(this , id);
    }
    else
        builder = new Notification.Builder(this);
    ....
}
like image 403
Sparker0i Avatar asked Sep 16 '17 15:09

Sparker0i


1 Answers

You should be getting a deprecation warning on this line:

Notification.Builder builder = new Notification.Builder(this);

That is because the new constructor takes your channel ID:

Notification.Builder builder = new Notification.Builder(this, id);

(though you will need to rework your code a bit so that id is still available.

Quoting the JavaDocs for the constructor that you are using right now: "All posted Notifications must specify a NotificationChannel Id." As it stands, you are not using that channel when raising the Notification. AFAIK, that will prevent your Notification from being displayed.

like image 62
CommonsWare Avatar answered Oct 21 '22 21:10

CommonsWare