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

使用Google Maps显示用户当前位置时标记不显示的技术求助

解决Google Maps当前位置标记不显示的问题

我之前做地图应用时也碰到过一模一样的问题,标记死活不出来,后来排查出几个常见的坑,你可以照着一步步检查:

1. 权限没处理到位(最常见的原因)

Android 6.0以后位置权限是危险权限,光在Manifest里加还不够,必须动态申请用户授权:

  • 先确认AndroidManifest.xml里已经加了这两个权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  • 然后在MainActivity里加权限申请的逻辑,比如:
private static final int LOCATION_PERMISSION_REQUEST = 100;

private void checkLocationPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                LOCATION_PERMISSION_REQUEST);
    } else {
        // 权限拿到了,去获取位置
        fetchCurrentLocation();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == LOCATION_PERMISSION_REQUEST) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            fetchCurrentLocation();
        } else {
            Toast.makeText(this, "不给位置权限的话,没法显示你的位置哦", Toast.LENGTH_SHORT).show();
        }
    }
}

2. 位置服务没开

用户的手机可能把GPS/位置服务关了,这时候根本拿不到位置,自然加不了标记。可以加个判断,引导用户开启:

private boolean isLocationServiceEnabled() {
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
            locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

然后在fetchCurrentLocation开头加:

if (!isLocationServiceEnabled()) {
    Intent openSettings = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(openSettings);
    Toast.makeText(this, "先把位置服务打开哈", Toast.LENGTH_SHORT).show();
    return;
}

3. 标记加早了(地图还没加载好)

一定要等地图初始化完成后再加标记,也就是在onMapReady回调里处理:

private GoogleMap mMap;

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    // 先检查权限,再拿位置加标记
    checkLocationPermission();
}

4. 获取位置的逻辑有问题

用FusedLocationProviderClient拿位置时,要处理位置为空的情况(比如刚开机没定位到),还有失败的回调:

private void fetchCurrentLocation() {
    FusedLocationProviderClient locationClient = LocationServices.getFusedLocationProviderClient(this);
    locationClient.getLastLocation()
            .addOnSuccessListener(location -> {
                if (location != null) {
                    // 拿到位置了,加标记!
                    LatLng myLocation = new LatLng(location.getLatitude(), location.getLongitude());
                    mMap.addMarker(new MarkerOptions()
                            .position(myLocation)
                            .title("我在这!")
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                    // 把地图移到当前位置,缩放级别15刚好
                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 15));
                } else {
                    Toast.makeText(this, "暂时拿不到位置,试试走动一下或者等几秒", Toast.LENGTH_SHORT).show();
                }
            })
            .addOnFailureListener(e -> {
                Toast.makeText(this, "获取位置出错了:" + e.getMessage(), Toast.LENGTH_SHORT).show();
            });
}

你可以照着上面的步骤一步步排查,大概率是权限或者位置服务的问题,先从这两个入手!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:16:35