首页 > 解决方案 > Firebase Messaging 无法向服务器应用发送通知

问题描述

我目前正在做一个送餐应用程序。当我从食物列表中添加食物并在 cart.java 结账时,下订单并将请求提交到 firebase 数据库,但它不会向服务器应用程序发送通知。但是服务器应用程序能够发送通知以通知客户端应用程序。我试图找出这些代码有什么问题,但仍然找不到错误/错误。

购物车.java

public class Cart extends AppCompatActivity {

RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;

FirebaseDatabase database;
DatabaseReference requests;

TextView txtTotalPrice;
FButton btnPlace;

List<Order> cart = new ArrayList<>();
CartAdapter adapter;

APIService mService;

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //add calligraphy
    CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
    .setDefaultFontPath("fonts/restaurant_font.otf")
    .setFontAttrId(R.attr.fontPath)
    .build());

    setContentView(R.layout.activity_cart);

    //Init service
    mService = Common.getFCMService();

    //Firebase
    database = FirebaseDatabase.getInstance();
    requests = database.getReference("Requests");

    //Init
    recyclerView = (RecyclerView)findViewById(R.id.listCart);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    txtTotalPrice = (TextView)findViewById(R.id.total);
    btnPlace = (FButton)findViewById(R.id.btnPlaceOrder);

    btnPlace.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (cart.size() > 0)
                showAlertDialog();
            else
                Toast.makeText(Cart.this, "Your cart is empty.", Toast.LENGTH_SHORT).show();

        }
    });

    loadListFood();
}

private void showAlertDialog(){

    AlertDialog.Builder alertDialog = new AlertDialog.Builder(Cart.this, R.style.Theme_AppCompat_Dialog_Alert);
    alertDialog.setTitle("One more step!");
    alertDialog.setMessage("Enter your address: ");

       LayoutInflater inflater = this.getLayoutInflater();
       View order_address_comment = inflater.inflate(R.layout.order_address_comment, null);

       final MaterialEditText edtAddress = (MaterialEditText)order_address_comment.findViewById(R.id.edtAddress);
       final MaterialEditText edtComment = (MaterialEditText)order_address_comment.findViewById(R.id.edtComment);

       alertDialog.setView(order_address_comment);
       alertDialog.setIcon(R.drawable.ic_shopping_cart_black_24dp);
       alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {

               //create new request
               Request request = new Request(
                       Common.currentUser.getPhone(),
                       Common.currentUser.getName(),
                       edtAddress.getText().toString(),
                       txtTotalPrice.getText().toString(),
                       "0",
                       edtComment.getText().toString(),
                       cart
               );

               //submit to firebase
               String order_number = String.valueOf(System.currentTimeMillis());
               requests.child(order_number).setValue(request);

               //delete cart
               new Database(getBaseContext()).cleanCart();

               sendNotification(order_number);

           }
       });

       alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {
               dialog.dismiss();
           }
       });

    alertDialog.show();


}

private void sendNotification(final String order_number) {

    DatabaseReference tokens = FirebaseDatabase.getInstance().getReference("Tokens");

    //get all node with isServerToken is true
    Query data = tokens.orderByChild("serverToken").equalTo(true);
    data.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot postSnapShot:dataSnapshot.getChildren()){

                Token serverToken = postSnapShot.getValue(Token.class);

                //create raw payload to send
                Notification notification = new Notification("iDelivery", "You have new order " + order_number);
                Sender content = new Sender(serverToken.getToken(), notification);

                mService.sendNotification(content).enqueue(new Callback<MyResponse>() {
                    @Override

                    public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
                        //only run when get result
                        if (response.code() == 200) {
                            if (response.body().success == 1) {
                                Toast.makeText(Cart.this, "Thank you, Order placed.", Toast.LENGTH_SHORT).show();
                                finish();
                            } else {
                                Toast.makeText(Cart.this, "Failed to place order.", Toast.LENGTH_SHORT).show();

                            }
                        }
                    }

                    @Override
                    public void onFailure(Call<MyResponse> call, Throwable t) {
                        Log.e("ERROR", t.getMessage());
                    }
                });

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

private void loadListFood() {

    cart = new Database(this).getCarts();
    adapter = new CartAdapter(cart,this);
    adapter.notifyDataSetChanged();
    recyclerView.setAdapter(adapter);

    //calculation total price
    float total = 0;
    for(Order order:cart)
        total +=(Float.parseFloat(order.getPrice()))*(Integer.parseInt(order.getQuantity()));
    Locale locale = new Locale("en","MY");
    java.text.NumberFormat fmt = java.text.NumberFormat.getCurrencyInstance(locale);
    txtTotalPrice.setText(fmt.format(total));
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    if (item.getTitle().equals(Common.DELETE))
        deleteCart(item.getOrder());
    return true;
}

private void deleteCart(int position) {

    //remove item at List<Order> by position
    cart.remove(position);

    //after that,delete all old data from SQLite
    new Database(this).cleanCart();

    //final,update new data from List<Order> to SQLite
    for (Order item:cart)
        new Database(this).addToCart(item);

    //refresh
    loadListFood();
}
}

MyFirebaseMessasing.java

public class MyFirebaseMessaging extends FirebaseMessagingService {

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

private void sendNotification(RemoteMessage remoteMessage) {
    RemoteMessage.Notification notification = remoteMessage.getNotification();
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this,"")
            .setSmallIcon(R.mipmap.ic_launcher_round)
            .setContentTitle(notification.getTitle())
            .setContentText(notification.getBody())
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

    NotificationManager noti = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    noti.notify(0, builder.build());
}
}

标签: androidfirebasefirebase-cloud-messaging

解决方案


尝试添加:

Log.d(TAG, " response = "+response);

如下:

mService.sendNotification(content).enqueue(new Callback<MyResponse>() {

      @Override

                public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {

                    Log.d(TAG, " response = "+response);

                    //only run when get result
                    if (response.code() == 200) {
                        if (response.body().success == 1) {
                            Toast.makeText(Cart.this, "Thank you, Order placed.", Toast.LENGTH_SHORT).show();
                            finish();
                        } else {
                            Toast.makeText(Cart.this, "Failed to place order.", Toast.LENGTH_SHORT).show();

                        }
                    }
                }

                @Override
                public void onFailure(Call<MyResponse> call, Throwable t) {
                    Log.e("ERROR", t.getMessage());
                }
            });

响应如下:

{protocol=h2, code=401, message=, url=https://fcm.googleapis.com/fcm/send}

如果您收到 401 HTTP 状态代码,则您的服务器密钥无效。


推荐阅读