【发布时间】:2019-06-14 05:46:03
【问题描述】:
我正在尝试从 Firebase 数据库中检索实时位置数据,并在 Google 地图中为每个用户显示多个标记。
这是我的 Firebase 数据库的结构:
这是谷歌地图活动的代码:
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."
【问题讨论】:
标签: android firebase google-maps firebase-realtime-database