Вчера Google представил на Google I / O новую систему уведомлений, основанную на новом Firebase. Я попробовал этот новый FCM (Firebase Cloud Messaging) с примером на Github.
Значок уведомления всегда является ic_launcher, несмотря на то, что я объявил конкретную возможность рисования.
Зачем ? Ниже приведен официальный код для обработки сообщения.
public class AppFirebaseMessagingService extends FirebaseMessagingService {
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// If the application is in the foreground handle both data and notification messages here.
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
sendNotification(remoteMessage);
}
// [END receive_message]
/**
* Create and show a simple notification containing the received FCM message.
*
* @param remoteMessage FCM RemoteMessage received.
*/
private void sendNotification(RemoteMessage remoteMessage) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
// this is a my insertion looking for a solution
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.myicon: R.mipmap.myicon;
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(icon)
.setContentTitle(remoteMessage.getFrom())
.setContentText(remoteMessage.getNotification().getBody())
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
Ответы:
К сожалению, это было ограничением уведомлений Firebase в SDK 9.0.0-9.6.1. Когда приложение находится в фоновом режиме, значок запуска используется из манифеста (с необходимой тонировкой Android) для сообщений, отправленных с консоли.
Однако с SDK 9.8.0 вы можете изменить значение по умолчанию! В вашем AndroidManifest.xml вы можете установить следующие поля для настройки значка и цвета:
Обратите внимание, что если приложение находится на переднем плане (или отправлено сообщение с данными), вы можете полностью использовать свою собственную логику для настройки отображения. Вы также всегда можете настроить значок при отправке сообщения из API HTTP / XMPP.
источник
Используйте реализацию сервера для отправки сообщений на клиент и использование данных типов сообщений , а не уведомление типа сообщений.
Это поможет вам получить обратный вызов
onMessageReceived
независимо от того, находится ли ваше приложение в фоновом режиме или на переднем плане, и вы можете сгенерировать свое собственное уведомление, а затемисточник
atm они работают над этой проблемой https://github.com/firebase/quickstart-android/issues/4
изменить: с SDK 9.8.0 добавить в AndroidManifest.xml
источник
Мое решение похоже на решение ATom, но проще в реализации. Вам не нужно создавать класс, который полностью затеняет FirebaseMessagingService, вы можете просто переопределить метод, который получает Intent (который является общедоступным, по крайней мере, в версии 9.6.1), и взять информацию, которая будет отображаться из дополнительных компонентов. «Хакерская» часть заключается в том, что имя метода действительно запутано и будет меняться каждый раз, когда вы обновляете SDK Firebase до новой версии, но вы можете быстро найти его, проверив FirebaseMessagingService с помощью Android Studio и ища общедоступный метод, который принимает Намерение как единственный параметр. В версии 9.6.1 он называется zzm. Вот как выглядит мой сервис:
источник
Просто установите targetSdkVersion на 19. Значок уведомления будет цветным. Затем дождитесь, пока Firebase исправит эту проблему.
источник
Есть еще один некрасивый, но рабочий способ. Декомпилируйте FirebaseMessagingService.class и измените его поведение. Затем просто поместите класс в нужный пакет в приложении yout, и dex будет использовать его вместо класса в самой библиотеке сообщений. Это довольно просто и работает.
Есть способ:
Это код из версии 9.4.0, метод будет иметь разные имена в разных версиях из-за обфускации.
источник
если ваше приложение находится в фоновом режиме, значок уведомления будет установлен в методе получения сообщения, но если ваше приложение находится на переднем плане, значок уведомления будет тем, который вы определили в манифесте
источник
Я запускаю свои уведомления из консоли FCM и через HTTP / JSON ... с тем же результатом.
Я могу обрабатывать заголовок, полное сообщение, но значок всегда является белым кружком по умолчанию:
Скриншот уведомления
Вместо моего пользовательского значка в коде (setSmallIcon или setSmallIcon) или значка по умолчанию из приложения:
источник
напиши это
прямо вниз
<application.....>
источник
Подумал, что добавлю ответ на этот вопрос, так как моя проблема была простой, но трудно заметить. В частности, я скопировал / вставил существующий элемент метаданных при создании my
com.google.firebase.messaging.default_notification_icon
, который использовалandroid:value
тег для указания его значения. Это не будет работать для значка уведомления, и как только я изменил его,android:resource
все работало, как ожидалось.источник
default_notification_color
мета, это должна бытьandroid:resource
настройка, посколькуandroid:value
она не будет работать