Уведомление о передаче сообщений в облаке Firebase не отображается на устройстве, однако выполняется onMessageReceived

#android #firebase #android-studio #firebase-cloud-messaging

#Android #firebase #android-studio #firebase-cloud-messaging

Вопрос:

Я не уверен, является ли это ошибкой или чего-то не хватает или настройки устройства. Однако для меня это выглядит нормально, и я проверил много сообщений. Позвольте мне попытаться объяснить с нуля.

Мое требование заключается в том, что клиент (например, пользователь A1) будет выполнять бронирование услуг у поставщика услуг (например, «Пользователь B»). Всякий раз, когда клиент бронирует услугу поставщика услуг («Пользователь B»), поставщику услуг (пользователю B) должно быть уведомление firebase.

Я новичок в Android, поэтому простой способ добиться этого также приветствуется. Однако я пытаюсь добиться этого с помощью обмена сообщениями в облаке firebase с подпиской на темы. Где поставщик услуг всегда подписан на тему. Клиент будет динамически подписываться на тему, отправлять уведомления в тему с помощью модернизации и отписываться от темы. Таким образом, в результате клиент и поставщик услуг получат уведомление.

  1. На данный момент в приложении определена статическая подписка на тему, которая позже будет изменена на динамическую
  2. https://fcm.googleapis.com/topics/myTopic Для отправки уведомления вызывается модификация
  3. Также возвращается ответ 200, и метод onMessageReceived также вызывается в экземпляре клиента, но ни в одном экземпляре нет уведомления.
  4. уведомление на устройство от Firebase control работает нормально. это означает, что у устройства нет никаких проблем.

Код действия, который отправляет уведомление:

 package www.temp.com.bookyourslot;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.messaging.FirebaseMessaging;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import www.temp.com.bookyourslot.Model.BookingNotificationData;
import www.temp.com.bookyourslot.Model.Posts;
import www.temp.com.bookyourslot.Model.PushBookingNotification;
import www.temp.com.bookyourslot.Retro.BookYourSlotNotiicationAPI;
import www.temp.com.bookyourslot.Retro.JsonPlaceHolderAPI;
import www.temp.com.bookyourslot.databinding.ActivityChooseSlotBinding;
import www.temp.com.bookyourslot.databinding.ActivityPostsBinding;

public class PostsActivity extends AppCompatActivity {

    String TAG = "PostsActivity";
    ActivityPostsBinding activityPostsBinding;
    JsonPlaceHolderAPI jsonPlaceHolderAPI;
    BookYourSlotNotiicationAPI bookYourSlotNotiicationAPI;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_posts);

        activityPostsBinding = ActivityPostsBinding.inflate(getLayoutInflater());
        View view = activityPostsBinding.getRoot();
        setContentView(view);

        FirebaseMessaging.getInstance().subscribeToTopic("myTopic")
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        //String msg = getString(R.string.msg_subscribed);
                        if (!task.isSuccessful()) {
                            Log.d(TAG, "onComplete: Subscription is not successful");
                            //msg = getString(R.string.msg_subscribe_failed);
                            Toast.makeText(PostsActivity.this, "not successful", Toast.LENGTH_SHORT).show();
                        }
                        else {
                            //Log.d(TAG, msg);
                            Toast.makeText(PostsActivity.this, "Successfully subscribed.", Toast.LENGTH_SHORT).show();
                        }
                    }
                });

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://fcm.googleapis.com")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        bookYourSlotNotiicationAPI = retrofit.create(BookYourSlotNotiicationAPI.class);

        activityPostsBinding.postsSendRequestButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendNotification();
            }
        });


    }

     public void sendNotification(){

        PushBookingNotification pushBookingNotification=new PushBookingNotification(
                new BookingNotificationData("First Title","First Message"),
                "/topics/myTopic");
        Call<PushBookingNotification> call = bookYourSlotNotiicationAPI.sendNotification(pushBookingNotification);
        call.enqueue(new Callback<PushBookingNotification>() {
            @Override
            public void onResponse(Call<PushBookingNotification> call, Response<PushBookingNotification> response) {
                if (!response.isSuccessful()) {
                    activityPostsBinding.postResultsTV.setText("Code : "   response.code());
                    return;
                }
                //PushBookingNotification notificationResponse = response.body();
                String content = "";
                content  = "Code: "   response.code()   "n";
                content  = "Code: "   response.raw().toString()   "n";

                activityPostsBinding.postResultsTV.setText(content);
            }

            @Override
            public void onFailure(Call<PushBookingNotification> call, Throwable t) {
                activityPostsBinding.postResultsTV.setText(t.getMessage());
            }
        });
    }
}
  

