如何获取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
相关产品推荐
相关产品推荐

