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