Как узнать идентификатор канала уведомлений из 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()
}