简体   繁体   中英

Android Firebase Push Notification with image from server(php) not showing image in notification while app in background

I am implemented android firebase push notificaiton with image using php(server). Notification with image working perfectly while app in foreground. But while app in background only notification received with title and message but image not displaying. I am sending everything as data only. Please help me to fix this issue.

`     
**PHP CODE**
<?php

define( 'API_ACCESS_KEY', 'xxxxxxxx' );


 $message = array
      (
    'message'   => "$body",
    'title' => "notification",
    'image'=> $image_url,
    'vibrate'=>1,




      );
$fields = array
        (
            'registration_ids'      => $regid,
            'data'  => $message,


        );


$headers = array
        (
            'Authorization: key=' . API_ACCESS_KEY,
            'Content-Type: application/json'
        );

    $ch = curl_init();
    curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
    curl_setopt( $ch,CURLOPT_POST, true );
    curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
    curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
    $result = curl_exec($ch );
    curl_close( $ch );

echo $result;

}

MYFIREBASE MESSAGING SERVICE

public class MyAndroidFirebaseMsgService extends FirebaseMessagingService {

private static final String TAG = "MyAndroidFCMService";
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");
    String tittle = remoteMessage.getData().get("title");
    //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.


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

    sendNotification(tittle,message, bitmap);

}


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

private void sendNotification(String title,String messageBody, Bitmap image) {
    Intent intent = new Intent(this, home.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)
            /*Notification icon image*/
            .setLargeIcon(image)
            .setSmallIcon(R.mipmap.shoppingcart)
            .setPriority(Notification.PRIORITY_MAX)
            .setContentTitle(title)
            .setContentText(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;

    }
}

`

You can use custom view with below code to load image.

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            Notification notification = notificationBuilder.build();
            notificationManager.notify(0, notification);
            if (remoteMessage.getData().get(IMAGE_URL) != null) {
                final NotificationTarget notificationTarget = new NotificationTarget(getApplicationContext(), largeRemoteViews, R.id.notification_image, notification, 0);
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override public void run() {
                        Glide.with(getApplicationContext()).load(remoteMessage.getData().get(IMAGE_URL)).asBitmap().into(notificationTarget);
                    }
                });
            }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM