6

Mam problem z powiadomieniami push w FireBase. Kiedy moja aplikacja jest w tle, nadchodzą powiadomienia, ale gdy moja aplikacja jest na pierwszym planie, nie otrzymuję powiadomień, ale w konsoli wyświetlane jest powiadomienie, co oznacza, że ​​powiadomienie jest tutaj, ale nie jest wyświetlane na pasku powiadomień . Czy mógłbyś mi pomóc?Powiadomienia Firebase na pierwszym planie

@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()); 
} 

Odpowiedz

2

Tak jak powiedziałeś, otrzymujesz wiadomość, ponieważ widzisz komunikaty dziennika w konsoli, więc poprawnie wykonałeś część FCM, a problem prawdopodobnie pojawi się po utworzeniu powiadomienia.

Jeśli spojrzysz na kod tworzenia powiadomień, brakuje numeru required elements, aby utworzyć powiadomienie na Androida. Od docs:

Obiekt Powiadomienie musi zawierać następujące elementy:

  • mała ikona, wyznaczonym przez setSmallIcon()
  • Tytuł ustaw przez setContentTitle() tekst
  • szczegół, set by setContentText()

Więc myślę, że jeśli dodasz te elementy do swojego zgłoszenia creat powinieneś zobaczyć powiadomienie w obszarze powiadomień.

+0

Tak, to był problem, dziękuję kolego. Kolejne pytanie, kto ustawić setContentTitle(), gdy mój backend przesyła mi powiadomienie, a json ustawia tytuł? –

+0

Powiadomienia wyświetlane za pomocą powiadomienia (json), są całkowicie niezależne od tworzenia i wyświetlania powiadomień w kodzie takim jak tutaj. Jeśli użyjesz wiadomości z powiadomieniem, a Twoja aplikacja będzie w tle, wyświetli się ona z podanym jsonem. W przeciwnym razie otrzymasz oddzwanianie onMessageReceived. Od tego zależy Twój kod, aby wyświetlić powiadomienie, jeśli tak właśnie chcesz. –

0

EDIT:

Właśnie zauważyłem, że onMessageReceived() z FirebaseMessagingService nie jest wywoływany (jak na razie) po wysłaniu powiadomienia z konsoli i aplikacja jest na pierwszym planie. Jednym rozwiązaniem jest użycie Firebase APIs do wysyłania powiadomień push i wywoła on onMessageReceived(), niezależnie od tego, czy aplikacja jest na pierwszym planie czy w tle.

Jeśli używasz "powiadomienie" ciało wysyłać powiadomienia push tj

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

Aby pobrać ten w onMessageReceived(), użyć czegoś takiego:

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

Jeśli aplikacja jest w tle, Firebase wyświetli powiadomienie odpowiadające danym ustawionym w push, a także wywoła on onMessageReceived(). Dzięki temu zobaczysz 2 powiadomienia, jeśli masz również napisany kod, aby wyświetlać niestandardowe powiadomienia w onMessageReceived().

Aby obejść ten problem, można korzystać z niektórych "dane" klucz tak:

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

i pobrać go w onMessageReceived(), użyć czegoś takiego:

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

Można następnie zbuduj własne niestandardowe powiadomienie i wyświetl je w onMessageReceived() tylko wtedy, gdy pojawi się powiadomienie.

P.S. Proszę zagłosować, jeśli to pomoże. Jestem nowy w stackoverflow.

+0

Czy zauważyłeś, że sendNotification (RemoteMessage remoteMessage) współpracuje z RemoteMessage? Ale zdalna wiadomość.getNotification(). getBody() faktycznie zwraca String. Dałeś złą radę. – Yazon2006

Powiązane problemy