Проблема извлечения данных в реальном времени из БД Firebase в карты Google - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь получить данные о местоположении в реальном времени из базы данных Firebase и показать несколько маркеров для каждого пользователя на карте Google.

Это структура моей базы данных Firebase:

Firebase structure

и это код активности 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));
    }
}

Когда я пытаюсь запустить свое приложение, местоположения всех пользователей обновляются каждые 5 секунд в базе данных Firebase, но создатели не отображаются на карте Google.

Я вижу эту ошибку в моей logcat:

"W/Bundle: Key getPairValue() expected String but value was a java.lang.Float.  The default value <null> was returned."

1 Ответ

0 голосов
/ 21 января 2019

У вас есть несколько проблем в вашем коде.Ваша ссылка не содержит / между "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, вы можете вызвать метод для добавления маркеров на карту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...