如何使用Firebase Realtime Database for Android Google Map应用程序?

时间:2016-09-15 18:18:37

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

我尝试使用Firebase Realtime Dataase访问我的地图标记,其中包括dobdodname,{{1 }},latitude等。我想使用全名作为标记的标题,以及dob和dod作为标记的片段。

我的问题是,不知道如何将longitudelatitude的值作为标记的位置以及longitudefirstname作为标题...

这是我的lastname

Realtime Dataase

Profile

我的地图应用的代码:

0

dob: "24/12/1940"

dod: "02/07/2016"

firstname:"Lincon"

lastname:"Hall"

latitude: -34.506081

longitude:150.88104

1

dob: "05/06/1949"

dod: "08/08/2016"

firstname:"Ben"

lastname:"Roberts"

latitude:-34.50609

longitude:150.8811

}

任何人都可以帮助我吗?非常感谢!

Dob和dod的值为空。

map

1 个答案:

答案 0 :(得分:3)

尝试以下方法:

创建一个用于存储和检索数据库中标记数据的类。

在这个例子中,我建议你创建一个java对象,用于轻松存储和检索你的标记信息。该类将表示您要用于创建Google Map标记的任何数据。您可以将课程命名为对您有意义的名称。我将在这个例子中将其称为FirebaseMarker。

public class FirebaseMarker {

    public String dob;
    public String dod;
    public String firstname;
    public String lastname;
    public double latitude;
    public double longitude;


    //required empty constructor
    public FirebaseMarker() {
    }

    public FirebaseMarker(String firstname, String lastname, double latitude, double longitude, String dob, String dod) {
        this.dob = dob;
        this.dod = dod;
        this.firstname = firstname;
        this.lastname = lastname;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public String getDob() {
        return dob;
    }

    public void setDob(String dob) {
        this.dob = dob;
    }

    public String getDod() {
        return dod;
    }

    public void setDod(String dod) {
        this.dod = dod;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }
}

每当您想要将标记信息保存到数据库时,您可以这样做:

DatabaseReference mProfileRef = FirebaseDatabase.getInstance().getReference("Profile");
FirebaseMarker marker = new FirebaseMarker("Lincoln", "Hall", -34.506081, 150.88104, "24/12/1940", "02/07/2016" );
mProfileRef.push().setValue(marker);

将childEventListener移动到onMapReady()

由于您希望访问GoogleMap最安全的地方childEventListener对象,因此您可以确定onMapReady回调中的GoogleMap回调object不会为null。

使用Firebase数据库中存储的数据将您的代码添加到地图中以添加标记到您的childEventListener的onChildAdded回调

当您将childEventListener附加到数据库中的某个位置时,将为该位置的每个孩子调用一次onChildAdded回调,然后每次将新子项添加到该位置时再次调用onChildChanged回调。现在,用于使用存储在数据库中的信息将标记添加到地图的代码放在OnChildChanged回调中。 ChildEventListener mChildEventListener; DatabaseReference mProfileRef = FirebaseDatabase.getInstance().getReference("Profile"); //.... @Override public void onMapReady(GoogleMap googleMap){ googleMap.setOnMarkerClickListener(this); LatLng wollongong = new LatLng(-34.404336, 150.881632); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(wollongong, 18)); googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); //get marker info from Firebase Database and add to map addMarkersToMap(googleMap); if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } googleMap.setMyLocationEnabled(true); } @Override public void onStop(){ if(mChildEventListener != null) mProfileRef.removeEventListener(mChildEventListener); super.onStop(); } private void addMarkersToMap(GoogleMap map){ mChildEventListener = mProfileRef.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { FirebaseMarker marker = dataSnapshot.getValue(FirebaseMarker.class); String dob = marker.getDob(); String dod = marker.getDod(); String latitude = marker.getLatitude(); String longitude = marker.getLongitude(); String firstname = marker.getFirstname(); String lastname = marker.getLastname(); LatLng location = new LatLng(latitude,longitude); map.addMarker(new MarkerOptions().position(location).title(firstname,lastname).snippet(dob,dod)); } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { } @Override public void onCancelled(DatabaseError databaseError) { } }); } 仅在更新了附加侦听器的位置的子节点时调用(传递给该侦听器的dataSnapshot是已更改的子节点)。此外,我假设您将使用Java类来存储/检索您的标记信息,如上所述。

@Override
protected void onDraw(Canvas canvas) {

    long now = android.os.SystemClock.uptimeMillis();
    if (mMovieStart == 0) {   // first time
        mMovieStart = now;
    }

    if (gifMovie != null) {

        int dur = gifMovie.duration();
        if (dur == 0) {
            dur = 1000;
        }
        now = android.os.SystemClock.uptimeMillis();
        int relTime = (int) ((now - mMovieStart) % dur);
        if (now - mMovieStart > movieDuration) {
            relTime = 0;
        }

        gifMovie.setTime(relTime);

        gifMovie.draw(canvas, 0, 0);
        invalidate();

    }
}