You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于数据库经纬度在Google Map添加Marker不显示问题求助

Google Map无法显示数据库获取的位置标记排查

我需要用从数据库获取的纬度(latitude)和经度(longitude)在Google Map上添加标记,但标记始终不显示。已经确认能正常获取位置数据,求帮忙排查代码问题。

我的Java代码

public class PassengerMainscreen_Activity extends AppCompatActivity implements OnMapReadyCallback {

    boolean isPermissionGranted;
    TextView textView;
    DatabaseReference firebaseDatabase;
    GoogleMap googleMap;
    Marker marker;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_passenger_mainscreen);

        checkpermission();
        textView = findViewById(R.id.LocEmpty);

        //CHECKING GOOGLE PLAY SERVICES
        if (isPermissionGranted) {
            if (checkGooglePlayServices()) {
                SupportMapFragment supportMapFragment = SupportMapFragment.newInstance();
                getSupportFragmentManager().beginTransaction().add(R.id.CONTAINER, supportMapFragment).commit();
                supportMapFragment.getMapAsync(this);
            } else {
                Toast.makeText(this, "Google Play Services Not available", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private boolean checkGooglePlayServices() {
        GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
        int result = googleApiAvailability.isGooglePlayServicesAvailable(this);
        if (result == ConnectionResult.SUCCESS) {
            return true;
        } else if (googleApiAvailability.isUserResolvableError(result)) {
            Dialog dialog = googleApiAvailability.getErrorDialog(this, result, 201, new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    Toast.makeText(PassengerMainscreen_Activity.this, "User Cancelled Dialog", Toast.LENGTH_SHORT).show();
                }
            });
            dialog.show();
        }
        return false;
    }

    private void checkpermission() {
        Dexter.withContext(this).withPermission(Manifest.permission.ACCESS_FINE_LOCATION).withListener(new PermissionListener() {
            @Override
            public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
                isPermissionGranted = true;
                Toast.makeText(PassengerMainscreen_Activity.this, "Permission Granted", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", getPackageName(), "");
                intent.setData(uri);
                startActivity(intent);
            }

            @Override
            public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
                permissionToken.continuePermissionRequest();
            }
        }).check(); //PERMISSION END
    }

    @Override
    public void onMapReady(@NonNull GoogleMap googleMap) {
        this.googleMap = googleMap;


        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        googleMap.setMyLocationEnabled(true);

      getbusLocation();
      
    }

    private void getbusLocation() {

        firebaseDatabase = FirebaseDatabase.getInstance().getReference().child("Location");
        firebaseDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                Double lat = Double.valueOf(snapshot.child("latitude").getValue().toString());
                Double lng = Double.valueOf(snapshot.child("longitude").getValue().toString());
                textView.setText(lat + "," + lng);

                // DISPLAYING MARKER ON THE MAP
                LatLng loc = new LatLng(lat, lng);
                MarkerOptions markerOptions = new MarkerOptions();
                markerOptions.position(loc);
                marker = googleMap.addMarker(markerOptions);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

}

排查关键点

  • 权限与地图初始化时机错误:checkpermission是异步操作,onCreate中直接判断isPermissionGranted时,权限还没申请完成,导致地图Fragment未被添加,onMapReady不会触发。需将地图初始化逻辑移到onPermissionGranted回调内:
    @Override
    public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
        isPermissionGranted = true;
        Toast.makeText(PassengerMainscreen_Activity.this, "Permission Granted", Toast.LENGTH_SHORT).show();
        // 权限通过后再初始化地图
        if (checkGooglePlayServices()) {
            SupportMapFragment supportMapFragment = SupportMapFragment.newInstance();
            getSupportFragmentManager().beginTransaction().add(R.id.CONTAINER, supportMapFragment).commit();
            supportMapFragment.getMapAsync(PassengerMainscreen_Activity.this);
        } else {
            Toast.makeText(PassengerMainscreen_Activity.this, "Google Play Services Not available", Toast.LENGTH_SHORT).show();
        }
    }
    
  • 地图容器布局问题:检查布局文件中R.id.CONTAINER是否为有效容器(如FrameLayout),且尺寸设置为match_parent,避免地图无显示空间。
  • 未调整地图视角到标记位置:添加标记后,地图可能停留在默认位置,导致标记不在视野内。添加标记后调用:
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(loc, 15f));
    
  • 数据转换存在空指针风险:直接转换数据库值可能因字段为空或格式错误抛出异常,需先判断非空:
    Object latObj = snapshot.child("latitude").getValue();
    Object lngObj = snapshot.child("longitude").getValue();
    if (latObj != null && lngObj != null) {
        Double lat = Double.parseDouble(latObj.toString());
        Double lng = Double.parseDouble(lngObj.toString());
        // 后续标记逻辑
    }
    
  • 重复添加标记优化:数据库更新时会重复添加标记,建议先移除旧标记:
    if (marker != null) {
        marker.remove();
    }
    marker = googleMap.addMarker(markerOptions);
    

内容的提问来源于stack exchange,提问作者prince

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:55:22