web-dev-qa-db-fra.com

Notification de messagerie en nuage Firebase non reçue par le périphérique

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>
54
xec86

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>
50
Tristan Richard

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>
35
Hoby

"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

30
Html Tosin

Appelez super.OnMessageReceived() dans la méthode Overridden. Cela a fonctionné pour moi! Finalement!

10
Nikhil Setty

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

7
RSSV

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.

7
Juan Pablo

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.

7
tx802

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.

4
Tash Pemhiwa

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>
2
Nilesh Panchal

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>
1
Irshu
    <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>
1
ashutosh

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.

0
Sam

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

  1. Ajoutez ces méta-données dans votre fichier manifeste:

<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.

0
amit pandya
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());
0
Neha Sharma

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.

0
Jens