尽管创建了频道

时间:2017-09-16 15:48:49

标签: android android-notifications android-8.0-oreo

这是我在下面给出的代码。尽管创建了通知频道,但无法在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:从编辑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);
    ....
}

1 个答案:

答案 0 :(得分:7)

您应该在此行收到弃用警告:

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

这是因为新构造函数采用了您的频道ID:

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

(尽管您需要稍微修改一下代码,以便id仍可用。

引用the JavaDocs for the constructor that you are using right now:“所有发布的通知都必须指定NotificationChannel ID。”就目前而言,在提升Notification时您没有使用该频道。 AFAIK,会阻止您显示Notification