Android Volley调用FCM遇400错误,自定义通知无法触发onMessageReceived
解决FCM自定义通知不触发
onMessageReceived()且报400错误的问题 首先,Volley返回400状态码说明你的请求格式、参数或者权限存在问题,这也是导致自定义通知不生效的核心原因之一。咱们一步步来排查解决:
1. 先检查请求头是否配置正确
FCM服务器要求请求头必须包含两个关键项,缺一个都可能报错:
Authorization: key=YOUR_SERVER_KEY:这里的服务器密钥要从Firebase控制台的「项目设置」→「云消息传递」里获取,别搞混了客户端的API密钥Content-Type: application/json:必须指定这个类型,否则FCM无法正确解析你的JSON payload
用Volley实现的话,设置请求头的代码大概是这样:
JsonObjectRequest fcmRequest = new JsonObjectRequest(Request.Method.POST, FCM_SEND_URL, payload, response -> { /* 处理成功回调 */ }, error -> { /* 处理错误回调 */ }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); headers.put("Authorization", "key=你的服务器密钥"); headers.put("Content-Type", "application/json"); return headers; } };
2. 确保Payload格式符合触发onMessageReceived()的要求
FCM的消息分两种:通知消息和数据消息,只有数据消息(或同时包含通知+数据且客户端在前台)才会触发onMessageReceived()。如果只发notification字段的消息,系统会直接弹出默认通知,不会走你的自定义逻辑。
正确的触发自定义逻辑的Payload示例(纯数据消息):
{ "to": "目标设备的FCM令牌", "data": { "title": "我的自定义标题", "body": "这是自定义通知内容", "extra_data": "可以带任意自定义字段" } }
如果想后台也触发onMessageReceived(),就别用notification字段,只用data字段就行。
3. 检查FCM令牌和请求URL是否正确
- 400错误也可能是
to字段里的FCM令牌无效(比如设备卸载后令牌失效、格式输错),可以先去Firebase控制台的「云消息传递」测试发送给该令牌,确认令牌是否有效。 - 你的报错里URL是
https://fcm.googleapis.com/fcm/send/,注意末尾不要带斜杠,正确的URL应该是https://fcm.googleapis.com/fcm/send,多了斜杠也可能触发400错误。
4. 最后确认客户端的Firebase配置
确保客户端这边的集成没毛病:
- 已经把
google-services.json放在app目录下 - 依赖了正确的Firebase Messaging库(用最新版本更稳妥):
implementation 'com.google.firebase:firebase-messaging:23.4.0'
- 自定义的
FirebaseMessagingService已经在AndroidManifest.xml里注册:
<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
按照上面的步骤排查,应该能解决400错误和自定义通知不触发的问题。如果还是不行,可以把完整的Payload和请求头贴出来,方便进一步定位问题。
内容的提问来源于stack exchange,提问作者Aahil
相关产品推荐
相关产品推荐

