我正在尝试创建应用程序,以便在按下保存按钮时在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
答案 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) {}
});
}