Класс службы сообщений:

 package www.temp.com.bookyourslot.FirebaseMessaging;

import android.util.Log;
import android.widget.Toast;

import androidx.annotation.NonNull;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MessagingService extends FirebaseMessagingService {

    private String TAG = "MessagingService";
    @Override
    public void onNewToken(@NonNull String s) {
        super.onNewToken(s);

        Log.d(TAG, "onNewToken: "   s);

    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // ...

        // TODO(developer): Handle FCM messages here.
        Log.d(TAG, "From: "   remoteMessage.getFrom());
        Log.d(TAG, "onMessageReceived: "   remoteMessage.getData().toString());

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

            /* Check if data needs to be processed by long running job */
            if ( true) {
                // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
                //scheduleJob();
            } else {
                // Handle message within 10 seconds
                //handleNow();
            }
        }

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

        // Also if you intend on generating your own notifications as a result of a received FCM
        // message, here is where that should be initiated. See sendNotification method below.
    }

    @Override
    public void onDeletedMessages() {
        super.onDeletedMessages();
        Log.d(TAG, "onDeletedMessages: Message is delete...");
    }
}
  

Классы данных

 package www.temp.com.bookyourslot.Model;

public class BookingNotificationData {
    public String title;
    public String body;

    public BookingNotificationData(String title, String body) {
        this.title = title;
        this.body = body;
    }
}



package www.temp.com.bookyourslot.Model;

public class PushBookingNotification {
    public BookingNotificationData data;
    public String to;

    public PushBookingNotification(BookingNotificationData data, String to) {
        this.data = data;
        this.to = to;
    }
}
  

Ретро-класс

 package www.temp.com.bookyourslot.Retro;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import www.temp.com.bookyourslot.Constants;
import www.temp.com.bookyourslot.Model.PushBookingNotification;

public interface BookYourSlotNotiicationAPI {

    //String BASE_URL="https://fcm.googleapi.com";
    String SERVER_KEY="AAAAXS1k7O4:XXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXXxxxxxxxxxxxxxxxXXXXXXXXXXXXXXXxxxxxx_";
    String CONTENT_TYPE="application/json";

    @Headers({"Authorization: key="  SERVER_KEY, "Content-Type:" CONTENT_TYPE})
    @POST("fcm/send")
    Call<PushBookingNotification> sendNotification(@Body PushBookingNotification pushBookingNotification);
}
  

Ответ №1:

Пока приложение работает в фоновом режиме, firebase автоматически обработает уведомление. Если приложение находится в состоянии переднего плана, вам необходимо вызвать локальное уведомление и передать данные (заголовок, тело), полученные от функции переопределения onMessageRecieved ().

Что-то вроде этого:

  private void handleNotification(String title, String message) {

    if (!DeviceInfo.isAppIsInBackground(this)) {
        Intent notificationIntent = new Intent(this, HomeActivity.class);
        notificationIntent.putExtra("text", message);
        notificationIntent.putExtra("title", title);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        notificationBuilder.setContentIntent(contentIntent);
        Notification notification = notificationBuilder.build();
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notification.defaults |= Notification.DEFAULT_SOUND;
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        int notificationId = 1;
        if (notificationId == Integer.MAX_VALUE - 1)
            notificationId = 0;
        notificationManager.notify(notificationId, notification);
    }
  

Комментарии:

1. Спасибо @Kaviyarasan M. Я постараюсь в ближайшее время и дам вам знать. Я подумал об этом так, как когда я впервые попробовал с консоли firebase, я столкнулся с этой проблемой. <br> Но на этот раз я сомневаюсь, потому что я пытался использовать два приложения, где одно приложение было в фоновом режиме. Тем не менее, я скоро попробую ваше предложение и сообщу вам