Я работаю над проектом на основе учебника.
Инструктор использует Firebase для отправки уведомления серверному приложению [Android].
в порядке вставки, когда я отправляю заказ, он ничего не делает, но все равно отправит заказ.
В клиентском приложении после того, как этот клиент отправит заказ, на основе кода я должен получить всплывающее сообщение при успешной отправке уведомления. вот все коды связаны.
Интерфейс IFCM:
public interface IFCMService {
@Headers(
{
"Content-Type:application/json",
"Authorization:key=****"
}
)
@POST("fom/send")
Call<MyResponse> sendNotification(@Body DataMessage body);
}
MyFirebaseMessaging.java
public class MyFirebaseMessaging extends FirebaseMessagingService {
@Override
public void onNewToken(String s) {
super.onNewToken(s);
if (Common.currentUser != null)
updateTokenToFirebas(s);
}
private void updateTokenToFirebas(String token) {
IDrinkShopAPI mService = Common.getAPI();
mService.updateToken(Common.currentUser.getPhone(),
token,
"0")
.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.d("DEBUG",response.toString());
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.d("DEBUG",t.getMessage());
}
});
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
if (remoteMessage.getData() !=null)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
sendNotificationAPI26(remoteMessage);
else
sendNotification(remoteMessage);
}
}
private void sendNotificationAPI26(RemoteMessage remoteMessage) {
//Get information from Message
Map<String,String> data = remoteMessage.getData();
String title = data.get("title");
String message = data.get("message");
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri);
NotificationManager noti = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
noti.notify(new Random().nextInt(),builder.build());
}
private void sendNotification(RemoteMessage remoteMessage) {
Map<String,String> data = remoteMessage.getData();
String title = data.get("title");
String message = data.get("message");
//From API Level 26 , we need implement Notification Channel
NotificationHelper helper;
Notification.Builder builder;
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
helper = new NotificationHelper(this);
builder = helper.getDrinkShopNotification(title,message,defaultSoundUri);
helper.getManager().notify(new Random().nextInt(),builder.build());
}
}
FCMClient.java
public class FCMClient {
private static Retrofit retrofit = null;
public static Retrofit getClient(String baseUrl)
{
if (retrofit == null)
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit;
}
}
Common.java
private static final String FCM_API = "https://fcm.googleapis.com/";
public static IFCMService getGetFCMService()
{
return FCMClient.getClient(FCM_API).create(IFCMService.class);
}
CartActivity.java:
private void sendOrderToServer(float sumPrice, List<Cart> carts, String orderComment, String orderAddress) {
if (carts.size() > 0)
{
String orderDetail = new Gson().toJson(carts);
mService.submitOrder(sumPrice,orderDetail,orderComment,orderAddress,Common.currentUser.getPhone())
.enqueue(new Callback<OrderResult>() {
@Override
public void onResponse(Call<OrderResult> call, Response<OrderResult> response) {
sendNotificationToServer(response.body());
}
@Override
public void onFailure(Call<OrderResult> call, Throwable t) {
Toast.makeText(CartActivity.this, ""+t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
private void sendNotificationToServer(final OrderResult orderResult) {
mService.getToken("server_app_01","1")
.enqueue(new Callback<Token>() {
@Override
public void onResponse(Call<Token> call, Response<Token> response) {
Map<String,String> contentSend = new HashMap<>();
contentSend.put("title","ATLASco");
contentSend.put("message","سفارش جدید دریافت شد"+orderResult.getOrderId());
DataMessage dataMessage = new DataMessage();
if (response.body().getToken() != null)
dataMessage.setTo(response.body().getToken());
dataMessage.setData(contentSend);
IFCMService ifcmService = Common.getGetFCMService();
ifcmService.sendNotification(dataMessage)
.enqueue(new Callback<MyResponse>() {
@Override
public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
Toast.makeText(CartActivity.this, "Response" + response.body(), Toast.LENGTH_SHORT).show();
if (response.code() == 200)
{
if (response.body().success == 1)
{
Toast.makeText(CartActivity.this, "submitted", Toast.LENGTH_SHORT).show();
Common.cartRepository.emptyCart();
finish();
}
else
{
Toast.makeText(CartActivity.this, "Error!", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onFailure(Call<MyResponse> call, Throwable t) {
Toast.makeText(CartActivity.this, ""+t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onFailure(Call<Token> call, Throwable t) {
Toast.makeText(CartActivity.this, ""+t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
В приведенном выше коде в корзине я добавил сообщение Toast перед if (response.code() == 200), и оно отвечает Null.
Есть какие-нибудь идеи, что происходит? также у меня есть php api, который я мог бы добавить к этому.
отладчик:
@aurilio есть помощник?




У вас есть опечатка в коде IFCMService
используйте приведенный ниже исправленный код IFCMService
public interface IFCMService {
@Headers(
{
"Content-Type:application/json",
"Authorization:key=****"
}
)
@POST("fcm/send")
Call<MyResponse> sendNotification(@Body DataMessage body);
}
в сообщении вы пишете fom / send, что неверно, поэтому вы получаете ошибку 404 при отладке. Скопируйте приведенный выше код и вставьте в интерфейс IFCMService.
вы можете попробовать несколько вещей, сначала попробуйте, успешно ли вы зарегистрировали устройство на сервере FCM или нет. Во-вторых, используйте почтальон для отправки уведомления в fcm, а затем выполните отладку в клиенте, если вы получаете его правильно.