从Firebase检索位置并将标记放在google map api for android上

时间:2017-04-26 13:42:37

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

我正在尝试创建应用程序,以便在按下保存按钮时在firebase上存储位置,并从firebase检索位置并显示地图中的所有图钉。我已经能够将位置保存到具有纬度和经度的位置子项下的firebase,但我不知道如何获取值和引脚。我尝试按照firebase在手册上的方式进行操作,但它没有用。有人可以帮忙解决这个问题吗?

到目前为止,这是我的代码:

public class MapsActivity extends FragmentActivity implements 
OnMapReadyCallback {
private GoogleMap mMap;
private final static int MY_PERMISSION_FINE_LOCATION = 101;
private Button mSaveButton;
private DatabaseReference mDatabase;
private DatabaseReference refDatabase;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_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);
    mSaveButton = (Button) findViewById(R.id.Savebtn);
    mDatabase = 
FirebaseDatabase.getInstance().getReference().child("Navigation");
    refDatabase = 
FirebaseDatabase.getInstance().getReference().child("Location");
 }
@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;


    mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {

        @Override
        public void onMapLongClick(LatLng point) {
            // TODO Auto-generated method stub

            // added marker saved as marker and coordinates passed to latlng
            Marker marker = mMap.addMarker(new 
           MarkerOptions().position(point));
            final LatLng latlng = marker.getPosition();

            mSaveButton.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View view){
                    DatabaseReference newPost = mDatabase.push();
                    newPost.child("Location").setValue(latlng);

                }
            });

          }
       });

       if (ActivityCompat.checkSelfPermission(this, 
    Manifest.permission.ACCESS_FINE_LOCATION) ==
             PackageManager.PERMISSION_GRANTED) {
        mMap.setMyLocationEnabled(true);
    } else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]
{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_FINE_LOCATION);
        }

    }


}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case MY_PERMISSION_FINE_LOCATION:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ==
                        PackageManager.PERMISSION_GRANTED) {
                    mMap.setMyLocationEnabled(true);
                }

            }else {
                Toast.makeText(getApplicationContext(), "This requires location permissions to be granted", Toast
                        .LENGTH_LONG).show();
                finish();
            }
            break;
    }
  }
}

这是位置在firebase中的保存方式

Data
  -Kidp45TdInOM3Bsyu2b
         Location
         latitude:19.772613777905196 
         longitude:-9.92741011083126
  -KidsmTExZY2KjnS7S-b
         Location
         latitude: 18.221073689785065
         longitude: -6.573890447616577
  -KidvmAgV0bm2uT_Pcdr
         Location
         latitude: 14.44608051870992
         longitude: -6.510856859385967

1 个答案:

答案 0 :(得分:3)

首先:您需要将结构更改为:

 Data
  Location
    -Kidp45TdInOM3Bsyu2b
       latitude:19.772613777905196 
       longitude:-9.92741011083126
    -KidsmTExZY2KjnS7S-b
       latitude: 18.221073689785065
       longitude: -6.573890447616577
    -KidvmAgV0bm2uT_Pcdr
       latitude: 14.44608051870992
       longitude: -6.510856859385967

这样做的方法是:

        mSaveButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                //change to refDatabase or mDatabase.child("Location")
                DatabaseReference newPost = refDatabase.push();
                //the push() command is already creating unique key
                newPost.setValue(latlng);

            }
        });

从refDatabase中将标记放入地图的代码是:

@Override
public void onMapReady(GoogleMap googleMap) {
   mMap = googleMap;

   ...

   refDatabase.addChildEventListener(new ChildEventListener() {
     @Override
     public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
          LatLng newLocation = new LatLng(
                        dataSnapshot.child("latitude").getValue(Long.class),
                        dataSnapshot.child("longitude").getValue(Long.class)
                    );
          mMap.addMarker(new MarkerOptions()
              .position(newLocation)
              .title(dataSnapshot.getKey()));
     }

     @Override
     public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {}

     @Override
     public void onChildRemoved(DataSnapshot dataSnapshot) {}

     @Override
     public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}

     @Override
     public void onCancelled(DatabaseError databaseError) {}
  });
}