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

如何基于FusedLocationProvider实现请求式位置持续更新

实现持续位置更新的方案

你当前代码里的lastLocation只能获取设备最后记录的位置,要实现持续获取实时位置,需要通过位置请求回调的方式实现,以下是具体修改步骤:

1. 定义位置请求配置与回调接收器

先创建LocationRequest来设置更新频率、精度等参数,再实现LocationCallback来接收每次的位置更新:

private lateinit var locationRequest: LocationRequest
private lateinit var locationCallback: LocationCallback

private fun initLocationUpdateConfig() {
    // 配置位置更新参数
    locationRequest = LocationRequest.create().apply {
        interval = 10000 // 常规更新间隔(毫秒)
        fastestInterval = 5000 // 最快更新间隔(毫秒,避免频繁更新)
        priority = LocationRequest.PRIORITY_HIGH_ACCURACY // 高精度模式,适合实时定位
    }

    // 定义位置更新回调
    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult) {
            super.onLocationResult(locationResult)
            locationResult.lastLocation?.let { currentLocation ->
                // 在这里处理实时获取到的位置
                Toast.makeText(this@YourActivity, "当前位置:${currentLocation.latitude}, ${currentLocation.longitude}", Toast.LENGTH_SHORT).show()
            } ?: run {
                Toast.makeText(this@YourActivity, "无法获取当前位置", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

2. 修改原方法,启动持续位置更新

在权限和位置服务验证通过后,启动位置更新请求:

private fun getCurrentLocation() {
    if(checkPermissions()){
        if(isLocationEnabled()){
            if (ActivityCompat.checkSelfPermission(
                    this,
                    Manifest.permission.ACCESS_FINE_LOCATION
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                requestPermissions()
                return
            }
            // 初始化配置并启动持续更新
            initLocationUpdateConfig()
            fusedLocationProviderClient.requestLocationUpdates(
                locationRequest,
                locationCallback,
                Looper.getMainLooper() // 指定回调在主线程执行
            )
        }
        else{
            Toast.makeText(this, "请打开位置服务", Toast.LENGTH_SHORT).show()
            val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
            startActivity(intent)
        }
    }
    else{
        requestPermissions()
    }
}

3. 停止位置更新(关键)

在页面销毁或不需要定位时,一定要停止更新,避免浪费电量和资源:

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

额外注意事项

  • 确保AndroidManifest.xml中已添加必要权限:
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 若需后台持续定位,Android 10+ 需添加以下权限 -->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    
  • 根据业务需求调整interval和fastestInterval,间隔过短会显著增加电量消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:33:30