如何使用Firebase Cloud Messaging从应用程序发送通知?

时间:2018-01-13 20:05:25

标签: android firebase android-volley

我尝试从我的Android应用程序发送我的fcm通知。我经常多次接触,但我找不到问题所在。我尝试使用邮差,它的成功,但当我在我的Android应用程序中尝试它时,它给出了错误。

在我的logcat中;

  

BasicNetwork.performRequest:意外的响应代码400 for   https://fcm.googleapis.com/fcm/send/

     

错误:com.android.volley.ServerError

private void sendNotification() {

    JSONObject obj = null;
    JSONObject objData = null;
    JSONObject dataobjData = null;

    try {

        obj = new JSONObject();
        objData = new JSONObject();

        dataobjData = new JSONObject();
        dataobjData.put("message", msg.getText().toString());
        dataobjData.put("image", lnk.getText().toString());
        dataobjData.put("isSuccess", true);
        dataobjData.put("catTitle", cat.getText().toString());

        objData.put("content_available","true");
        objData.put("priority", "high");

        obj.put("to", blueTest);
        obj.put("notification", objData);
        obj.put("data", dataobjData);

        Log.e("MYOBJs", obj.toString());
    } catch (JSONException e) {
        e.printStackTrace();
    }

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, urlAdress, obj,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.e("SUCCESS", response + "");
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("ERRORS", error + "");
                }
            }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = new HashMap<String, String>();
            headers.put("Authorization", "key=" + API_KEY);
            headers.put("Content-Type", "application/json");
            return headers;
        }
    };
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    int socketTimeout = 1000 * 60;// 60 seconds
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    jsObjRequest.setRetryPolicy(policy);
    requestQueue.add(jsObjRequest);
}

2 个答案:

答案 0 :(得分:0)

使用网址而不留尾“/”

https://android.googleapis.com/gcm/send

请从服务器发布错误响应 使用错误侦听器中的以下代码来获取响应 使用

的日志输出更新问题
@Override
public void onErrorResponse(VolleyError error) {
    String response=new String(error.networkResponse.data,"UTF-8");
    Log.e("Error Response",response);
}

并且

Log.e("MYOBJs", obj.toString());

答案 1 :(得分:0)

我不明白为什么你要向/通过firebase发送一个截击请求。在Android和谷歌文档中支持firebase消息传递,这很容易理解。此外,如果要将上游消息发送到后端,后端需要XMPP支持,或者如果要发送到另一个设备,则至少需要指定它的firebase令牌。这是我在firebase中发送消息的示例:

public static int login(String email, String password){
    int msgId = getFreeMsgId();
    FirebaseMessaging fm = FirebaseMessaging.getInstance();
    fm.send(new RemoteMessage.Builder(MY_SENDER_ID + "@gcm.googleapis.com")
            .setMessageId(Integer.toString(msgId))
            .addData("type","login")
            .addData("e-mail", email)
            .addData("password",password)
            .setTtl(1200)
            .build());
    return msgId;
}

通过firebase直接进入我的后端,在我的XMPP后端,我已经保存了所有已连接的设备,因此我可以向他们发送消息/通知

我不是firebase的专家,但我认为你对firebase的运作方式感到困惑