Man*_*eko 5 location google-api android-fusedlocation fusedlocationproviderclient
如何强制 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())
Run Code Online (Sandbox Code Playgroud)
当我获取请求位置时,即使相隔几秒,它也会为我提供具有相同时间戳的相同位置。
我使用带有 GPX 记录轨迹的模拟器,这样 GPS 读数始终可用。
但是,当我尝试向位置管理器请求位置(并对结果不执行任何操作)时,效果要好得多。
(context?.getSystemService(Context.LOCATION_SERVICE) as? LocationManager)?
.requestSingleUpdate(
LocationManager.GPS_PROVIDER,
object :LocationListener{...dummy, just log the callback...},
Looper.getMainLooper())
Run Code Online (Sandbox Code Playgroud)
结论:FusedLocationProviderClient 不会向操作系统请求新位置,即使在高优先级模式下也是如此。然而,如果外部有可用的位置,它确实接受新位置。
问题是:当我现在需要新位置时,如何强制FusedLocationProviderClient 主动请求新位置?
这个问题已经很老了,但我带着类似的问题来到这里,我看到过去几个月还有大约 65 个其他人提出了这个问题。以下代码有效。它在 locationResult.getLastLocation() 处向 onLocationResult 回调传递一个位置:
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());
Run Code Online (Sandbox Code Playgroud)
}
这里的区别是我删除了setMaxWaitTime和setExpirationDuration。显然他们挂断了电话。如果我正确解释 setExpirationDuration,则意味着此请求应在 x 毫秒内过期。将其设置为零意味着请求立即过期,因此当位置确实可用时,请求已经过期。因此不会回调 onLocationChanged。
我希望这对某人有帮助。