基于数据库经纬度在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
相关产品推荐
相关产品推荐

