Android通过FCM向指定用户发送推送通知的代码实现求助
修正FCM推送通知代码的问题
你的代码存在几个核心问题,导致无法正确发送FCM推送:
- 未使用正确的FCM请求体:你定义了包含目标Token和通知内容的
json字符串,但实际发送请求时用了无关的details={...}参数,完全没用到正确的请求数据。 - JSON字符串语法错误:你写的
json字符串末尾缺少闭合的},会导致JSON解析失败。 - 响应内容读取错误:直接调用
response.getEntity().getContent().toString()得到的是InputStream对象的toString结果,不是实际的响应文本。 - 异常处理不完整:catch块为空,无法排查请求过程中的错误。
修正后的完整代码
private void sendFCMNotification() { // 替换<USER_FCM>为用户实际的FCM Token,<API_KEY>为你的FCM服务器密钥 String fcmJson = "{\"to\": \"<USER_FCM>\",\"notification\": {\"title\": \"Check this Mobile (title)\",\"body\": \"Rich Notification testing (body)\"}}"; CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpPost request = new HttpPost("https://fcm.googleapis.com/fcm/send"); try { // 设置正确的FCM请求体 StringEntity entity = new StringEntity(fcmJson, ContentType.APPLICATION_JSON); request.addHeader("content-type", "application/json"); request.addHeader("Authorization", "key=<API_KEY>"); request.setEntity(entity); // 执行请求并读取完整响应 HttpResponse response = httpClient.execute(request); BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuilder responseContent = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { responseContent.append(line); } reader.close(); // 打印响应内容用于调试 Log.d("FCM_RESPONSE", responseContent.toString()); } catch (JSONException e) { Log.e("FCM_ERROR", "JSON格式错误", e); } catch (IOException e) { Log.e("FCM_ERROR", "网络请求失败", e); } finally { try { httpClient.close(); } catch (IOException e) { Log.e("FCM_ERROR", "关闭客户端失败", e); } } }
关键改进说明
- 直接使用构建好的FCM通知JSON作为请求实体,确保FCM服务器能识别目标设备和通知内容。
- 修复了JSON字符串末尾缺失的
},避免解析异常。 - 用
BufferedReader读取输入流,拼接成实际的响应文本,方便调试排查问题。 - 完善异常处理,添加针对性日志输出,便于定位错误。
额外注意事项
- 若为Android项目,Android 6.0之后Apache HttpClient被移除,需手动添加依赖或改用HttpURLConnection/OkHttp实现。
- 确保替换代码中的占位符为实际有效的FCM Token和服务器密钥。
内容的提问来源于stack exchange,提问作者Ma7mouD_7
相关产品推荐
相关产品推荐

