11

Je vérifie Firebase Cloud Messaging pour envoyer une notification. L'avez déjà implémenté et sa notification de réception lorsque l'application est en état ouvert. Mais si je ferme l'application, il ne donne plus de notification. Existe-t-il une solution à ça.L'application Android ne reçoit pas de notification FCM lorsqu'elle est fermée

code:

WebRequest wRequest; 
wRequest = WebRequest.Create("https://fcm.googleapis.com/fcm/send"); 
wRequest.Method = "post"; 
wRequest.ContentType = " application/json;charset=UTF-8"; 
wRequest.Headers.Add(string.Format("Authorization: key={0}", AppId)); 

wRequest.Headers.Add(string.Format("Sender: id={0}", SenderId)); 

string postData = "{\"registration_ids\":[\"" + regIds + "\"], \"data\": "+ value +"}"; 

Byte[] bytes = Encoding.UTF8.GetBytes(postData); 
wRequest.ContentLength = bytes.Length; 

Stream stream = wRequest.GetRequestStream(); 
stream.Write(bytes, 0, bytes.Length); 
stream.Close(); 

WebResponse wResponse = wRequest.GetResponse(); 

Messaging

public class MessagingService extends FirebaseMessagingService { 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData(); 
     sendNotification(data); 
    } 

    public void showMessage(Map<String, String> serverData) { 
     Intent i = new Intent(this,MainActivity.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT); 

     NotificationCompat.Builder builder = new NotificationCompat.Builder(this) 
       .setAutoCancel(true) 
       .setContentTitle(serverData.get("Title")) 
       .setContentText(serverData.get("Message")) 
       .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark) 
       .setContentIntent(pendingIntent); 

     NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

     manager.notify(Integer.parseInt(serverData.get("ItemId")),builder.build()); 
    } 

    private void sendNotification(Map<String, String> serverData) { 
     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_UPDATE_CURRENT); 

     long[] pattern = {500,500,500,500,500}; 

     Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

     NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark) 
       .setContentTitle(serverData.get("Title")) 
       .setContentText(serverData.get("Message")) 
       .setAutoCancel(true) 
       .setVibrate(pattern) 
       .setLights(Color.BLUE,1,1) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 

     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(Integer.parseInt(serverData.get("ItemId")), notificationBuilder.build()); 
    } 

} 

principale activité-

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     FirebaseMessaging.getInstance().subscribeToTopic("test"); 
     FirebaseInstanceId.getInstance().getToken(); 
    } 
} 

Manifest-

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="test.com.firebasenotify"> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <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=".MessagingService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.MESSAGING_EVENT" /> 
      </intent-filter> 
     </service> 
     <service android:name=".InstanceIDService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> 
      </intent-filter> 
     </service> 

    </application> 

</manifest> 
+1

Afficher fcm classe auditeur, et montrer le POST vous demanderez à FCm –

+0

service de messagerie mis à jour, après la FCM et le principal code d'activité –

+0

-vous le message dans le OnReceive au moins? –

Répondre

8

Aucun problème avec le code. J'utilisais Mi note 4, et d'une manière ou d'une autre il ne montre pas de notification dans Mi4 quand l'application est fermée. J'ai testé avec un autre appareil Android et son fonctionnement bien.

Merci à Tim Castelijns et Frank van Puffelen d'avoir participé à la conversation.

+2

Pour MI vous devez mettre l'application en mode de démarrage automatique dans la sécurité pour obtenir une notification lorsque l'application est fermée –

+0

Merci l'homme, en redmi prime2 également obtenir le même problème. Avez-vous trouvé une solution à ce problème dans les appareils MI? – sandeepmaaram

-1

ajouter time_to_live clé dans votre Payload POST résoudra cette valeur problème.Le de ce paramètre doit être une durée de 0 à 2.419.200 secondes, et il correspond à la durée maximale pour laquelle les magasins de la FCM et tente de remettre le message. "time_to_live": 3Refer Firebase Docs

+1

Ceci n'est probablement valide que si l'utilisateur revient à l'application. – ioanb7

-3

Comme par FCM docs onMessageReceived() ne sera pas appelé lorsque l'application est en arrière-plan . Vous devez envoyer un objet de notification sur commande pour le montrer dans la zone de notification et lorsque l'utilisateur clique dessus l'activité lanceur sera ouvert avec les données que extras avec l'intention . Pour les charges utiles, vous devez utiliser l'objet data. see docs et Receive Messages in an Android App

+2

si vous voyez le code il n'y a pas d'objet de notification. Il envoie uniquement l'objet de données –

+0

, vous devez également envoyer un objet de notification. – Sjd

+2

mais si nous enverrons l'objet de notification alors il ne frappera pas sur MessageReceived et la notification sera traitée par Android lui-même et sera affiché dans la barre de notification (sans votre application cliente). Et si nous envoyons sans objet de notification mais l'objet de données est là alors il frappera toujours onMessageReceived. –