繁体   English   中英

Android 谷歌地图不显示来自 Firebase 的所有用户位置

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM