【发布时间】:2020-12-24 11:14:00
【问题描述】:
我创建了一个谷歌地图活动来显示 Firebase 实时数据库中所有用户的位置。问题是它只显示数据库中的一个用户。我什至尝试过硬编码两个不同的经纬度并将它们添加到标记中,然后将标记添加到地图中,并且只再次出现一个标记。我不确定我是否做错了什么。有人可以帮忙吗。
public class ShowUsersOnMap extends FragmentActivity implements OnMapReadyCallback {
Location currentLocation;
FusedLocationProviderClient fusedLocationProviderClient;
private static final int REQUEST_CODE = 101;
private FirebaseAuth mAuth = FirebaseAuth.getInstance();
private String userID = mAuth.getCurrentUser().getUid();
private ArrayList<User> users = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_users_on_map);
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
fetchLastLocation();
//listOfUsers();
}
public void fetchLastLocation() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
return;
}
Task<Location> task = fusedLocationProviderClient.getLastLocation();
task.addOnSuccessListener(location -> {
if (location != null) {
currentLocation = location;
Log.i("LAT", String.valueOf(currentLocation.getLatitude()));
Log.i("LAT", String.valueOf(currentLocation.getLongitude()));
SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
assert supportMapFragment != null;
supportMapFragment.getMapAsync(ShowUsersOnMap.this);
}
});
}
@Override
public void onMapReady(GoogleMap googleMap) {
//first lets print the current user logged in
// DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("User").child(userID);
// databaseReference.addValueEventListener(new ValueEventListener() {
// @Override
// public void onDataChange(@NonNull DataSnapshot snapshot) {
// User user = snapshot.getValue(User.class);
// LatLng latLng = new LatLng(user.getLatitude(), user.getLongitude());
// MarkerOptions markerOptions = new MarkerOptions().position(latLng).title("My Position");
// googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
// googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 5));
// googleMap.addMarker(markerOptions);
// }
//
// @Override
// public void onCancelled(@NonNull DatabaseError error) {
// Toast.makeText(ShowUsersOnMap.this, "Error Occurred: " + error.getMessage(), Toast.LENGTH_SHORT).show();
// }
// });
//now lets print all the other users in the database
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("User");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot userSnapshot : snapshot.getChildren()) {
User user = userSnapshot.getValue(User.class);
assert user != null;
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(user.getLatitude(), user.getLongitude()))
.anchor(0.5f, 0.5f)
.title(user.getUserName()));
// LatLng latLng = new LatLng(user.getLatitude(), user.getLongitude());
// MarkerOptions markerOptions = new MarkerOptions().position(latLng).title(user.getUserName());
// googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
// googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 5));
// googleMap.addMarker(markerOptions);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(ShowUsersOnMap.this, "Error Occurred: " + error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
fetchLastLocation();
}
}
}
【问题讨论】:
-
正如您在上面的方法 onMapReady 中看到的那样,我已经注释掉了其他 2 次尝试,但我无法从逻辑上看出它们有什么问题:(
-
我注意到的一件事是,如果我进入 firebase 并将 lat 和 long 更改为不同的位置,它就会显示地图上的所有标记
-
不可能有相同的经纬度并全部显示吗?
标签: java android firebase-realtime-database