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

Google Maps不显示用户位置且无响应模拟器坐标的问题排查

Hey there, let's work through your Google Maps location update issue together—this is a common problem with a few straightforward fixes! Let's break down the steps to get your map focusing on the user's location and updating every 15 seconds.

解决Google Maps位置更新与镜头聚焦问题

1. 修复Nexus 5X API 26模拟器的位置模拟问题

你的猜测很准确——Nexus 5X API 26模拟器确实存在定位模拟的已知bug,试试这些解决方案:

  • 打开模拟器的扩展控制(工具栏里的三点按钮),切换到Location标签页:
    • 选择「Send a single location」输入具体经纬度,或者用「Route」模拟移动路径
    • 确认模拟器开发者选项里的「Allow mock locations」已开启(默认是开启状态,但可以再检查一遍)
  • 如果还是不行,新建一个API 26模拟器,或者切换到API 25/27版本,部分模拟器版本的定位模块存在兼容性问题
  • 也可以用adb命令强制设置位置:
    adb shell geo fix <longitude> <latitude>
    
    示例:adb shell geo fix -122.084095 37.422006(谷歌总部坐标)

2. 确认权限配置(清单文件+运行时权限)

哪怕你觉得已经配置好了Manifest,也容易漏掉细节,再核对一遍:

  • 在AndroidManifest.xml中添加必要权限:
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" /> <!-- Google Maps必须权限 -->
    
  • API 23及以上版本必须请求运行时权限,在初始化定位前添加权限检查:
    private const val LOCATION_PERMISSION_REQUEST = 1001
    
    // 启动定位前调用此方法检查权限
    private fun checkLocationPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), LOCATION_PERMISSION_REQUEST)
            return
        }
        // 权限已授权,启动定位更新
        startLocationUpdates()
    }
    
    // 处理权限申请结果
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == LOCATION_PERMISSION_REQUEST && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            startLocationUpdates()
        }
    }
    

3. 正确实现FusedLocationProviderClient与LocationCallback

你的LocationCallback可能没有正确绑定地图更新逻辑,或者LocationRequest参数配置不合理,这里提供一个完整的可运行实现:

初始化定位客户端与请求参数

private lateinit var fusedLocationClient: FusedLocationProviderClient
private lateinit var locationCallback: LocationCallback
private lateinit var locationRequest: LocationRequest
private var googleMap: GoogleMap? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_maps)

    // 初始化定位客户端
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

    // 配置15秒更新一次的定位请求
    locationRequest = LocationRequest.create().apply {
        interval = 15000 // 15秒更新间隔
        fastestInterval = 10000 // 最快更新间隔(当其他应用请求更频繁时)
        priority = LocationRequest.PRIORITY_HIGH_ACCURACY // 使用GPS获取高精度位置
    }

    // 设置定位回调,用于更新地图
    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult) {
            super.onLocationResult(locationResult)
            locationResult.lastLocation?.let { location ->
                // 更新地图镜头聚焦到当前位置
                val currentLatLng = LatLng(location.latitude, location.longitude)
                val cameraUpdate = CameraUpdateFactory.newLatLngZoom(currentLatLng, 15f)
                googleMap?.animateCamera(cameraUpdate)

                // 可选:添加当前位置标记
                googleMap?.addMarker(MarkerOptions().position(currentLatLng).title("你在这里!"))
            }
        }
    }
}

等待GoogleMap初始化完成

绝对不要在地图初始化完成前操作地图,必须通过onMapReady回调触发后续逻辑:

override fun onMapReady(map: GoogleMap) {
    googleMap = map
    // 开启「我的位置」图层(蓝色圆点)
    googleMap?.isMyLocationEnabled = true
    // 检查权限并启动定位更新
    checkLocationPermission()
}

处理getLastLocation()返回null的情况

getLastLocation()返回null是因为没有缓存的位置数据,所以不要依赖这个方法获取实时位置。requestLocationUpdates()会在获取到新位置时自动触发LocationCallback,我们的代码已经处理了这个场景。

4. 清理资源避免内存泄漏

记得在Activity销毁时移除定位回调:

override fun onDestroy() {
    super.onDestroy()
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:55:50