6

Ich habe Probleme mit FireBase-Push-Benachrichtigungen. Wenn meine App im Hintergrund läuft, kommen Benachrichtigungen, aber wenn meine App im Vordergrund ist, erhalte ich keine Benachrichtigungen, aber in der Konsole wird diese Benachrichtigung angezeigt, das bedeutet, dass die Benachrichtigung hier ist, aber nicht in der Benachrichtigungsleiste angezeigt wird . Kannst du mir helfen?Firebase-Benachrichtigungen im Vordergrund

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Log.d("OnMessage", "Received"); 
    super.onMessageReceived(remoteMessage); 
    Log.d(TAG, "From " + remoteMessage.getFrom()); 
    Log.d(TAG, "Body " + remoteMessage.getNotification().getBody()); 
    String aa=remoteMessage.toString(); 
    Intent intent=new Intent(MyFirebaseMessagingService.this, MainActivity.class); 
    intent.putExtra("msg", aa); 
    sendNotification(remoteMessage); 
    NotificationCompat.Builder mBuilder = 
     new NotificationCompat.Builder(this) 
     .setContentText(remoteMessage.getNotification().getBody()); 

    // remoteMessage.getNotification().getBody(); 

} 


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

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
     .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()); 
} 

Antwort

2

Wie Sie sagten, erhalten Sie die Nachricht, da Sie die Protokollmeldungen in der Konsole sehen, so dass Sie den FCM-Teil ordnungsgemäß verarbeitet haben und das Problem wahrscheinlich bei der Erstellung der Benachrichtigung auftritt.

Wenn Sie sich Ihren Code zur Benachrichtigungserstellung ansehen, fehlen einige der required elements, um eine Benachrichtigung auf Android zu erstellen. Aus der Dokumentation:

Eine Mitteilung Objekt das folgende Angaben enthalten:

  • ein kleines Symbol, Set von setSmallIcon()
  • Ein Titel, Set von setContentTitle()
  • Details Text, set von setContentText()

Also ich denke, wenn Sie diese Elemente Ihrer Benachrichtigung creat hinzufügen Sie sollten die Benachrichtigung im Infobereich sehen.

+0

Ja, das war ein Problem, danke Kumpel. Einfach eine weitere Frage, wer setContentTitle() setzen soll, wenn mir mein Backend eine Benachrichtigung schickt und in json den Titel tippt? –

+0

Benachrichtigungen, die über eine Benachrichtigungsnachricht (JSON) angezeigt werden, sind völlig unabhängig von der Erstellung und Anzeige Ihrer Benachrichtigung in Code, wie Sie es hier tun. Wenn Sie eine Benachrichtigung verwenden und sich Ihre App im Hintergrund befindet, wird sie mit dem angegebenen JSON angezeigt. Andernfalls erhalten Sie den Rückruf onMessageReceived und es liegt an Ihrem Code, eine Benachrichtigung anzuzeigen, wenn dies der Fall ist. –

0

EDIT:

Ich habe gerade bemerkt, dass onMessageReceived() von FirebaseMessagingService nicht aufgerufen wird (ab sofort), wenn Sie Benachrichtigungen von Konsole und Ihre Anwendung im Vordergrund ist senden. Eine Lösung ist, dass Sie Firebase APIs verwenden können, um Push-Benachrichtigungen zu senden, und es wird onMessageReceived() aufgerufen, unabhängig davon, ob sich die App im Vordergrund oder im Hintergrund befindet.

Wenn Sie "Benachrichtigung" Körper verwenden Push-Benachrichtigung dh

notification: { 
    title: "notification title", 
    icon: "ic_launcher", 
    color: "#4E2AA5", 
    body: "notification body" 
} 

Zum Abrufen dieser in onMessageReceived() zu senden, so etwas wie folgt verwenden:

String color = remoteMessage.getNotification().getColor(); 
String body = remoteMessage.getNotification().getBody(); 
String title = remoteMessage.getNotification().getTitle(); 
String icon = remoteMessage.getNotification().getIcon(); 

Wenn Ihre Anwendung im Hintergrund ist, Firebase zeigt eine Benachrichtigung an, die den Daten entspricht, die Sie in Push festgelegt haben, und ruft onMessageReceived() auf. Sie sehen also 2 Benachrichtigungen, wenn Sie auch Code geschrieben haben, um benutzerdefinierte Benachrichtigungen in onMessageReceived() anzuzeigen.

Um dies zu umgehen, können Sie einige "Daten" -Taste wie folgt verwenden können:

data: { 
    title: "notification title", 
    body: "notification body" 
} 

und abzurufen es in onMessageReceived(), so etwas wie diese verwenden: Sie

Map<String, String> map = remoteMessage.getData(); 
for (Map.Entry<String, String> entry : map.entrySet()) { 
    Log.d(TAG, entry.getKey() + "/" + entry.getValue()); 
} 

können Erstellen Sie dann Ihre eigene benutzerdefinierte Benachrichtigung und zeigen Sie sie in onMessageReceived() an, nur dass diese Benachrichtigung angezeigt wird.

P.S. Bitte stimme ab, wenn es hilft. Ich bin neu in stackoverflow.

+0

Haben Sie bemerkt, dass sendNotification (RemoteMessage remoteMessage) mit RemoteMessage funktioniert? Aber remoteMessage.getNotification(). getBody() gibt tatsächlich String zurück. Du hast schlechten Rat gegeben. – Yazon2006

Verwandte Themen