Подтвердить что ты не робот

Иконка уведомления с новой системой обмена облаками Firebase

Вчера Google представил в Google I/O новую систему уведомлений на основе новой Firebase. Я попробовал этот новый FCM (Firebase Cloud Messaging) с примером в Github.

Значок уведомления всегда является ic_launcher, несмотря на то, что я объявил конкретный drawable

Почему? Ниже приведен официальный код для обработки сообщения

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());
    }

}
4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

В КОРОТОМ РЕШЕНИИ

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

Проблема

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

Решение

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

Ответ 4

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"/>

Ответ 5

Мое решение похоже на 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());
    }
}

Ответ 6

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

Ответ 7

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

Ответ 8

Я запускаю свои уведомления с консоли 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);
    }

Ответ 9

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

введите описание изображения здесь

Ответ 10

напиши это

<meta-data 
         android:name="com.google.firebase.messaging.default_notification_icon"
         android:resource="@drawable/ic_notification" />

прямо <application.....>

enter image description here

Ответ 11

Я подумал, что добавлю ответ на этот вопрос, так как моя проблема проста, но ее трудно заметить. В частности, я скопировал/вставил существующий элемент метаданных при создании моего com.google.firebase.messaging.default_notification_icon, в котором для указания его значения использовался тег android:value value. Это не будет работать для значка уведомления, и как только я изменил его на android:resource все работает, как ожидалось.