Уведомление не отображается в Android O, несмотря на создание канала

Это мой код, приведенный ниже. Это не может создавать какие-либо уведомления на Android O, несмотря на создание канала уведомлений.

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);
}

Я считаю, что выполнил все шаги, необходимые для создания уведомления на Android O — создание канала уведомлений с помощью диспетчера уведомлений, а затем создание уведомления в этом диспетчере. Я не знаю, где я ошибаюсь.

РЕДАКТИРОВАТЬ 1: Сделано следующее изменение в методе WeatherNotification(), все еще не работает:

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);
    ....
}

РЕДАКТИРОВАТЬ 2: Из кода Edit 1 я узнал, что строитель снова регенерируется. Поэтому я снова внес следующие изменения:

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);
    ....
}

person Sparker0i    schedule 16.09.2017    source источник


Ответы (1)


Вы должны получить предупреждение об устаревании в этой строке:

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

Это потому, что новый конструктор принимает идентификатор вашего канала:

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

(хотя вам нужно будет немного переработать свой код, чтобы id все еще был доступен.

Цитирование документов JavaDocs для конструктора который вы используете прямо сейчас: "Все публикуемые уведомления должны указывать идентификатор канала уведомлений". В нынешнем виде вы не используете этот канал при поднятии Notification. Насколько я знаю, это предотвратит отображение вашего Notification.

person CommonsWare    schedule 16.09.2017
comment
Пожалуйста, проверьте РЕДАКТИРОВАТЬ 1 - person Sparker0i; 17.09.2017
comment
Для этого вам необходимо обновить библиотеку android.support.v4 до версии 26.0.0 или выше. - person varotariya vajsi; 05.07.2018
comment
Ключевым моментом является то, что «id» в .Builder должен соответствовать «id» в NotificationChannel (первый параметр). - person SoloPilot; 09.09.2018