J'ai un problème avec FireBase Cloud Messaging, dans lequel je récupère le jeton du périphérique et envoie le test de notification via la console de notification de Google Firebase. Toutefois, la notification n'est jamais enregistrée ni transmise au périphérique virtuel Android. La documentation de FCM est presque exactement le code que j'ai ci-dessous et une petite partie de ce que vous auriez à faire pour que les notifications Push fonctionnent avec firebase. J'ai parcouru toutes les informations de configuration (additions build.gradle, Installation des services de Google Play, etc.) spécifiées dans la documentation, mais je n'ai toujours pas de messages générant. Je reçois une erreur ponctuelle immédiatement après l'envoi de la notification indiquant "I/FA: le gestionnaire de balises est introuvable et ne sera donc pas utilisé", mais il s'agit des seules données générées et je n'ai rien trouvé en rapport avec Tag. Besoins du responsable et FCM sur les googles. Quel est le problème avec le code que je ne reçois pas mes notifications Push à logcat ou au périphérique? S'il vous plaît laissez-moi savoir toute information supplémentaire qui pourrait être utile. Merci.
NotificationGenie.Java
public class NotificationGenie extends FirebaseMessagingService {
private static final String TAG = "Firebase_MSG";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
// 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.getNotification().getBody());
Log.d(TAG, "From: " + remoteMessage.getFrom());
Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
}
private void sendNotification(String messageBody) {
Intent intent = new Intent(this, PostLoginActivity.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);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.tf2spyprofile)
.setContentTitle("FCM Message")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="org.test.movile_Android">
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.READ_PROFILE" />
<uses-permission Android:name="Android.permission.READ_CONTACTS" />
<uses-permission Android:name="Android.permission.INTERNET" />
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
<activity
Android:name=".LoginActivity"
Android:label="@string/title_activity_login">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
Android:name=".DashBoardActivity"
Android:label="@string/title_activity_dash_board"
Android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
Android:name=".NewOrderActivity"
Android:label="@string/title_activity_dash_board"
Android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
Android:name=".PostLoginActivity"
Android:label="@string/title_activity_dash_board"
Android:theme="@style/AppTheme.NoActionBar">
</activity>
</application>
<service
Android:name=".NotificationGenie">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
Vous avez placé votre service en dehors de la balise d'application. Changer le fond à cela.
<service
Android:name=".NotificationGenie">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
</application>
J'ai eu le même problème et il est résolu en définissant activé, exporté vers true dans mon service
<service
Android:name=".MyFirebaseMessagingService"
Android:enabled="true"
Android:exported="true">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
"Vous devez également garder à l'esprit que pour recevoir les messages envoyés depuis la console Firebase, l'application doit être en arrière-plan, non démarrée ni cachée." --- Selon le commentaire de @Laurent Russier.
Je n'ai jamais reçu de message de Firebase, jusqu'à ce que je mette mon application en arrière-plan.
Ceci est vrai uniquement sur une connexion USB pour émulateur, vous recevez également une notification au premier plan
Appelez super.OnMessageReceived()
dans la méthode Overridden. Cela a fonctionné pour moi! Finalement!
Je faisais face au même problème mais j'avais toujours des débris dans mon manifeste de l'ancien MCG. Lorsque j'ai retiré l'autorisation suivante de mon manifeste, l'erreur a été corrigée. com.google.Android.c2dm.permission.RECEIVE
J'ai rencontré le même problème de messagerie Cloud Firebase non reçue par le périphérique.
Dans mon cas, le nom du paquet défini dans Firebase Console Project était différent de celui défini dans Manifest & Gradle de mon Android Project.
En conséquence, j'ai reçu le jeton correctement mais pas de message du tout.
Pour résumer, il est obligatoire que le nom du package de la console Firebase et les correspondances Manifest & Gradle.
Vous devez également garder à l'esprit que pour recevoir les messages envoyés depuis la console Firebase, l'application doit être en arrière-plan, non démarrée ni cachée.
J'avais un problème similaire, mais dans mon cas il me manquait le plugin google-services
de ma version Gradle (j'ajoutais Firebase à un projet existant).
J'ai ajouté ce qui suit à ma racine _build.gradle
_:
_classpath 'com.google.gms:google-services:3.1.0'
_
et le suivant jusqu'à la fin de mon app
- niveau _build.gradle
_:
_apply plugin: 'com.google.gms.google-services'
_
J'ai ensuite dû télécharger le fichier _google-services.json
_ à partir de la console Firebase (après avoir importé à l'origine un projet Google Cloud existant) et le copier dans mon répertoire app
.
Si vous venez d'ajouter FCM à une application existante, onTokenRefresh()
ne sera PAS appelé. Je l'ai fait fonctionner en désinstallant l'application et en l'installant à nouveau.
Vous devez suivre le code de manifeste ci-dessous (le service doit obligatoirement figurer dans le manifeste)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="soapusingretrofitvolley.firebase">
<uses-permission Android:name="Android.permission.INTERNET"/>
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
<activity Android:name=".MainActivity">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
Android:name=".MyFirebaseMessagingService">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
Android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
</application>
</manifest>
Dans mon cas, j'ai remarqué que mergedmanifest manquait le destinataire. Je devais donc inclure:
<receiver
Android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
Android:exported="true"
Android:permission="com.google.Android.c2dm.permission.SEND" >
<intent-filter>
<action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
</intent-filter>
</receiver>
<activity Android:name=".activity.MainActivity">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Firebase Notifications -->
<service Android:name=".service.MyFirebaseMessagingService">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service Android:name=".service.MyFirebaseInstanceIDService">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
Lors de la copie du jeton de votre appareil, il est possible que vous copiiez de l’espace. Vérifiez que vous avez bien copié le bon jeton.
Comme si vous voulez que votre application soit exécutée dans plus de 24 versions, suivez ces étapes:
1.Ajouter ceci dans votre strings.xml
<string name = "default_notification_channel_id" translatable = "false"> fcm_default_channel
<méta-données Android: name = "com.google.firebase.messaging.default_notification_channel_id" Android: valeur = "@ string/default_notification_channel_id" />
3.pour créer des notifications (avec images), utilisez cette méthode lorsque vous gérez des notifications, si vous ajoutez directement le service firebasemessaging ou, si vous utilisez une classe util, ajoutez-y cette classe util:
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
public static void createBigNotification(Bitmap bitmap, int icon, String message, Uri alarmSound) {
final int NOTIFY_ID = 0; // ID of notification
NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE);
String id = mContext.getString(R.string.default_notification_channel_id); // default_channel_id
String title = mContext.getString(R.string.app_name);
Intent intent;
NotificationCompat.Builder builder;
if (notificationManager == null) {
notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
}
PendingIntent resultPendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = notificationManager.getNotificationChannel(id);
if (mChannel == null) {
mChannel = new NotificationChannel(id, title, importance);
mChannel.enableVibration(true);
mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
notificationManager.createNotificationChannel(mChannel);
}
builder = new NotificationCompat.Builder(mContext, id);
intent = new Intent(mContext, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
resultPendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
bigPictureStyle.setBigContentTitle(title);
bigPictureStyle.setSummaryText(Html.fromHtml(message).toString());
bigPictureStyle.bigPicture(bitmap);
builder.setContentTitle(title) // required
.setSmallIcon(R.drawable.app_icon) // required
.setContentText(message) // required
.setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true)
.setSound(alarmSound)
.setStyle(bigPictureStyle)
.setContentIntent(resultPendingIntent)
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
.setTicker(title)
.setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
} else {
builder = new NotificationCompat.Builder(mContext, id);
intent = new Intent(mContext, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
resultPendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
bigPictureStyle.setBigContentTitle(title);
bigPictureStyle.setSummaryText(Html.fromHtml(message).toString());
bigPictureStyle.bigPicture(bitmap);
builder.setContentTitle(title) // required
.setSmallIcon(R.drawable.app_icon) // required
.setContentText(message) // required
.setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true)
.setSound(alarmSound)
.setStyle(bigPictureStyle)
.setContentIntent(resultPendingIntent)
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
.setTicker(title)
.setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
.setPriority(Notification.PRIORITY_HIGH);
}
Notification notification = builder.build();
notificationManager.notify(NOTIFY_ID, notification);
}
Suivez ces étapes et votre notification viendra dans la barre de notification.
private void sendNotification(String message) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
int requestCode = 0;
PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_ONE_SHOT);
Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.URI_COLUMN_INDEX);
NotificationCompat.Builder noBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentText(message)
.setColor(getResources().getColor(R.color.colorPrimaryDark))
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("FCM Message")
.setContentText("hello").setLargeIcon(((BitmapDrawable) getResources().getDrawable(R.drawable.dog)).getBitmap())
.setStyle(new NotificationCompat.BigPictureStyle()
.bigPicture(((BitmapDrawable) getResources().getDrawable(R.drawable.dog)).getBitmap()))
.setAutoCancel(true)
.setSound(sound)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, noBuilder.build());
J'ai travaillé sur tout ce billet et d'autres ainsi que sur des vidéos tutorielles sans pouvoir résoudre mon problème de non réception de messages, le jeton d'enregistrement fonctionnant toutefois.
Jusque-là, je n'avais testé que l'application sur l'émulateur. Après l'avoir essayé sur un téléphone physique, il a fonctionné instantanément sans aucune modification préalable du projet.