Вы также можете использовать меню восстановления в MySQL Administrator. Вам просто нужно открыть резервный файл, а затем нажать кнопку восстановления.
К сожалению, это было ограничение уведомлений Firebase в SDK 9.0.0-9.6.1. Когда приложение находится в фоновом режиме, значок манифеста используется из манифеста (с требуемым оттенком Android) для сообщений, отправленных с консоли.
С SDK 9.8.0 вы можете переопределить значение по умолчанию! В вашем AndroidManifest.xml вы можете установить следующие поля для настройки значка и цвета:
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/notification_icon" />
<meta-data android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/google_blue" />
Обратите внимание, что если приложение находится на переднем плане (или отправлено сообщение с данными), вы можете полностью использовать свои собственную логику для настройки дисплея. Вы также можете всегда настраивать значок, отправляя сообщение из API HTTP / XMPP.
Существует также один уродливый, но рабочий путь. Декомпилируйте FirebaseMessagingService.class и измените его поведение. Затем просто поместите класс в нужный пакет в приложении yout, а dex используйте его вместо класса в самой папке сообщений. Это довольно просто и работает.
Существует метод:
private void zzo(Intent intent) {
Bundle bundle = intent.getExtras();
bundle.remove("android.support.content.wakelockid");
if (zza.zzac(bundle)) { // true if msg is notification sent from FirebaseConsole
if (!zza.zzdc((Context)this)) { // true if app is on foreground
zza.zzer((Context)this).zzas(bundle); // create notification
return;
}
// parse notification data to allow use it in onMessageReceived whe app is on foreground
if (FirebaseMessagingService.zzav(bundle)) {
zzb.zzo((Context)this, intent);
}
}
this.onMessageReceived(new RemoteMessage(bundle));
}
Этот код из версии 9.4.0, метод будет иметь разные имена в другой версии из-за обфускации.
, если ваше приложение находится в фоновом режиме, значок уведомлений будет установлен в методе приема сообщений, но если приложение находится на переднем плане, значок уведомления будет тем, который вы определили в манифесте
Мое решение похоже на одно решение ATom, но его проще реализовать. Вам не нужно создавать класс, полностью закрывающий FirebaseMessagingService, вы можете просто переопределить метод, который получает Intent (который является общедоступным, по крайней мере, в версии 9.6.1) и отображать информацию, отображаемую из дополнительных функций. «Хакерная» часть состоит в том, что имя метода действительно запутано и будет меняться каждый раз, когда вы обновляете Firebase sdk до новой версии, но вы можете быстро просмотреть его, проверив FirebaseMessagingService с помощью Android Studio и ищет общедоступный метод, который принимает Intent как единственный параметр. В версии 9.6.1 он называется zzm. Вот как выглядит мой сервис:
public class MyNotificationService extends FirebaseMessagingService {
public void onMessageReceived(RemoteMessage remoteMessage) {
// do nothing
}
@Override
public void zzm(Intent intent) {
Intent launchIntent = new Intent(this, SplashScreenActivity.class);
launchIntent.setAction(Intent.ACTION_MAIN);
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* R equest code */, launchIntent,
PendingIntent.FLAG_ONE_SHOT);
Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),
R.mipmap.ic_launcher);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notification)
.setLargeIcon(rawBitmap)
.setContentTitle(intent.getStringExtra("gcm.notification.title"))
.setContentText(intent.getStringExtra("gcm.notification.body"))
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
Используйте серверную реализацию для отправки сообщений вашему клиенту и используйте сообщения типа data , а не сообщения notification .
Это поможет вам получить обратный вызов onMessageReceived
независимо от того, находится ли ваше приложение в фоновом режиме или переднем плане, и вы можете создать свое собственное уведомление, а затем
Я запускаю свои уведомления с консоли FCM и через HTTP / JSON ... с тем же результатом.
Я могу обрабатывать заголовок, полное сообщение, но значок всегда представляет собой белый круг по умолчанию :
Вместо моего пользовательского значка в коде (setSmallIcon или setSmallIcon) или значка по умолчанию из приложения:
Intent intent = new Intent(this, MainActivity.class);
// use System.currentTimeMillis() to have a unique ID for the pending intent
PendingIntent pIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), intent, 0);
if (Build.VERSION.SDK_INT < 16) {
Notification n = new Notification.Builder(this)
.setContentTitle(messageTitle)
.setContentText(messageBody)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pIntent)
.setAutoCancel(true).getNotification();
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//notificationManager.notify(0, n);
notificationManager.notify(id, n);
} else {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
Notification n = new Notification.Builder(this)
.setContentTitle(messageTitle)
.setContentText(messageBody)
.setSmallIcon(R.drawable.ic_stat_ic_notification)
.setLargeIcon(bm)
.setContentIntent(pIntent)
.setAutoCancel(true).build();
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//notificationManager.notify(0, n);
notificationManager.notify(id, n);
}
atm они работают над этой проблемой https://github.com/firebase/quickstart-android/issues/4
при отправке уведомления от консоль Firebase по умолчанию использует значок вашего приложения, и система Android превратит этот значок сплошным белым, когда на панели уведомлений.
Если вы недовольны этим результатом, вы должны реализовать FirebaseMessagingService и создавать уведомления вручную когда вы получаете сообщение. Мы работаем над тем, чтобы улучшить это, но на данный момент это единственный способ.
blockquote>изменить: с SDK 9.8.0 добавить в AndroidManifest.xml
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/my_favorite_pic"/>
В SHORT SOLUTION
Это происходит только при отправке сообщений через консоль firebase, а не в apis
Проблема
Переключение с старого gcm на новый FirebaseMessagingService я подумал, что было бы хорошо протестировать, поэтому я создал сообщения, используя консоль firebase, и обнаружил, что когда приложение является фоном, мое пользовательское уведомление не работает, а Firebase onMessageReceived не вызывается, когда приложение в фоновом режиме
Решение
Я попытался создать сообщения из api, и только тогда я понял, что Firebase onMessageReceived не вызывается, когда приложение в фоновом режиме возникает только при создании сообщений из Firebase Console, а не при отправке из API
Просто установите targetSdkVersion на 19. Значок уведомлений будет окрашен. Затем подождите, пока Firebase устранит эту проблему.