[英]Android google maps not displaying all users location from Firebase
我创建了一个谷歌地图活动来显示 Firebase 实时数据库中所有用户的位置。 问题是它只显示数据库中的一个用户。 我什至尝试过硬编码两个不同的经纬度并将它们添加到标记中,然后将标记添加到 map 并且只再次出现一个标记。 我不确定我是否做错了什么。 有人可以帮忙吗。
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();
}
}
}
经过大量调查,我找到了解决这个问题的方法。 有人可能会注意到,如果您硬编码两个不同的纬度和经度并将它们添加到标记,然后添加到 map,它将显示两个标记。 下一步是从实时数据库中读取数据并为 map 上的用户添加标记。 问题是我在家里编码,所以我所有的用户都有相同的位置。 map 在我的位置只显示一个标记的原因是因为它们都相互重叠。 解决方案是查看标记是否存在于同一位置,您可以通过简单的 if 语句执行此操作。 如果语句正确,您可以稍微移动下一个标记。 另一种解决方案是显示一组标记。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.