6

Ho problemi con le notifiche push di FireBase. Quando la mia app è in background, arrivano le notifiche, ma quando la mia app è in primo piano non ricevo le notifiche, ma nella console viene visualizzata la notifica, il che significa che la notifica è qui ma non viene visualizzata nella barra delle notifiche . Potresti aiutarmi?Notifiche Firebase in primo piano

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

risposta

2

Come hai detto che stai ricevendo il messaggio poiché stai visualizzando i messaggi di log nella console in modo da aver gestito correttamente la parte FCM e il problema è probabile con la tua creazione della notifica.

Se si guarda il codice di creazione della notifica, manca un paio di required elements per creare una notifica su Android. Dalla documentazione:

Un oggetto di notifica deve contenere i seguenti:

  • una piccola icona, fissato dal setSmallIcon()
  • Un titolo, fissato dal setContentTitle() testo
  • Dettaglio, fissato dal setContentText()

Quindi penso che se si aggiungono gli elementi al vostro creat di notifica dovresti vedere la notifica nell'area di notifica.

+0

Sì, quello era un problema, grazie amico. Solo un'altra domanda, chi impostare setContentTitle() quando il mio backend mi invia una notifica e in json set title? –

+0

Le notifiche visualizzate tramite un messaggio di notifica (json), sono completamente separate dalla creazione e visualizzazione della notifica nel codice come si fa qui. Se si utilizza un messaggio di notifica e l'app è in background, verrà visualizzata in base al json specificato. Altrimenti riceverai la richiamata onMessageReceived e spetterà al tuo codice mostrare una notifica se è quello che vuoi che succeda. –

0

EDIT:

Ho appena notato che onMessageReceived() di FirebaseMessagingService non viene invocato (a partire da ora) quando si inviano notifiche dalla console e la vostra applicazione è in primo piano. Una soluzione è che puoi utilizzare Firebase APIs per inviare notifiche push e invocherà onMessageReceived() indipendentemente dall'app in primo piano o sullo sfondo.

Se si utilizza il corpo "notifica" per inviare notifiche push cioè

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

Per recuperare questo onMessageReceived(), usare qualcosa di simile:

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

Se la vostra applicazione è in background, Firebase visualizzerà una notifica corrispondente ai dati impostati in push e invocherà anche onMessageReceived(). Quindi vedrai 2 notifiche se hai anche scritto del codice per mostrare la notifica personalizzata in onMessageReceived().

Per risolvere questo problema, è possibile utilizzare alcuni "dati" chiave come questo:

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

e di recuperarli in onMessageReceived(), usare qualcosa di simile a questo:

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

Puoi quindi crea la tua notifica personalizzata e mostrala da onMessageReceived() solo che verrà visualizzata la notifica.

P.S. Si prega di votare se aiuta. Sono nuovo nello stackoverflow.

+0

Avete notato che sendNotification (RemoteMessage remoteMessage) funziona con RemoteMessage? Ma remoteMessage.getNotification(). getBody() restituisce effettivamente String. Hai dato un cattivo consiglio. – Yazon2006