gpt4 book ai didi

google-api - Android FusedLocationClient 不请求新样本

转载 作者:行者123 更新时间:2023-12-02 02:55:47 26 4
gpt4 key购买 nike

如何强制 FusedLocationProviderClient 显式请求新位置?

几个月前,我升级了 FusedLocationProviderClient。从那以后,请求采样新位置将不会提供新位置。

// Request a single location. 
// Note: FusedLocationProviderClient.lastLocation
// is no better
val request = LocationRequest()
.setNumUpdates(1)
.setExpirationDuration(0)
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setMaxWaitTime(10*DateUtils.SECOND_IN_MILLIS)
.setFastestInterval(0)
fusedLocationClient?.requestLocationUpdates(request, object:LocationCallback() {
override fun onLocationResult(result: LocationResult?) {
super.onLocationResult(result)
Log.v(LOG_TAG, "Single fused location request yields ${result?.lastLocation} ")
callOnDone(result?.lastLocation)
}
}, Looper.getMainLooper())

当我获得请求位置时,即使相隔几秒钟,它也会为我提供具有相同时间戳的相同位置。

我使用带有 GPX 轨迹记录的模拟器,以便 GPS 读数始终可用。

但是,当我尝试从位置管理器请求一个位置(并且对结果不做任何操作)时,它的效果要好得多。

(context?.getSystemService(Context.LOCATION_SERVICE) as? LocationManager)?
.requestSingleUpdate(
LocationManager.GPS_PROVIDER,
object :LocationListener{...dummy, just log the callback...},
Looper.getMainLooper())

结论:FusedLocationProviderClient 不会从操作系统请求新位置,即使在高优先级模式下也是如此。但是,如果外部有可用位置,它确实会接受新位置。

问题是:当我现在需要一个新位置时,如何强制 FusedLocationProviderClient 主动请求一个新位置?

最佳答案

这个问题已经很老了,但我带着类似的问题来到这里,我看到在过去的几个月里,大约有 65 个其他人提出了这个问题。以下代码有效。它提供了一个位置到 onLocationResult 回调,在 locationResult.getLastLocation():

   public void getNewLocation() {
LocationRequest locationRequest = new LocationRequest()
.setNumUpdates(1)
.setFastestInterval(0)
.setSmallestDisplacement(0)
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (ActivityCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
fusedLocationProviderClient.requestLocationUpdates(locationRequest,
new com.google.android.gms.location.LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
locationListener.onLocationChanged(locationResult.getLastLocation());
}
},
Looper.getMainLooper());

这里的区别是我删除了 setMaxWaitTimesetExpirationDuration .显然他们中断了通话。如果我解释setExpirationDuration 正确,这意味着这个请求应该在x 毫秒。将其设置为零意味着请求立即过期,因此当 Location 确实可用时,请求已经过期。因此没有回调到 onLocationChanged。

我希望这对某些人有帮助。

关于google-api - Android FusedLocationClient 不请求新样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49491554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com