我正在尝试从Firebase数据库中检索实时位置数据,并在Google地图中为每个用户显示多个标记。
这是我的Firebase数据库的结构:
这是Google Maps活动的代码:
public class CyclistMapsActivity extends FragmentActivity implements OnMapReadyCallback {
private FirebaseAuth mAuth;
private DatabaseReference UserRef;
private String currentUserID;
private static final String TAG = CyclistMapsActivity.class.getSimpleName();
private HashMap<String, Marker> mMarkers = new HashMap<>();
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cyclist_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setMaxZoomPreference(16);
subscribeToUpdates();
}
private void subscribeToUpdates() {
mAuth = FirebaseAuth.getInstance();
currentUserID = mAuth.getCurrentUser().getUid();
final String path = "/latlong";
UserRef = FirebaseDatabase.getInstance().getReference("Users"+currentUserID+path);
DatabaseReference ref = UserRef;
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
setMarker(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
setMarker(dataSnapshot);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError error) {
Log.d(TAG, "Failed to read value.", error.toException());
}
});
}
private void setMarker(DataSnapshot dataSnapshot) {
String key = dataSnapshot.getKey();
HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.child("Users").child(currentUserID).child("/latlong").getValue();
double lat = Double.parseDouble(value.get("latitude").toString());
double lng = Double.parseDouble(value.get("longitude").toString());
LatLng location = new LatLng(lat, lng);
if (!mMarkers.containsKey(key)) {
mMarkers.put(key, mMap.addMarker(new MarkerOptions().title(key).position(location)));
} else {
mMarkers.get(key).setPosition(location);
}
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : mMarkers.values()) {
builder.include(marker.getPosition());
}
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 300));
}
}
当我尝试运行我的应用程序时,Firebase数据库中每5秒更新一次所有用户的位置,但是制造商未显示在Google地图上。
我在logcat中看到此错误:
"W/Bundle: Key getPairValue() expected String but value was a java.lang.Float. The default value <null> was returned."
答案 0 :(得分:0)
您的代码中有几个问题。您引用的/
之间不包含"Users"+currentUser
,应为"Users/"+currentUser
。发生该错误的原因是,当您试图以浮点数的形式获取该值时,它是一个字符串。要以正确,更简单的方式获取latitude
和longitude
,请使用以下代码行:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference latlongRef = rootRef.child("Users").child(uid).child("latlong");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
double latitude = dataSnapshot.child("latitude").getValue(Double.class);
double longitude = dataSnapshot.child("longitude").getValue(Double.class);
Log.d(TAG, latitude + ", " + longitude);
setMarker(latitude, longitude);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
latlongRef.addListenerForSingleValueEvent(valueEventListener);
logcat中的输出将是:
53,45, 9.14
一旦您拥有latitude
和longitude
,就可以调用将标记添加到地图的方法。