with tracker studio real google example android firebase firebase-database google-maps-markers

tracker - Android Firebase eliminar los marcadores de Google Maps



google maps real time tracking (1)

Intentando hacer una pequeña aplicación de Android que muestre las ubicaciones de las personas como marcadores de Google Maps.

cuando el usuario presiona un botón para aparecer en el mapa, la aplicación recupera los datos de los usuarios de Firebase JSON y muestra a los usuarios en el mapa en tiempo real. Si un usuario se mueve, el marcador se mueve con él (eliminado y recreado cuando cambia su ubicación).

Todo funciona muy bien, excepto que cuando el usuario presiona para salir del mapa, su marcador permanece en todos los otros teléfonos aunque se elimine de Firebase JSON.

¿Alguien puede explicar cómo solucionar este problema? Mi código para recuperar a los usuarios y crear marcadores en el mapa:

ValueEventListener UsersActiveListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { UsersActive uA = userSnapshot.getValue(UsersActive.class); if (uA.getUserIDcode() != firebaseauth.getCurrentUser().getUid()) { Double uAlatindouble = Double.valueOf(uA.getUserlat()); Double uAlonindouble = Double.valueOf(uA.getUserlon()); LatLng uALTLG; if (uAmarker != null) { uAmarker.remove(); } uALTLG = new LatLng(uAlatindouble, uAlonindouble); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(uALTLG); markerOptions.title(uA.getUsername()); markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.usermarker)); uAmarker = mMap.addMarker(markerOptions); } } }

Mi código para ingresar o salir del mapa (presionando dos FAB: goActive , goNotActive ):

public void goActiveFAB (View view){ isActive = true; FABgoActive.setVisibility(GONE); FABDontgoActive.setVisibility(View.VISIBLE); // user in map class UsersActive CurrentUserActive = new UsersActive(); CurrentUserActive.setUserIDcode(firebaseauth.getCurrentUser().getUid()); CurrentUserActive.setUserlat(String.valueOf(mLastLocation.getLatitude())); CurrentUserActive.setUserlon(String.valueOf(mLastLocation.getLongitude())); CurrentUserActive.setUsername(currentUser.getNickname()); groupPosShareRef.child(firebaseauth.getCurrentUser().getUid()).setValue(CurrentUserActive); } public void goNotActiveFAB (View view){ isActive = false; FABgoActive.setVisibility(View.VISIBLE); FABDontgoActive.setVisibility(View.GONE); groupPosShareRef.child(firebaseauth.getCurrentUser().getUid()).removeValue(); }

¡Gracias!


Use ChildEventListener en ChildEventListener lugar, luego ChildEventListener cada marcador a la identificación de cada usuario.

Map<String, Marker> markers = new HashMap(); ref.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { UsersActive uA = dataSnapshot.getValue(UsersActive.class); // ... Marker uAmarker = mMap.addMarker(markerOptions); markers.put(dataSnapshot.getKey(), uAmarker); } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { UsersActive uA = dataSnapshot.getValue(UsersActive.class); // ... if (markers.contains(dataSnapshot.getKey())) { Marker marker = markers.get(dataSnapshot.getKey()); marker.remove(); // or // marker.setPosition(newPosition); } Marker uAmarker = mMap.addMarker(markerOptions); markers.put(dataSnapshot.getKey(), uAmarker); } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { if (markers.contains(dataSnapshot.getKey())) { Marker marker = markers.get(dataSnapshot.getKey()); marker.remove(); } } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { } @Override public void onCancelled(DatabaseError databaseError) { } });