Как отправить на канал "Разное"?

Описание проблемы Когда я пытаюсь отправить Notification в Android O, я должен указать NotificationChannel для отправки.

Если я использую старый метод (не настраивая какой-либо канал), такой как NotificationCompat.Builder(this), Notification не будет отображаться.

То же самое относится к неверному каналу, подобному этому NotificationCompat.Builder(this, "invalid") или NotificationCompat.Builder(this, "").

Когда я отправляю уведомление через Firebase Cloud Messaging и мое приложение в фоновом режиме не указано ни одного канала уведомлений, это будет уведомление в канале "Разное" .

Когда я пытаюсь сделать то же самое на переднем плане, упомянутое выше не будет работать, и ни один из них не будет создавать канал уведомлений с именем "Разное" и id "{package}.MISCELLANEOUS", а затем отправит его. Когда я делаю то, что происходит, это следующее:

Снимок экрана из настроек моего приложения

Что я хочу знать

Как отправить уведомление без канала, например FCM, поэтому он попадает в обычный "Другой" канал?

Примеры этой работы

Как я упоминал выше, это происходит с уведомлениями FCM, но, например, Gmail также использует другой канал. Итак, как мне его использовать?

Снимок экрана каналов уведомлений Gmail

Я считаю, что они удалили бы другой канал, если он обычно непригоден.

дел >

Более короткое описание

Почему этот код не отправляет уведомление на канал уведомлений "Разное" , он фактически не отправляет уведомления (только на 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())

Ответ 1

Идентификатор для этого канала fcm_fallback_notification_channel. Библиотека firebase-messaging создает ее внутри.

Ответ 2

Как было сказано в другом ответе, идентификатором канала по умолчанию, созданного системой Android, является fcm_fallback_notification_channel, но будьте осторожны, поскольку система не создает канал, пока она не будет управлять первым push-уведомлением, Поэтому, если вы управляете всеми уведомлениями внутри вашего расширения класса 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);
}