如何基于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
相关产品推荐
相关产品推荐

