如何发送到“其他”通知渠道?

时间:2017-07-31 13:05:48

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

问题描述

当我尝试在 Android O 中发送Notification时,我必须指定要发送到的NotificationChannel

如果我使用旧方法(不设置任何频道),例如NotificationCompat.Builder(this),则Notification将不会显示。

同样适用于此NotificationCompat.Builder(this, "invalid")NotificationCompat.Builder(this, "")的无效渠道。

当我通过 Firebase云消息传递发送通知并且我的应用程序在后台没有指定通知渠道时,它将是中的通知杂项“频道。

当我尝试在上面提到的前景中做同样的事情时,这将无效,也不会创建名称为“Miscellaneous”和id “{package} .MISCELLANEOUS”的通知频道然后通过它发送。当我这样做时会发生以下情况:

Screenshot from my app's settings

我想知道什么

如何在没有 FCM 这样的频道的情况下发送通知,那么它是否会出现在常规“其他”频道中?

此工作的例子

正如我上面提到的,它发生在 FCM通知中,但是 Gmail 也会使用其他渠道。 那我该如何使用呢?

Screenshot of Gmail's notification channels

我相信如果它通常无法使用,他们会删除杂项频道。

更短的描述

为什么此代码未向“其他”通知渠道发送通知,实际上并未发送任何通知(仅在Android O上,代码适用于较低的Android版本)。

(getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).notify(1, NotificationCompat.Builder(this, NotificationChannel.DEFAULT_CHANNEL_ID)
                    .setSmallIcon(R.drawable.small_icon)
                    .setContentTitle(URLDecoder.decode("Title", "UTF-8"))
                    .setContentText(URLDecoder.decode("Text", "UTF-8"))
                    .setColor(ContextCompat.getColor(applicationContext, R.color.color))
                    .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                    .setContentIntent(PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT))
                    .build())

2 个答案:

答案 0 :(得分:8)

该频道的ID为fcm_fallback_notification_channel。 firebase-messaging库在内部创建它。

答案 1 :(得分:2)

正如在之前的评论中所述,Android系统创建的默认频道的ID为fcm_fallback_notification_channel,但要小心,因为系统不会创建频道,直到它必须管理第一次推送通知。因此,如果您管理FirebaseMessagingService课程扩展中的所有通知,则可能会发生该频道不存在而且您遇到如下错误:

android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=fcm_fallback_notification_channel pri=-2 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 color=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);
}