带有来自服务器(php)的图像的Android Firebase推送通知未在后台应用中的通知中显示图像

时间:2018-10-16 09:53:41

标签: php android firebase firebase-cloud-messaging

我使用php(server)实现了带图像的android firebase push通知。应用程序在前景中时,带有图像的通知可以完美运行。但是,当应用程序在后台运行时,仅收到带有标题和消息的通知,但未显示图像。我将所有内容仅作为数据发送。请帮助我解决此问题。

`     
**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消息服务

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;

    }
}

`

1 个答案:

答案 0 :(得分:1)

您可以使用带有以下代码的自定义视图来加载图像。

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