通知无法在Android Oreo(API 26)中显示

试图在Android O上显示通知时收到此消息。

对于音量控制以外的操作,不推荐使用streamtypes

该通知是直接从示例文档,并在Android 25上显示罚款。

Solutions Collecting From Web of "通知无法在Android Oreo(API 26)中显示"

根据此Google+信息的评论:

在Android O设备上使用NotificationCompat时,目前预计会有这些[warnings]( NotificationCompat始终调用setSound()即使您从不传入自定义声音也是如此)。

直到支持库更改其代码以使用AudioAttributes版本,您将始终得到该警告。

所以对于这个警告你没有什么可以做的。 根据通知渠道指南 ,Android O根本不赞成在单个通知上设置声音,而是将声音设置在特定types的所有通知使用的通知通道上。

从Android O开始,您需要configurationNotificationChannel ,并在尝试显示通知时引用该通道。

 private static final int NOTIFICATION_ID = 1; private static final String NOTIFICATION_CHANNEL_ID = "my_notification_channel"; ... NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_DEFAULT); // Configure the notification channel. notificationChannel.setDescription("Channel description"); notificationChannel.enableLights(true); notificationChannel.setLightColor(Color.RED); notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000}); notificationChannel.enableVibration(true); notificationManager.createNotificationChannel(notificationChannel); } NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) .setVibrate(new long[]{0, 100, 100, 100, 100, 100}) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Content Title") .setContentText("Content Text"); notificationManager.notify(NOTIFICATION_ID, builder.build()); 

几个重要的笔记:

  1. NotificationChannel指定的振动模式等设置将覆盖实际Notification指定的设置。 我知道,它反直觉。 您应该将设置更改为通知,或对每个configuration使用不同的NotificationChannel。
  2. NotificationChannel传递给createNotificationChannel()后,不能修改大部分NotificationChannel设置。 你甚至不能调用deleteNotificationChannel() ,然后尝试重新添加它。 使用已删除的NotificationChannel的ID将会重新生成它,并且它将与第一次创build时一样不变。 它将继续使用旧的设置,直到应用程序被卸载。 所以你最好确定你的频道设置,并重新安装应用程序,如果你正在玩这些设置,以使其生效。

所有@ sky-kelsey所描述的是好的,只是less量的增加:

你不应该每次注册同一个频道,如果它已经被注册,所以我有Utils类的方法,为我创build一个频道:

 public static final String NOTIFICATION_CHANNEL_ID_LOCATION = "notification_channel_location"; public static void registerLocationNotifChnnl(Context context) { if (Build.VERSION.SDK_INT >= 26) { NotificationManager mngr = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); if (mngr.getNotificationChannel(NOTIFICATION_CHANNEL_ID_LOCATION) != null) { return; } // NotificationChannel channel = new NotificationChannel( NOTIFICATION_CHANNEL_ID_LOCATION, context.getString(R.string.notification_chnnl_location), NotificationManager.IMPORTANCE_LOW); // Configure the notification channel. channel.setDescription(context.getString(R.string.notification_chnnl_location_descr)); channel.enableLights(false); channel.enableVibration(false); mngr.createNotificationChannel(channel); } } 

strings.xml中:

 <string name="notification_chnnl_location">Location polling</string> <string name="notification_chnnl_location_descr">You will see notifications on this channel ONLY during location polling</string> 

我每次打电话给该方法之前,我要显示一个types的通知:

  ... NotificationUtil.registerLocationNotifChnnl(this); return new NotificationCompat.Builder(this, NotificationUtil.NOTIFICATION_CHANNEL_ID_LOCATION) .addAction(R.mipmap.ic_launcher, getString(R.string.open_app), activityPendingIntent) .addAction(android.R.drawable.ic_menu_close_clear_cancel, getString(R.string.remove_location_updates), servicePendingIntent) .setContentText(text) ... 

另一个典型的问题 – 频道默认声音 – 在这里描述: https : //stackoverflow.com/a/45920861/2133585