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

如何从Firebase Realtime Database获取所有用户device token用于发送推送消息

问题原因

你当前的实现存在两个核心错误:

  • UsersRef指向的是根节点下的Users集合节点,调用UsersRef.getKey()拿到的是字符串"Users",不是你需要的各个用户ID
  • 你没有遍历Users节点下的所有子节点,每个子节点的key就是对应用户的ID,遍历后才能拿到每个用户的device_token
    另外你找不到get()方法是因为当前集成的Firebase Realtime Database SDK版本低于19.6.0,get()是19.6.0版本才新增的异步读取方法,旧版本使用addListenerForSingleValueEvent实现一次性读取即可。

正确实现代码

DatabaseReference UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
// 一次性读取所有用户数据,不会监听后续数据变更
UsersRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NotNull DataSnapshot dataSnapshot) {
        // 存储所有用户device token的列表
        List<String> allDeviceTokens = new ArrayList<>();
        // 遍历Users下的所有子节点,每个子节点对应一个用户
        for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
            // 子节点的key即为用户ID,有需要可以单独存储
            String userId = userSnapshot.getKey();
            // 读取当前用户的device_token字段
            if (userSnapshot.hasChild("device_token")) {
                String deviceToken = userSnapshot.child("device_token").getValue(String.class);
                if (deviceToken != null && !deviceToken.isEmpty()) {
                    allDeviceTokens.add(deviceToken);
                }
            }
        }
        // 此处已经获取到全部有效device token,可直接用于推送发送逻辑
        Log.d("TOKEN统计", "共获取到" + allDeviceTokens.size() + "个有效设备token");
    }

    @Override
    public void onCancelled(@NotNull DatabaseError error) {
        // 读取失败处理,比如权限不足、网络异常等
        Log.e("数据库读取失败", error.getMessage());
    }
});

补充说明

  • 如果你需要实时监听用户device token的变更,把addListenerForSingleValueEvent替换为addValueEventListener即可
  • 后续如果要使用get()方法,只需要将项目中Firebase Realtime Database的依赖版本升级到19.6.0及以上即可

内容的提问来源于stack exchange,提问作者Diego González

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:45:06