#android #firebase #android-studio #firebase-cloud-messaging
#Android #firebase #android-studio #firebase-cloud-messaging
Вопрос:
Я не уверен, является ли это ошибкой или чего-то не хватает или настройки устройства. Однако для меня это выглядит нормально, и я проверил много сообщений. Позвольте мне попытаться объяснить с нуля.
Мое требование заключается в том, что клиент (например, пользователь A1) будет выполнять бронирование услуг у поставщика услуг (например, «Пользователь B»). Всякий раз, когда клиент бронирует услугу поставщика услуг («Пользователь B»), поставщику услуг (пользователю B) должно быть уведомление firebase.
Я новичок в Android, поэтому простой способ добиться этого также приветствуется. Однако я пытаюсь добиться этого с помощью обмена сообщениями в облаке firebase с подпиской на темы. Где поставщик услуг всегда подписан на тему. Клиент будет динамически подписываться на тему, отправлять уведомления в тему с помощью модернизации и отписываться от темы. Таким образом, в результате клиент и поставщик услуг получат уведомление.
- На данный момент в приложении определена статическая подписка на тему, которая позже будет изменена на динамическую
https://fcm.googleapis.com/topics/myTopic
Для отправки уведомления вызывается модификация- Также возвращается ответ 200, и метод onMessageReceived также вызывается в экземпляре клиента, но ни в одном экземпляре нет уведомления.
- уведомление на устройство от 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> Но на этот раз я сомневаюсь, потому что я пытался использовать два приложения, где одно приложение было в фоновом режиме. Тем не менее, я скоро попробую ваше предложение и сообщу вам