【问题标题】:Android google maps not displaying all users location from FirebaseAndroid 谷歌地图不显示来自 Firebase 的所有用户位置
【发布时间】: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


【解决方案1】:

经过大量调查,我找到了解决这个问题的方法。有人可能会注意到,如果您对两个不同的经纬度进行硬编码并将它们添加到标记中,然后添加到地图中,它将同时显示两个标记。下一步是从实时数据库中读取数据并为地图上的用户添加标记。问题是我在家里编码,所以我所有的用户都有相同的位置。地图只在我的位置显示一个标记的原因是它们都相互重叠。解决方案是查看标记是否存在于同一位置,您可以通过简单的 if 语句来执行此操作。如果语句正确,您可以稍微移动下一个标记。另一种解决方案是显示一组标记。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2017-08-29
    相关资源
    最近更新 更多