You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

聊天应用发送消息后Notification功能失效问题求助

问题排查与修复方案

1. 替换重复触发的事件监听

当前使用addValueEventListener会在Tokens节点数据变化时重复发送通知,改用addListenerForSingleValueEvent仅执行一次查询:

query.addListenerForSingleValueEvent(new ValueEventListener() {
    // 保留原有onDataChange和onCancelled逻辑
});

2. 补全错误日志,定位失败根源

现有代码未记录任何错误信息,无法排查问题,需添加日志输出:

@Override
public void onFailure(Call<MyResponse> call, Throwable t) {
    Log.e("NotificationError", "发送失败: " + t.getMessage());
    Toast.makeText(UserChatActivity.this, "发送失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}

@Override
public void onCancelled(@NonNull DatabaseError error) {
    Log.e("FirebaseQueryError", "查询Token失败: " + error.getMessage());
    Toast.makeText(UserChatActivity.this, "查询Token失败", Toast.LENGTH_SHORT).show();
}

同时完善onResponse的状态码判断:

@Override
public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
    if (response.code() == 200){
        if (response.body().success != 1){
            Log.e("NotificationError", "服务器返回失败: success=" + response.body().success);
            Toast.makeText(UserChatActivity.this, "发送失败!!", Toast.LENGTH_SHORT).show();
        }
    } else {
        Log.e("NotificationError", "HTTP错误码: " + response.code() + ", 响应内容: " + response.errorBody());
        Toast.makeText(UserChatActivity.this, "HTTP错误: " + response.code(), Toast.LENGTH_SHORT).show();
    }
}

3. 验证Token的有效性

  • 确认Firebase的Tokens节点中,receiver对应的键值对存在,且Token类的字段名与Firebase中的键完全匹配(区分大小写)。
  • 在循环中添加日志,检查Token是否正常获取:
Token token = dataSnapshot.getValue(Token.class);
if (token == null || token.getToken() == null || token.getToken().isEmpty()) {
    Log.e("TokenError", "未获取到有效Token");
    continue;
}
Log.d("TokenDebug", "获取到Token: " + token.getToken());

4. 检查FCM API服务配置

确保apiServices正确配置了FCM服务器密钥,在Retrofit中添加授权头:

OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request().newBuilder()
                        .header("Authorization", "key=你的FCM服务器密钥")
                        .header("Content-Type", "application/json")
                        .build();
                return chain.proceed(request);
            }
        })
        .build();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://fcm.googleapis.com/fcm/")
        .client(client)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

apiServices = retrofit.create(ApiServices.class);

5. 校验SenderUID变量

确认SenderUID已正确赋值,若为发送方UID,建议直接使用fAuth.getUid()避免变量错误:

Data data = new Data(fAuth.getUid(), R.mipmap.ic_launcher, username +": "+message, "New Message", fAuth.getUid());

6. 适配Android 8.0+通知渠道

Android 8.0及以上必须创建通知渠道才能显示通知,在Application或启动Activity中添加:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationChannel channel = new NotificationChannel("chat_channel", "聊天通知", NotificationManager.IMPORTANCE_DEFAULT);
    channel.setDescription("新消息通知");
    NotificationManager notificationManager = getSystemService(NotificationManager.class);
    notificationManager.createNotificationChannel(channel);
}

同时确保通知显示代码中指定了该渠道ID。

内容的提问来源于stack exchange,提问作者RAndroid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:57:17