Белый квадрат и серый фон Значок уведомления о путях Firebase [дубликат]

Вы также можете использовать меню восстановления в MySQL Administrator. Вам просто нужно открыть резервный файл, а затем нажать кнопку восстановления.

87
задан marco 19 May 2016 в 13:41
поделиться

9 ответов

К сожалению, это было ограничение уведомлений 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.

187
ответ дан Ian Barber 28 August 2018 в 05:16
поделиться

Существует также один уродливый, но рабочий путь. Декомпилируйте 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, метод будет иметь разные имена в другой версии из-за обфускации.

3
ответ дан ATom 28 August 2018 в 05:16
поделиться

, если ваше приложение находится в фоновом режиме, значок уведомлений будет установлен в методе приема сообщений, но если приложение находится на переднем плане, значок уведомления будет тем, который вы определили в манифесте

2
ответ дан brook 28 August 2018 в 05:16
поделиться

Мое решение похоже на одно решение 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());
    }
}
5
ответ дан Carlo Conserva 28 August 2018 в 05:16
поделиться

Используйте серверную реализацию для отправки сообщений вашему клиенту и используйте сообщения типа data , а не сообщения notification .

Это поможет вам получить обратный вызов onMessageReceived независимо от того, находится ли ваше приложение в фоновом режиме или переднем плане, и вы можете создать свое собственное уведомление, а затем

23
ответ дан geekoraul 28 August 2018 в 05:16
поделиться

Я запускаю свои уведомления с консоли 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);
    }
1
ответ дан Gonzalo 28 August 2018 в 05:16
поделиться

atm они работают над этой проблемой https://github.com/firebase/quickstart-android/issues/4

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

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

изменить: с SDK 9.8.0 добавить в AndroidManifest.xml

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/my_favorite_pic"/>
7
ответ дан Jan Hartwig 28 August 2018 в 05:16
поделиться

В SHORT SOLUTION

Это происходит только при отправке сообщений через консоль firebase, а не в apis

Проблема

Переключение с старого gcm на новый FirebaseMessagingService я подумал, что было бы хорошо протестировать, поэтому я создал сообщения, используя консоль firebase, и обнаружил, что когда приложение является фоном, мое пользовательское уведомление не работает, а Firebase onMessageReceived не вызывается, когда приложение в фоновом режиме

Решение

Я попытался создать сообщения из api, и только тогда я понял, что Firebase onMessageReceived не вызывается, когда приложение в фоновом режиме возникает только при создании сообщений из Firebase Console, а не при отправке из API

10
ответ дан Kaushik Bharadwaj 28 August 2018 в 05:16
поделиться

Просто установите targetSdkVersion на 19. Значок уведомлений будет окрашен. Затем подождите, пока Firebase устранит эту проблему.

2
ответ дан rattisuk 28 August 2018 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: