De la FCM - Réglage de l'insigne en onMessageReceived
J'ai une application Android, où je suis à l'aide d'une méthode pour afficher numéro de notification sur l'icône de l'application. Maintenant, je veux mettre ce numéro lors de la réception de la notification.
J'ai pensé que je devais définir le nombre lors de la notification reçue alors je l'ai mis à l'intérieur de onMessageReceived
méthode. Mais, mon problème est lorsque mon application est en arrière-plan, onMessageReceived
méthode n'est pas appelé, de sorte que le numéro de notification n'est pas définie.
Voici mon code. J'ai fixé le nombre à l'intérieur de onMessageReceived
. Je l'ai déjà testé setBadge
méthode et de vérifier qu'il fonctionne. Le problème est onMessageReceived
n'est pas appelé ainsi setBadge
est pas appelée, ce qui n'est pas de définir le nombre.
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
//TODO(developer): Handle FCM messages here.
Log.d(TAG, "From: " + remoteMessage.getFrom());
Conts.notificationCounter ++;
//I am setting in here.
setBadge(getApplicationContext(),Conts.notificationCounter );
Log.e("notificationNUmber",":"+ Conts.notificationCounter);
//Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
}
//Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
//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.
}
//[END receive_message]
public static void setBadge(Context context, int count) {
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
Log.e("classname","null");
return;
}
Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
intent.putExtra("badge_count", count);
intent.putExtra("badge_count_package_name", context.getPackageName());
intent.putExtra("badge_count_class_name", launcherClassName);
context.sendBroadcast(intent);
}
public static String getLauncherClassName(Context context) {
PackageManager pm = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
for (ResolveInfo resolveInfo : resolveInfos) {
String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
if (pkgName.equalsIgnoreCase(context.getPackageName())) {
String className = resolveInfo.activityInfo.name;
return className;
}
}
return null;
}
Quand j'ai cherché ce question, j'ai trouvé que si la venue message est afficher de message puis onMessageReceived
est appelée uniquement si l'application est au premier plan. Mais si vous venez de message est message de données puis onMessageReceived
, même si l'application est en arrière-plan.
Mais mon ami m'a dit qui est de l'envoi de la notification(côté serveur), le message va déjà comme à la fois l'affichage et le message de données. Il a dit que l'objet de données est remplie.
Suivant est le JSON pour à venir message, il a objet de données.
{
"to":"my_device_id",
"priority":"high",
"notification":{
"body":"Notification Body",
"title":"Notification Title",
"icon":"myicon",
"sound":"default"
},
"data":{
"Nick":"DataNick",
"Room":"DataRoom"
}
}
Si je n'utilise que les données de l'objet, onMessageReceived est appelé comme ils l'ont dit, mais que le temps de notification ne s'affiche pas en haut.
Maintenant pourquoi onMessageReceived
n'est pas appelée si le message est également le message de données. Dois-je faire quelque chose de différent pour gérer les données de message? Est-ce de travailler même avec affichage de la messagerie dans le côté client.
Toute aide serait appréciée. Merci à l'avance.
Vous devez fournir les codes que vous utilisez. Juste pour dire que le scénario ne va pas aider beaucoup. stackoverflow.com/help/mcve
Vous poster le code ici
OriginalL'auteur Hilal | 2016-09-05
Vous devez vous connecter pour publier un commentaire.
Aucun moyen d'appeler onMessageReceived à moins que la venue json comprend SEULEMENT des données de charge utile que j'ai appris de Firebase soutien.
Donc, je dois utiliser les données de charge utile, mais si vous utilisez des données de charge utile, il ne pas afficher les notifications dans le haut de sorte que vous devriez créer votre propre notification à l'aide des données de charge utile de l'information.
Donc je envoyé une notification à moi-même quand j'ai la charge utile de données dans onMessageReceived. Et j'ai mis le badge dans onMessageReceived droite après l'envoi de la notification à moi-même.
Code suivant est la version finale.
Merci pour tout.
Non,il n'est pas. J'ai utilisé certains github codes. Setbadge en fait partie.
Pourriez-vous fournir le lien vers le Github du code que vous avez utilisé
Bon désolé pour mon commentaire précédent. Je pense que j'ai été confus au sujet de setBadge méthode, parce que je suis à essayer de trouver de la bibliothèque pendant des heures et ne pouvait pas trouver toute la bibliothèque. Qui semble ces codes sous setBadge peut travailler sans aucune bibliothèque, mais je suppose que pour les appareils Samsung=> stackoverflow.com/a/20261795/5528870 les Gens dire que cette bibliothèque est agréable et les œuvres de nombreux appareils=> github.com/leolin310148/ShortcutBadger Aussi, j'ai appris que, depuis l'api de niveau 26 il y a une méthode par défaut pour le réglage de badges. developer.android.com/training/notify-user/badges#java @Pratique
OriginalL'auteur Hilal
À faire des choses lors de la réception de Notification de charges dans le fond, de substituer zzE dans FirebaseMessagingService. Le nom de la méthode peut changer entre les versions, il suffit de taper @Override dans la classe pour voir ce qu'il suggère pour vous. Dans mon cas, j'ai trouvé zzD et zzE, et en les essayant, j'ai remarqué que zzE a les données que je voulais. zzD eu quelques wakelock-des trucs dans ses extras. La valeur de retour de zzE fondamentalement indique si la notification a été manipulé, donc si vous retourne true, le système d'exploitation ne montrent pas la notification. Je préfère retourner super.zzE(but) après j'ai fait mes choses, pour laisser le handle de la notification.
Mise à jour le badge ne fonctionne que sur les lanceurs pris en charge par ShortcutBadger. Vous pouvez faire à peu près tout ce que vous voulez au lieu de cela, cependant.
Voici mon code (mes notifications contiennent des "badge" dans la charge utile de données):
Pas en mesure de trouver zzE()
Cela fonctionne avec firebase 10.2.1, dans les versions ultérieures la méthode a été caché. Que l'ancienne version fonctionne encore bien, alors je suis coller avec elle jusqu'à ce qu'une solution différente. Je ne comprends vraiment pas pourquoi ils ne masquer que, bien que, je ne vois pas ce qu'il fera de mal à permettre aux développeurs de modifier la manière dont les notifications sont affichées...
OriginalL'auteur Pauli Kettunen
Android sans personnalisé des lanceurs et des interfaces tactiles ne pas autoriser la modification de l'icône de l'application, car il est scellé dans le .apk étroitement une fois que le programme est compilé. Il n'y a aucun moyen de le changer pour un "drawable' par programmation à l'aide des Api standard.Donc le code ci-dessous fonctionne uniquement en Samsung,Htc,Sony, etc.
pour plus d'info cliquez sur ici
OriginalL'auteur Dhina k