Как узнать идентификатор канала уведомлений из RemoteMessage

Я зарегистрировал канал уведомлений в приложении для Android после GoogleSamples https://github.com/googlesamples/android-NotificationChannels

Однако как я могу получить идентификатор канала уведомлений из RemoteMessage, поэтому я могу установить его в NotificationBuilder.

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) 
{
//int id = remoteMessage.getNotificationChannel(); // -something like this I could not find
}

Я нашел это значение в объекте RemoteMessage

enter image description here

value [3] = "notification_channel_system", поэтому я могу установить значение для pushbase push-уведомления с использованием значения ключа android_channel_id https://firebase.google.com/docs/cloud-messaging/http-server-ref, но я не могу получить его, когда он принимается устройством.

Как получить этот идентификатор из PushNotification и установить его в конструктор уведомлений?

Ответ 1

Начиная с 17.4.0 существует официальный API для его получения, см. Ответ Марко Гайича ниже.

Устаревший ответ

Объект RemoteMessage содержит канал в своем Bundle, однако getData() удаляет все, что начинается, помимо прочего, с gcm. , К сожалению, это включает ключ канала, который является gcm.notification.android_channel_id.

Для моих целей, когда push-уведомление получено, когда приложение находится на переднем плане, я все еще хотел отобразить его в системе, используя идентификатор канала, который был отправлен с сервера.

Я могу добиться этого (по общему признанию немного хакерский) с простым двухстрочным файлом:

package com.google.firebase.messaging

fun RemoteMessage.getChannel() : String? = zzds.getString("gcm.notification.android_channel_id")

Ответ 2

Смотрите getChannelId():

Получает идентификатор канала из уведомления. Обратите внимание, что этот метод не выполняет проверку существования канала, и при этом он не отступает к определенному по умолчанию манифесту или каналу FCM по умолчанию.

Возвращает идентификатор канала, который был указан при отправке сообщения, в противном случае - ноль.


Покопался с Android Notification Channels в связи с FCM и вот что я получил:

Там в настоящее время нет функции, чтобы получить идентификатор канала уведомления (ака android_channel_id или из поста - notification_channel_system). AFAICT, это работает как задумано. Поскольку идентификатор канала уведомления, включенный в полезную нагрузку от FCM, должен обрабатываться клиентом автоматически. Из документов (выделение мое):

Идентификатор канала уведомлений (новый в Android O).

Приложение должно создать канал с этим идентификатором до получения любого уведомления с этим ключом.

Если вы не отправите этот ключ в запросе или если указанный вами идентификатор канала еще не создан вашим приложением, FCM использует идентификатор канала, указанный в манифесте вашего приложения.

Это означает, что вы должны создать идентификаторы каналов уведомлений, которые вы намереваетесь использовать в первую очередь - я создал каналы уведомлений в экземпляре приложения, например, так:

private void initNotificationChannels() {
    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    String channelIdOne = "com.my.fcm.test.app.test_channel_one";
    CharSequence nameOne = getString(R.string.channel_one_name);
    String descriptionOne = getString(R.string.channel_one_description);
    int importanceOne = NotificationManager.IMPORTANCE_HIGH;

    NotificationChannel channelOne = new NotificationChannel(channelIdOne, nameOne, importanceOne);
    channelOne.setDescription(descriptionOne);
    channelOne.enableLights(true);
    channelOne.setLightColor(Color.GREEN);
    channelOne.enableVibration(false);
    mNotificationManager.createNotificationChannel(channelOne);

    String channelIdTwo = "com.my.fcm.test.app.test_channel_two";
    CharSequence nameTwo = getString(R.string.channel_two_name);
    String descriptionTwo = getString(R.string.channel_two_description);
    int importanceTwo = NotificationManager.IMPORTANCE_DEFAULT;

    NotificationChannel channelTwo = new NotificationChannel(channelIdTwo, nameTwo, importanceTwo);
    // Configure the notification channel.
    channelTwo.setDescription(descriptionTwo);
    channelTwo.enableVibration(false);
    mNotificationManager.createNotificationChannel(channelTwo);
}

Таким образом, когда приходит полезная нагрузка, клиент сам должен обрабатывать ее соответствующим образом.

Ответ 3

Начиная с версии Cloud Messaging 17.4.0, класс RemoteMessage.Notification был расширен с помощью метода getChannelId(), поэтому теперь он официально поддерживается.

Из примечаний к выпуску Firebase:

Cloud Messaging версия 17.4.0

Добавлен метод getChannelId в RemoteMessage.Notification для получения идентификатора канала, установленного в уведомлении.

Ответ 4

Попробуйте этот код

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) 
{
    String id = remoteMessage.getNotification().getChannelId()
}