Push-уведомление Android ничего не показывает

#android #firebase #notifications #firebase-cloud-messaging #push

#Android #firebase #уведомления #firebase-облако-обмен сообщениями #толкать

Вопрос:

Я использую FCM, все работает хорошо, уведомления отправляются с использованием «Данных», но при отображении это происходит. Я действительно больше не знаю, что делать.

 public class CloudMessaging extends FirebaseMessagingService {

String NOTIFICATION_CHANNEL_ID  = "Messages_Channel_ID";

@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);

    createNotificationChannel();

    Map<String, String> data = remoteMessage.getData();
    final String title = data.get("title");
    final String body = data.get("body");
    final String conversation = data.get("conversation");

    if (conversation == null) return;

    NotificationCompat.Builder builder = new 
    NotificationCompat.Builder(getApplicationContext(), NOTIFICATION_CHANNEL_ID);
    builder.setColor(Color.CYAN)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(body)
            .setAutoCancel(true);

    NotificationManager notificationManager = (NotificationManager)
            getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(1, builder.build());

}

private void createNotificationChannel() {
   
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.message_channel_name);
        String description = getString(R.string.message_channel_description);
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel messagesChannel = new 
        NotificationChannel(getString(R.string.Message_Notification_ID), name, importance);
        messagesChannel.setDescription(description);
        messagesChannel.enableVibration(true);
        messagesChannel.setVibrationPattern(new long[]{1000, 200, 500});
        messagesChannel.enableLights(true);
        messagesChannel.setLightColor(Color.CYAN);
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(messagesChannel);
    }
}
 

серверный сервер в Firebase Cloud Messaging:

 const data = {
    token: context.params.token,
    data: {
      title: document.username,
      body: document.message,
      conversation: document.conversationid,
    },
    android: {
      notification: {
        channel_id: "Messages_Channel_ID",
      },
    },
  };
 

Все уведомления во всех sdk возвращаются следующим образом

Редактировать 1:

Делаю несколько тестов, и я понимаю, что метод onreceived никогда не вызывается, даже на заднем или переднем плане! Даже с классом, объявленным в манифесте! Но просто покажите пустое уведомление, потому что у меня также есть цвет и значок по умолчанию, объявленные в манифесте. Если оно не объявлено, вероятно, ничего не показывать.

Ответ №1:

Это очень странно, метод onMessageReceived должен вызываться хотя бы на переднем плане. Пожалуйста, проверьте стиль уведомлений и попробуйте пример кода, который у меня есть в этом репозитории.

 public class PushNotificationHandbookService extends FirebaseMessagingService {

    public static final String TAG = "PushHandbookService";

    @Override
    public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        // You will receive the push notifications here!
        Log.d(TAG, "From: "   remoteMessage.getFrom());
        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Title: "   remoteMessage.getNotification().getTitle()  
                            "Body: "   remoteMessage.getNotification().getBody());
        }
        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Title: "   remoteMessage.getData().get("title")  
                            "Body: "   remoteMessage.getData().get("body"));
            sendNotification(remoteMessage);
        }
    }

    ...

    private void sendNotification(RemoteMessage remoteMessage) {
        String title = remoteMessage.getData().get("title");
        String messageBody = remoteMessage.getData().get("body");
        String score = remoteMessage.getData().get("score");
        String country = remoteMessage.getData().get("country");

        Intent intent = new Intent(this, PushReceiverActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("score", score);
        intent.putExtra("country", country);

        @SuppressLint("UnspecifiedImmutableFlag")
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                intent, PendingIntent.FLAG_ONE_SHOT);

        String channelId = getString(R.string.default_notification_channel_id);
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setSmallIcon(R.drawable.ic_stat_name)
                        .setContentTitle(title)
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);

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

        // Since android Oreo notification channel is needed.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(channelId,
                    "Channel human readable title",
                    NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(channel);
        }
        notificationManager.notify(0, notificationBuilder.build());
    }
    ...
}
 

Используя сообщение, подобное этому:

 var message = {
    notification: {
      title: title,
      body: text
    },
    data: {
      title: title,
      body: text,
      score: '4.5',
      country: 'Canada'
    },
    android: {
      notification: {
        priority: 'high',
        sound: 'default',
        clickAction: '.PushReceiverActivity'
      },
    },
    tokens: registrationTokens
  };