Android 如何发送到";杂项“;通知频道?

Android 如何发送到";杂项“;通知频道?,android,android-notifications,android-8.0-oreo,Android,Android Notifications,Android 8.0 Oreo,问题描述 当我尝试在Android O中发送通知时,我必须指定要发送到的通知频道 如果我使用像这样的旧方法(不设置任何频道)NotificationCompat.Builder(this),则不会显示通知 这同样适用于无效频道,如NotificationCompat.Builder(此“无效”)或NotificationCompat.Builder(此“”) 当我通过Firebase Cloud Messaging发送通知,并将我的应用程序置于后台,但未指定通知通道时,它将是“杂项”通道中的通知

问题描述 当我尝试在Android O中发送
通知时,我必须指定要发送到的
通知频道

如果我使用像这样的旧方法(不设置任何频道)
NotificationCompat.Builder(this)
,则不会显示
通知

这同样适用于无效频道,如
NotificationCompat.Builder(此“无效”)
NotificationCompat.Builder(此“”)

当我通过Firebase Cloud Messaging发送通知,并将我的应用程序置于后台,但未指定通知通道时,它将是“杂项”通道中的通知

当我尝试在前台执行相同操作时,上述操作将不起作用,也不会创建一个名为“Miscellaneous”和id为“{package}.Miscellaneous”的通知通道,然后通过它发送。当我这样做时,会发生以下情况:

我想知道的是 如果没有像FCM这样的频道,我如何发送通知,这样它就会进入常规的“杂项”频道

这项工作的例子 正如我前面提到的,FCM通知会发生这种情况,但例如Gmail也会使用杂项频道那么我该如何使用它呢?

我相信,如果其他频道通常无法使用,他们会将其删除

简短描述 为什么这段代码没有向“杂项”通知通道发送通知,它实际上没有发送任何通知(仅在Android O上,该代码在较低的Android版本上有效)


该频道的ID为
fcm\u fallback\u notification\u channel
。firebase消息传递库在内部创建它

如中所述,Android系统创建的默认频道的id是
fcm\u fallback\u notification\u channel
,但要小心,因为系统在必须管理第一次推送通知之前不会创建频道。因此,如果您在
FirebaseMessagingService
类的扩展中管理所有通知,则可能会出现通道不存在的情况,并且您会遇到以下错误:

android.app.RemoteServiceException:startForeground:java.lang.RuntimeException:service通知的通道无效:通知(通道=fcm\u回退\u通知\u通道pri=-2 contentView=null振动=null声音=null默认值=0x0标志=0x40颜色=0x00000000 vis=PRIVATE)
我的建议是在创建通知之前检查默认通道是否存在,如果不存在,则创建默认通道:

private void createDefaultNotificationChannel() {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
     NotificationManager notificationManager = getSystemService(NotificationManager.class);

     if (notificationManager.getNotificationChannel("fcm_fallback_notification_channel") != null) {
       return;
     }

     String channelName = getString(R.string.fcm_fallback_notification_channel_label);
     NotificationChannel channel = new NotificationChannel("fcm_fallback_notification_channel", channelName, NotificationManager.IMPORTANCE_HIGH);
     notificationManager.createNotificationChannel(channel);
}

创建通知通道:使用包中唯一的ID构造通知通道对象。使用任何所需的初始设置(如警报声音)以及用户可见的可选描述配置通知通道对象。将通知通道对象提交给通知管理器。@CreativeCreatorMorMaybeno您没有找到解决方案吗?你试过刚发布的最终Android 8(vs.dev preview)吗?@Arhimed我想我没有试过最终Android 8。请看Sca09的答案,因为情况并非总是如此。
private void createDefaultNotificationChannel() {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
     NotificationManager notificationManager = getSystemService(NotificationManager.class);

     if (notificationManager.getNotificationChannel("fcm_fallback_notification_channel") != null) {
       return;
     }

     String channelName = getString(R.string.fcm_fallback_notification_channel_label);
     NotificationChannel channel = new NotificationChannel("fcm_fallback_notification_channel", channelName, NotificationManager.IMPORTANCE_HIGH);
     notificationManager.createNotificationChannel(channel);
}