android - 在 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 设备发送请求。因为在这种方法中不需要服务器密钥。有人可以让我知道这是否可能吗?
解决方案
我对其进行测试并运行您的代码。问题出在postData
你是encoding
json
数据的问题上。只需替换此行
String postData = URLEncoder.encode(root.toString(),"UTF-8");
// replace with
String postData = root.toString();
推荐阅读
- docker - 如何知道负载平衡在 Docker Swarm 中是否有效?
- javascript - 执行查找查询时如何使猫鼬失败
- c# - 将读取 C++ 代码的二进制文件移植到 C#
- c# - C# Protractor angular 从未提供 resumeBootstrap
- perl - 为什么排序在脚本中失败但在单行中没有?
- android - 将动态属性传递给布局 XML 中的视图
- spring-mvc - Spring Boot - 大文本属性
- javascript - Javascript 参考错误
- ios - 仅获取带有捆绑标识符的 App Store 链接
- javascript - 如何从 js 文件访问 html 文件中的 auth0 对象