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

如何获取Firebase中的经纬度值?我的代码返回null无法正常运行

解决Firebase获取latitude/longitude返回null的问题

先揪出你代码里最显眼的问题:拼写错误!你写的是logitude,正确的字段名应该是longitude——这个低级错误会直接导致找不到对应值,自然返回null,先把这个拼写改过来再说。

接下来还要根据你的Firebase数据结构,确认监听类型是否匹配:

情况1:Jaffna节点直接包含latitude和longitude字段

如果你的数据结构是这样的:

districsubdepot
  └── Jaffna
      ├── latitude: 9.6667
      └── longitude: 80.0000

那你用ChildEventListener就不合适了。因为ChildEventListener的onChildAdded会监听Jaffna下的每个子节点(也就是latitude和longitude各自触发一次回调),这时候在回调里去取dataSnapshot.child("latitude"),自然会是null——因为此时dataSnapshot本身就是latitude或者longitude的节点,它下面没有子节点了。

这种情况应该改用ValueEventListener,直接获取整个Jaffna节点的数据:

mLocationRef = FirebaseDatabase.getInstance().getReference().child("districsubdepot").child("Jaffna");
mLocationRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) { // 先确认节点存在,避免空指针
            Double lt = dataSnapshot.child("latitude").getValue(Double.class);
            Double lo = dataSnapshot.child("longitude").getValue(Double.class); // 注意修正拼写!
            if (lt != null && lo != null) {
                // 这里处理获取到的经纬度
                Toasty.success(getApplicationContext(), "Lat: " + lt + ", Lng: " + lo, Toast.LENGTH_SHORT).show();
            } else {
                Toasty.warning(getApplicationContext(), "经纬度字段缺失", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toasty.error(getApplicationContext(), "Jaffna节点不存在", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // 处理数据库读取错误
        Toasty.error(getApplicationContext(), "读取失败: " + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

情况2:Jaffna节点下有多个子节点,每个子节点包含经纬度

如果你的数据结构是这样的:

districsubdepot
  └── Jaffna
      ├── location1
      │   ├── latitude: 9.6667
      │   └── longitude: 80.0000
      └── location2
          ├── latitude: 9.7000
          └── longitude: 80.0100

那你用ChildEventListener是对的,但还是要修正longitude的拼写,并且在回调里直接从当前dataSnapshot取字段:

mLocationRef = FirebaseDatabase.getInstance().getReference().child("districsubdepot").child("Jaffna");
mLocationRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        Double lt = dataSnapshot.child("latitude").getValue(Double.class);
        Double lo = dataSnapshot.child("longitude").getValue(Double.class); // 修正拼写
        if (lt != null && lo != null) {
            Toasty.success(getApplicationContext(), "获取到位置: " + lt + ", " + lo, Toast.LENGTH_SHORT).show();
        }
    }

    // 其他回调方法可以留空或按需实现
    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {}
    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
    @Override
    public void onCancelled(DatabaseError databaseError) {
        Toasty.error(getApplicationContext(), "读取失败: " + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

最后还要确认两个关键点:

  • 你的Firebase数据库规则是否允许读取该节点?如果是私有规则或需要认证,要确保当前用户有权限访问。
  • 确认Firebase控制台里的字段名和你代码里的完全一致(Firebase是大小写敏感的)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:43:24