Расширяемое уведомление Firebase Показать изображение, когда приложение находится в фоновом режиме

Я внедряю уведомления FCM в Android, но как уведомления различаются в зависимости от статуса приложения (фон против переднего плана)?

См. Изображение уведомлений

Я отправляю уведомление с использованием FCM API с Postman, и это структура уведомления:

{ "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" } 

Изображение для рендеринга берется из data.main_picture .

Я реализовал свой собственный FirebaseMessagingService который отлично отображает уведомления в состоянии переднего плана. Код уведомления следующий:

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

Однако в фоновом режиме служба даже не выполняется. В AndroidManifest.xml службы Firebase объявляются следующим образом:

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

Моя проблема заключается не в LargeIcon или SmallIcon а в отображении большой картинки.

Спасибо за поддержку.

Solutions Collecting From Web of "Расширяемое уведомление Firebase Показать изображение, когда приложение находится в фоновом режиме"

notification messages FCM не поддерживают largeIcon или bigPicture.

Если вам это нужно, в фоновом режиме вы можете использовать data message FCM.

Для сообщений данных всегда вызывается метод onMessageReceived(message) , поэтому вы можете использовать метод message.getData() и создавать свое собственное уведомление.

Подробнее об уведомлениях и сообщениях сообщений читайте здесь: https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

См. Мою службу 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; } } } 

ССЫЛКА ЗДЕСЬ

Если ваша проблема связана с отображением Big Image, т.е. если вы отправляете push-уведомление с изображением из консоли firebase, и оно отображает изображение, только если приложение на переднем плане. Решение этой проблемы – отправить push-сообщение только с полем данных.

 { "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" } 

Это определенно решает проблему.

Если вы ожидаете только одного уведомления в системном трее для своего приложения, то решение ниже может решить проблему, пока FCM не найдет правильное решение.

  1. Удалите MyFirebaseMessagingService из манифеста.

     <service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> 
  2. MyGcmReceiver Расширьте класс GcmReceiver и исправьте логику уведомлений.
  3. Добавить MyGcmReceiver в манифесте

      <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. Отменить все уведомления перед уведомлением об этом. (В противном случае firebase также показывает уведомление, когда приложение находится в фоновом режиме)

Вы можете отправлять сообщения, используя этот клиентский инструмент для отдыха. Использование этого инструмента Вы также можете отправлять сообщения в клиентское приложение на заднем плане и переднем плане. Чтобы отправить сообщение с помощью API, вы можете использовать инструмент AdvancedREST Client, его расширение chrome и отправить сообщение со следующими параметрами.

Клиентский инструмент для отдыха Ссылка: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

Используйте этот URL-адрес: https://fcm.googleapis.com/fcm/send Content-Type: application / json. Авторизация: key = Ключ вашего сервера От или автоответчик (см. Ниже)

{"Data": {"image": " https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg ", "message": "Push-сообщение Firebase с использованием API" "AnotherActivity" : «True»}, «to»: «идентификатор устройства или токен устройства»}

Ключ авторизации можно получить, посетив консоль разработчиков Google и нажмите кнопку «Учетные данные» в меню слева для вашего проекта. Среди перечисленных ключей API ключ сервера будет вашим ключом авторизации.

И вам нужно поместить токенID получателя в раздел «Кому» вашего запроса POST, отправленного с использованием API.

И эта часть кода android-кода // будет содержать 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); 

Отправить уведомление Big Picture с консоли Firebase: работает как для фонового, так и для переднего плана

Вместо onMessageReceived переопределите zzm () FirebaseMessagingService и создайте свое собственное уведомление отсюда

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