从Firebase DB检索实时数据到Google Maps的问题

时间:2019-01-20 18:44:18

标签: android firebase google-maps firebase-realtime-database

我正在尝试从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));
    }
}

当我尝试运行我的应用程序时,Firebase数据库中每5秒更新一次所有用户的位置,但是制造商未显示在Google地图上。

我在logcat中看到此错误:

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

1 个答案:

答案 0 :(得分:0)

您的代码中有几个问题。您引用的/之间不包含"Users"+currentUser,应为"Users/"+currentUser。发生该错误的原因是,当您试图以浮点数的形式获取该值时,它是一个字符串。要以正确,更简单的方式获取latitudelongitude,请使用以下代码行:

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

一旦您拥有latitudelongitude,就可以调用将标记添加到地图的方法。