149 votes

Icône de notification avec le nouveau système de messagerie Firebase Cloud

Hier, Google a présenté à Google I / O le nouveau système de notification basé sur la nouvelle Firebase. J'ai essayé cette nouvelle FCM (Firebase Cloud Messaging) avec l'exemple sur Github.

L’icone de la notification est toujours ic_launcher bien que j’ai déclaré un dessin spécifique

Pourquoi ? Ci-dessous le code officiel de traitement du message

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

}
 

295voto

Ian Barber Points 2553

Malheureusement c'était une limitation de Firebase Notifications dans le SDK 9.0.0-9.6.1. Lorsque l'application est en arrière-plan sur l'icône de lancement est l'utilisation du manifeste (avec la condition d'Android teinture) pour les messages envoyés à partir de la console.

Avec SDK 9.8.0 cependant, vous pouvez remplacer la valeur par défaut! Dans votre AndroidManifest.xml vous pouvez définir les champs suivants pour personnaliser l'icône et la couleur:

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

À noter que si l'application est au premier plan (ou un message de données est envoyé), vous pouvez utiliser votre propre logique pour personnaliser l'affichage. Vous pouvez également personnaliser l'icône si l'envoi du message à partir de l'adresse HTTP/XMPP Api.

39voto

geekoraul Points 347

Utilisez une implémentation de serveur pour envoyer des messages à votre client et utilisez le type de données de messages plutôt que le type de notification .

Cela vous aidera à obtenir un rappel sur onMessageReceived que votre application soit en arrière-plan ou à l'avant-plan et vous pourrez générer votre notification personnalisée à ce moment-là.

11voto

Jan Hartwig Points 79

atm ils travaillent sur cette question https://github.com/firebase/quickstart-android/issues/4

lorsque vous envoyez une notification de l'Firebase console est utilise votre icône de l'application par défaut, et le système Android va activer l'icône de solide blanc quand dans la barre de notification.

Si vous n'êtes pas satisfait avec le résultat que vous devriez mettre en œuvre FirebaseMessagingService et de créer des notifications manuellement lorsque vous recevez un message. Nous travaillons sur un moyen de l'améliorer, mais pour l'instant c'est le seul moyen.

edit: avec le SDK 9.8.0 ajouter à AndroidManifest.xml

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

10voto

Kaushik Bharadwaj Points 122

En BREF SOLUTION

Il se produit uniquement lors de l'envoi de messages par le biais de la console de firebase et pas l'api

Problème

Passer de l'ancien gcm à nouveau FirebaseMessagingService j'ai pensé qu'il serait bon de tester j'ai donc créé des messages à l'aide de firebase de la console et ne se trouve que lorsque l'application est en arrière-plan de mon custom de notification n'a pas de travail et Firebase onMessageReceived pas appelé quand application en arrière-plan

Solution

J'ai essayé de créer des messages à partir de l'api et alors seulement je me rends compte que la Firebase onMessageReceived pas appelé quand application en arrière-plan le problème se produit uniquement lors de la création des messages à partir de la Firebase de la Console et non pas lors de l'envoi de l'API

6voto

Carlo Conserva Points 215

Ma solution est similaire à l'Atome, mais plus facile à mettre en œuvre. Vous n'avez pas besoin de créer une classe que les ombres FirebaseMessagingService complètement, vous pouvez simplement remplacer la méthode qui reçoit l'Intention (qui est publique, au moins dans la version 9.6.1) et de prendre les informations à afficher à partir de la extras. Le "hacky", c'est que le nom de la méthode est en effet d'obfuscation et va changer à chaque fois que vous mettez à jour le Firebase kit de développement pour une nouvelle version, mais vous pouvez le retrouver rapidement en inspectant FirebaseMessagingService avec Android Studio et à la recherche d'une méthode publique qui prend une Intention comme seul paramètre. Dans la version 9.6.1 il est appelé zzm. Voici comment mon service ressemble:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X