web-dev-qa-db-fra.com

Notification extensible de Firebase Afficher l'image lorsque l'application est en arrière-plan

J'implémente les notifications FCM dans Android, mais en quoi les notifications diffèrent-elles en fonction du statut de l'application (arrière-plan ou avant-plan)?

see notifications image

J'envoie la notification à l'aide de l'API FCM avec Postman et voici la structure de notification:

{ "notification": {
      "title": "Notification title",
      "body": "Notification message",
      "sound": "default",
      "color": "#53c4bc",
      "click_action": "MY_BOOK",
      "icon": "ic_launcher"
   },
   "data": {
       "main_picture": "URL_OF_THE_IMAGE"  
   },
   "to" : "USER_FCM_TOKEN"
}

L'image à rendre est extraite de data.main_picture.

J'ai implémenté ma propre FirebaseMessagingService qui permet d'afficher les notifications à l'état de premier plan. Le code de notification est le suivant:

NotificationCompat.BigPictureStyle notiStyle = new NotificationCompat.BigPictureStyle();
notiStyle.setSummaryText(messageBody);
notiStyle.bigPicture(picture);

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

NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(bigIcon)
            .setContentTitle(title)
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent)
            .setStyle(notiStyle); code here

NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());

Cependant, en arrière-plan, le service n'est même pas exécuté. Dans le AndroidManifest.xml, les services Firebase sont déclarés comme suit:

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

Mon problème n'est pas la LargeIcon ou SmallIcon mais l'affichage de la grande image.

Merci pour votre aide.

Voir mon FirebaseMessagingService 

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "FirebaseMessageService";
    Bitmap bitmap;

    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // There are two types of messages data messages and notification messages. Data messages are handled
        // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
        // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
        // is in the foreground. When the app is in the background an automatically generated notification is displayed.
        // When the user taps on the notification they are returned to the app. Messages containing both notification
        // and data payloads are treated as notification messages. The Firebase console always sends notification
        // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
        //
        Log.d(TAG, "From: " + remoteMessage.getFrom());

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }

        //The message which i send will have keys named [message, image, AnotherActivity] and corresponding values.
        //You can change as per the requirement.

        //message will contain the Push Message
        String message = remoteMessage.getData().get("message");
        //imageUri will contain URL of the image to be displayed with Notification
        String imageUri = remoteMessage.getData().get("image");
        //If the key AnotherActivity has  value as True then when the user taps on notification, in the app AnotherActivity will be opened. 
        //If the key AnotherActivity has  value as False then when the user taps on notification, in the app MainActivity will be opened. 
        String TrueOrFlase = remoteMessage.getData().get("AnotherActivity");

        //To get a Bitmap image from the URL received
        bitmap = getBitmapfromUrl(imageUri);

        sendNotification(message, bitmap, TrueOrFlase);

    }


    /**
     * Create and show a simple notification containing the received FCM message.
     */

    private void sendNotification(String messageBody, Bitmap image, String TrueOrFalse) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("AnotherActivity", TrueOrFalse);
        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)
                .setLargeIcon(image)/*Notification icon image*/
                .setSmallIcon(R.drawable.firebase_icon)
                .setContentTitle(messageBody)
                .setStyle(new NotificationCompat.BigPictureStyle()
                        .bigPicture(image))/*Notification with Image*/
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

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

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }

    /*
    *To get a Bitmap image from the URL received
    * */
    public Bitmap getBitmapfromUrl(String imageUrl) {
        try {
            URL url = new URL(imageUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(input);
            return bitmap;

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;

        }
    }
}

REFERENCE ICI

9
Arpit Patel

Si votre problème est lié à l’affichage de Big Image, c’est-à-dire si vous envoyez une notification Push avec une image à partir de la console firebase, elle n’affiche cette image que si l’application est au premier plan. La solution à ce problème consiste à envoyer un message Push avec un seul champ de données.

{ "data": { "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg", "message": "Firebase Push Message Using API" "AnotherActivity": "True" }, "to" : "device id Or Device token" }

Cela résout définitivement le problème.

3
Arun

La clé «Données» doit figurer dans le groupe de notifications Push. 

En plus des réponses ci-dessus, Si vous testez les notifications Push à l’aide de Console FCM , la clé et l’objet 'data' sont pas ajoutés au groupe de notifications Push. Ainsi, vous ne recevrez pas de notification Push détaillée lorsque l'application est en arrière-plan ou tuée.

Dans ce cas, vous devez opter pour votre console d'administration principale pour tester le scénario d'arrière-plan de l'application.

