首页 > 解决方案 > 在 Android 中将 FCM 消息从一台设备发送到另一台没有服务器的设备

问题描述

我知道这样做的风险。

但是现在我只想在没有任何服务器的情况下将消息从一台设备发送到另一台设备。

这是我正在尝试的。

        JSONObject root = new JSONObject();
        JSONObject notification = new JSONObject();
        notification.put("body", messageText);
        notification.put("title", username);

        JSONObject data = new JSONObject();
        data.put("senderToken", senderToken);
        data.put("messageId", messageId);

        root.put("notification", notification);
        root.put("data", data);
        root.put("to", receiverToken);

        String postData = URLEncoder.encode(root.toString(),"UTF-8");
        return openServerConnection(postData);

private String openServerConnection(String postData){

    try {
        URL url = new URL("https://fcm.googleapis.com/fcm/send");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setRequestProperty("Content-Type","application/json");
        httpURLConnection.setRequestProperty("Authorization", "key=AAAAPQ4yGQM:APA9....1cW");
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setDoInput(true);
        httpURLConnection.setDoOutput(true);
        OutputStream outputStream = httpURLConnection.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter( new OutputStreamWriter(outputStream, "UTF-8") );
        bufferedWriter.write(postData);
        bufferedWriter.flush();
        bufferedWriter.close();
        outputStream.close();
        InputStream inputStream = httpURLConnection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream, "iso-8859-1") );
        StringBuilder result = new StringBuilder();
        String line = "";
        while( (line = bufferedReader.readLine()) != null ){
            result.append(line);
        }
        bufferedReader.close();
        inputStream.close();
        httpURLConnection.disconnect();
        return result.toString();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

但我看到一个错误。

W/System.err:java.io.FileNotFoundException:https ://fcm.googleapis.com/fcm/send 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:250) W/System.err: 在 com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 在 com .android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java) 在 org.octabyte.zeem.InstantChat.SendMessage.openServerConnection(SendMessage.java:124) W/System.err: 在 org.octabyte.zeem.InstantChat .SendMessage.doInBackground(SendMessage.java:74) at org.octabyte.zeem.InstantChat.SendMessage.doInBackground(SendMessage.java:21) at android.os.AsyncTask$2.call(AsyncTask.java:304) at java.util .concurrent.FutureTask.run(FutureTask.java:237) W/System。错误:在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:607) W/System.err: 在 java.lang.Thread.run(Thread.java:761)

我无法发送任何消息,我检查了我的 firebase 令牌都正确,服务器密钥也有什么问题。你能否让我知道我所缺少的。

第二件事是我看到已经存在用于发送某种消息的内置方法。但它不起作用。这种方法的目的是什么,你能告诉我这个吗

这是此方法的代码。你能解释一下吗。

RemoteMessage message = new RemoteMessage.Builder(getRegistrationToken())
                .setMessageId(incrementIdAndGet())
                .addData("message", "Hello")
                .build();

FirebaseMessaging.getInstance().send(message);

这是什么 ????

更新

在文档中描述了如何使用 http 请求发送 firebase 消息。就在这里Build App Server Send Requests我可以使用此方法从 android 设备发送请求。因为在这种方法中不需要服务器密钥。有人可以让我知道这是否可能吗?

标签: androidfirebasefirebase-cloud-messaging

解决方案


我对其进行测试并运行您的代码。问题出在postData你是encoding json数据的问题上。只需替换此行

      String postData = URLEncoder.encode(root.toString(),"UTF-8");
      // replace with
      String postData = root.toString();

推荐阅读