Hier, Google a présenté à Google I / O le nouveau système de notification basé sur le nouveau Firebase. J'ai essayé ce nouveau FCM (Firebase Cloud Messaging) avec l'exemple sur Github.
L'icône de la notification est toujours le ic_launcher même si 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());
}
}
Réponses:
Malheureusement, il s'agissait d'une limitation des notifications Firebase dans le SDK 9.0.0-9.6.1. Lorsque l'application est en arrière-plan, l'icône du lanceur est utilisée à partir du manifeste (avec la teinte Android requise) pour les messages envoyés depuis la console.
Cependant, avec le SDK 9.8.0, 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:
Notez que si l'application est au premier plan (ou si un message de données est envoyé), vous pouvez entièrement utiliser votre propre logique pour personnaliser l'affichage. Vous pouvez également toujours personnaliser l'icône si vous envoyez le message à partir des API HTTP / XMPP.
la source
Utilisez une implémentation de serveur pour envoyer des messages à votre client et utilisez le type de données des messages plutôt que le type de notification des messages.
Cela vous aidera à obtenir un rappel,
onMessageReceived
que votre application soit en arrière-plan ou au premier plan et vous pouvez générer votre notification personnalisée alorsla source
atm ils travaillent sur ce problème https://github.com/firebase/quickstart-android/issues/4
edit: avec le SDK 9.8.0 ajouter à AndroidManifest.xml
la source
Ma solution est similaire à celle d'ATom, mais plus simple à mettre en œuvre. Vous n'avez pas besoin de créer une classe qui occulte complètement FirebaseMessagingService, vous pouvez simplement remplacer la méthode qui reçoit l'intention (qui est publique, au moins dans la version 9.6.1) et prendre les informations à afficher à partir des extras. La partie «hacky» est que le nom de la méthode est effectivement obscurci et va changer chaque fois que vous mettez à jour le sdk Firebase vers une nouvelle version, mais vous pouvez le rechercher rapidement en inspectant FirebaseMessagingService avec Android Studio et en recherchant une méthode publique qui prend une intention comme seul paramètre. Dans la version 9.6.1, il s'appelle zzm. Voici à quoi ressemble mon service:
la source
Réglez simplement targetSdkVersion sur 19. L'icône de notification sera colorée. Attendez ensuite que Firebase résout ce problème.
la source
Il y a aussi une manière moche mais efficace. Décompilez FirebaseMessagingService.class et modifiez son comportement. Ensuite, placez simplement la classe dans le bon package dans votre application et utilisez-le à la place de la classe dans la bibliothèque de messagerie elle-même. C'est assez simple et efficace.
Il existe une méthode:
Ce code est de la version 9.4.0, la méthode aura des noms différents dans différentes versions en raison de l'obfuscation.
la source
si votre application est en arrière-plan, l'icône de notification sera définie sur la méthode de réception de message, mais si votre application est au premier plan, l'icône de notification sera celle que vous avez définie sur le manifeste
la source
Je déclenche mes notifications depuis la console FCM et via HTTP / JSON ... avec le même résultat.
Je peux gérer le titre, le message complet, mais l'icône est toujours un cercle blanc par défaut:
Capture d'écran de notification
Au lieu de mon icône personnalisée dans le code (setSmallIcon ou setSmallIcon) ou de l'icône par défaut de l'application:
la source
écrire cela
en bas
<application.....>
la source
Je pensais ajouter une réponse à celle-ci, car mon problème était simple mais difficile à remarquer. En particulier, j'avais copié / collé un élément de méta-données existant lors de la création de my
com.google.firebase.messaging.default_notification_icon
, qui utilisait uneandroid:value
balise pour spécifier sa valeur. Cela ne fonctionnera pas pour l'icône de notification, et une fois que je l'ai changé,android:resource
tout a fonctionné comme prévu.la source
default_notification_color
méta, elle doit être unandroid:resource
- réglage carandroid:value
ne fonctionnera pas