Работа с push-уведомлениями Firebase без каналов уведомлений

Мне нужно генерировать уведомления при получении PUSH-уведомления, но также мне нужно генерировать уведомления (для отображения их в панели уведомлений устройства), когда что-то происходит в приложении, поэтому я использую NotificationCompat.Builder для этого.

Как вы знаете, Android отклонил этот вызов Notification.Builder:

Notification.Builder (Context context)

И теперь вы должны использовать этот вызов:

NotificationCompat.Builder (Context context, String channelId)

Что произойдет, если вы не хотите указывать канал уведомлений и хотите отправлять общие уведомления всем пользователям вашего приложения и хотите получать все уведомления во всех установленных приложениях без работы с каналами уведомлений? Или что произойдет, если вы захотите создать простое уведомление в панели уведомлений, когда пользователь нажал кнопку в вашем приложении? Как отобразить уведомление без указания channelId? Я имею в виду... просто работает, как до API 26 и до появления каналов уведомлений.

Не вижу как работать без указания каналов уведомлений ни в одном месте официальной документации.

3 ответа

Я не знаю, отвечает ли это на вопрос или нет. Но наличие любого канала ниже api 26 просто работало, ничего не делая в моем приложении.

1. instantiate notificationCompat with some channel Id 
//which is irrelevant for api < 26 

2. handle the case of creating notification channel for api 26+

3. bundled it up.

Это просто сработало. Настройка уведомлений не имела никаких эффектов ниже api 26.

Каналы уведомлений являются обязательными на Android 8+. Так что вы должны использовать NotificationCompat.Builder(Context context, String channelId) и создать канал (ы) на API 26+ через NotificationManager.createNotificationChannel(NotificationChannel channel),

На api < 26, просто не вызывайте createNotificationChannel, а позволяйте параметру идентификатора канала (просто String).

val builder = NotificationCompat.Builder(context, "a_channel_id")
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setSmallIcon(R.drawable.ic_notif)
            .setAutoCancel(true)
...
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.notify(NOTIFICATION_ID, builder.build())

на Api 26+ создайте канал раньше:

val channel = NotificationChannel("a_channel_id", "channel_name", NotificationManager.IMPORTANCE_HIGH)
channel.description = "channel_description"
channel.enableLights(true)
channel.lightColor = Color.RED
channel.enableVibration(true)
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.createNotificationChannel(channel)

В настоящее время нет обходного пути для этого. Каналы уведомлений были недавно анонсированы (последний ввод-вывод, если я правильно помню), и (скорее всего, если не совсем) здесь, чтобы остаться. Хотя я делаю что-то вроде этого.

Чтобы соответствовать новому стандарту, я просто внедряю каналы уведомлений, но только по мере необходимости. Я также использую FCM в своем приложении, и вот что-то похожее на то, что у меня есть для него - это в моем классе Application:

    private void initFirebase() {
        ... // other Firebase stuff.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) initNotificationChannels();
    }

    @TargetApi(Build.VERSION_CODES.O)
    private void initNotificationChannels() {
        NotificationChannel publicChannel = new NotificationChannel(NOTIFICATION_CHANNEL_PUBLIC,
                NOTIFICATION_CHANNEL_PUBLIC, NotificationManager.IMPORTANCE_DEFAULT);
        publicChannel.setDescription(NOTIFICATION_CHANNEL_PUBLIC);

        NotificationChannel privateChannel = new NotificationChannel(NOTIFICATION_CHANNEL_PRIVATE,
                NOTIFICATION_CHANNEL_PRIVATE, NotificationManager.IMPORTANCE_HIGH);
        publicChannel.setDescription(NOTIFICATION_CHANNEL_PRIVATE);

        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (mNotificationManager != null) {
            mNotificationManager.createNotificationChannel(publicChannel);
            mNotificationManager.createNotificationChannel(privateChannel);
        }
    }

И мой MessagingService есть что-то вроде этого:

private static final String NOTIFICATION_CHANNEL_PRIVATE = "my.app.package.name.private";
private static final String NOTIFICATION_CHANNEL_PUBLIC = "my.app.package.name.public";

private void buildNotification(....(other params),String source, String message) {
    String channelId = getChannelId(source);

    Intent resultIntent = new Intent(this, MyActivity.class);
    resultIntent.putExtra(EXTRAS_PARAM_ID, myVal);
    PendingIntent notificationIntent = buildNotificationIntent(channelId, roomId, roomType);

    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, getChannelId(source))
                    .setSmallIcon(R.drawable.ic_sample
                    .setContentTitle(title)
                    .setContentText(message)
                    .setAutoCancel(true)
                    .setDefaults(Notification.DEFAULT_SOUND)
                    .setContentIntent(notificationIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(id, 0, notificationBuilder.build());
}

private String getChannelId(String source) {
    switch(source){
        case PRIVATE:
           return NOTIFIFICATION_CHANNEL_PRIVATE;
        default:
           return NOTIFICATION_CHANNEL_PUBLIC;
    }
}