本文详解如何在android应用中通过编程方式调用firebase cloud messaging(fcm)http v1 api,向指定设备token安全、可靠地发送定向推送通知,涵盖请求构造、依赖配置、线程管理及常见错误规避。
本文详解如何在android应用中通过编程方式调用firebase cloud messaging(fcm)http v1 api,向指定设备token安全、可靠地发送定向推送通知,涵盖请求构造、依赖配置、线程管理及常见错误规避。
在Android客户端直接调用FCM服务端API发送通知虽不推荐作为生产级后端方案(应由可信服务器执行),但在测试、原型验证或轻量级管理场景中具有实用价值。以下提供一套稳定、可复用、符合现代Android开发规范的实现方案。
✅ 正确的请求结构与认证方式
FCM已弃用旧版https://fcm.googleapis.com/fcm/send + key=
- 使用 Authorization: key=
(注意:非Web API Key,而是Firebase Console → Project Settings → Cloud Messaging → Server key) - 请求体为标准JSON,to 字段值为单个注册Token(字符串),不可为数组或空
- Content-Type 必须为 application/json
⚠️ 注意:Server Key 属于高危凭证,绝不可硬编码在APK中或提交至代码仓库。本示例仅用于教学演示;生产环境务必通过后端中转,避免密钥泄露风险。
✅ 推荐实现:使用OkHttp异步发送(简洁高效)
以下是基于 OkHttp 的线程安全实现(无需手动管理Thread生命周期,更推荐Coroutine或WorkManager,此处以OkHttp为例):
// app/build.gradle 中添加依赖(推荐较新稳定版) implementation 'com.squareup.okhttp3:okhttp:4.12.0'
private void sendFcmNotification(String token, String title, String body) {
// 构建JSON payload(支持notification + data混合)
String jsonPayload = String.format(
"{
" +
" "to": "%s",
" +
" "notification": {
" +
" "title": "%s",
" +
" "body": "%s"
" +
" },
" +
" "data": {
" +
" "click_action": "FLUTTER_NOTIFICATION_CLICK"
" +
" }
" +
"}",
token,
title.replace(""", "\""),
body.replace(""", "\"")
);
OkHttpClient client = new OkHttpClient();
RequestBody bodyReq = RequestBody.create(
MediaType.get("application/json; charset=utf-8"),
jsonPayload
);
Request request = new Request.Builder()
.url("https://fcm.googleapis.com/fcm/send")
.post(bodyReq)
.addHeader("Authorization", "key=YOUR_SERVER_KEY_HERE") // ? 替换为真实Server Key
.addHeader("Content-Type", "application/json")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("FCM_SEND", "Request failed", e);
runOnUiThread(() -> Toast.makeText(MainActivity.this, "发送失败: " + e.getMessage(), Toast.LENGTH_LONG).show());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
String responseBody = response.body() != null ? response.body().string() : "";
int code = response.code();
Log.d("FCM_SEND", "Response Code: " + code + ", Body: " + responseBody);
if (response.isSuccessful()) {
runOnUiThread(() -> Toast.makeText(MainActivity.this, "通知已发送", Toast.LENGTH_SHORT).show());
} else {
runOnUiThread(() -> Toast.makeText(MainActivity.this, "HTTP错误: " + code, Toast.LENGTH_SHORT).show());
}
} finally {
response.close();
}
}
});
}
✅ 关键注意事项与最佳实践
- Token有效性校验:发送前建议先调用 Instance ID API 或监听 onNewToken() 确保Token未过期。
- 字符转义:title/body 中若含双引号、换行符等,需手动转义(如示例中的 .replace(""", "\"")),否则JSON解析失败。
- 响应处理:FCM返回 200 OK 并不保证设备收到通知(可能离线、被系统拦截)。需检查响应体中的 "success": 1 及 "message_id" 字段确认投递状态。
-
替代方案建议:
- ✅ 生产环境:使用 Firebase Admin SDK(Node.js/Python/Java)部署轻量后端接口;
- ✅ 跨平台统一:集成 firebase-messaging 客户端SDK,由服务端触发通知;
- ✅ 后台任务:Android 8.0+ 需使用 WorkManager 替代裸线程,保障系统兼容性。
通过以上实现,你已具备在Android端安全、可控地触发FCM定向推送的能力。请始终将密钥保护与服务端解耦作为首要设计原则,让推送更可靠、更安全。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