Ici, vous aurez ajouté la clé 'data' à votre offre Push. donc, Push détaillé sera affiché comme prévu . Espérons que cela aide peu.

1
Max Droid

Les messages contenant à la fois des notifications et des données utiles (comme dans l'exemple envoyé avec Postman) sont automatiquement affichés sur les machines des utilisateurs finaux par la bibliothèque FCM. Et cela n'inclut pas les (grandes) images.

Je suppose qu'il y a deux possibilités pour vous:

  1. Essayez ce que Rashmi Jain a suggéré. Cependant, cette solution pourrait fonctionner dès maintenant et cesser de fonctionner demain si la bibliothèque Firebase est mise à jour (et donc la mise en œuvre de la gestion des messages)

  2. Envoyer un message de données avec Postman. Vous ne pouvez donc pas remplir l'objet de notification dans le JSON, de sorte qu'il pourrait ressembler à ceci:

    {
      "message": {
        "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
        "data":{    
          "title" : "Awesome title",
          "body"  : "Your awesome Push notification body",
          "image"  : "your_image_url"
        }
      }
    }
    

Je préférerais la 2ème option. Bonne chance!

1
Benjamin Menrad

Envoyer une notification Big Picture à partir de la console Firebase: Fonctionne pour les applications d’arrière-plan et d’avant-plan.

Au lieu de onMessageReceived, remplacez zzm () de FirebaseMessagingService et créez votre notification personnalisée à partir d'ici.

@Override
public void zzm(Intent intent) {
    Log.e(TAG, "zzm : " + intent);
    createBigPictureNotification();        
}

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

}
0
Rashmi Jain

Si vous n'attendez qu'une notification dans une barre d'état système pour votre application, la solution ci-dessous peut résoudre le problème, jusqu'à ce que FCM propose la solution appropriée.

  1. supprimer MyFirebaseMessagingService du manifeste.

    <service Android:name=".MyFirebaseMessagingService">   <intent-filter> <action Android:name="com.google.firebase.MESSAGING_EVENT"/>   </intent-filter> </service>
    
  2. MyGcmReceiver Étendre la classe GcmReceiver et redresser la logique de notification.
  3. Ajouter MyGcmReceiver dans le manifeste

        <receiver
        Android:name=".MyGcmReceiver"
        Android:exported="true"
        Android:permission="com.google.Android.c2dm.permission.SEND">
        <intent-filter>
            <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
            <category Android:name="package_name" />
        </intent-filter>
    </receiver>
    
  4. cancelAll notifications avant de notifier la notification. (Sinon firebase également, affiche une notification lorsque l'application est en arrière-plan)

0
Harsha Vardhan

Vous pouvez envoyer des messages à l'aide de cet outil client restant.Utilisation de cet outil Vous pouvez également envoyer des messages à l'application client en arrière-plan et au premier plan . Pour envoyer un message à l'aide de l'API, vous pouvez utiliser un outil appelé Client AdvancedREST, c'est une extension chrome, et envoyez un message avec les paramètres suivants.

Rest client tool Link: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

utilisez cette URL: - https://fcm.googleapis.com/fcm/send Content-Type: application/json Autorisation: clé = votre clé de serveur ou clé d'authoisation (voir ci-dessous réf.)

{"data": {"image": " https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg ", "message": "Message Push de Firebase utilisant l'API "" AnotherActivity ":" True "}," à ":" identifiant de périphérique ou jeton de périphérique "}

La clé d'autorisation peut être obtenue en visitant la console des développeurs Google et en cliquant sur le bouton Informations d'identification dans le menu de gauche pour votre projet. Parmi les clés API répertoriées, la clé de serveur sera votre clé d'autorisation.

Et vous devez mettre tokenID du destinataire dans la section «à» de votre demande POST envoyée à l'aide de l'API.

Et ce morceau de code Android // le message contiendra le message push

    String message = remoteMessage.getData().get("message1");

    //imageUri will contain URL of the image to be displayed with Notification


    String imageUri = remoteMessage.getData().get("image");

    //If the key AnotherActivity has  value as True then when the user taps on notification, in the app AnotherActivity will be opened.

    //If the key AnotherActivity has  value as False then when the user taps on notification, in the app MainActivity2 will be opened.

    String TrueOrFlase = remoteMessage.getData().get("AnotherActivity");

    //To get a Bitmap image from the URL received

    bitmap = getBitmapfromUrl(imageUri);


    sendNotification(message, bitmap, TrueOrFlase);
0
Syed Danish Haider