【发布时间】:2018-08-08 14:57:00
【问题描述】:
更新 2
我在 Google I/O '18 上与一位 Google 工程师进行了交谈。他告诉我,我可以信任 fusedLocationProvider。如果他用新的时间戳标记最后一个已知位置,则用户可能仍在同一位置。
我想在未来用“移动”设备做一些测试来证明这个说法。
原始问题
我正在向FusedLocationProviderClient 和getLastLocation() 请求最后一个已知位置,并想检查最后一个已知位置是否早于 5 分钟以开始新的位置请求。
在我的测试中,我发现elapsedRealtimeNanos 的位置有一个奇怪的行为,应该用于compare。
出于测试目的,我在一个简单的 Java 线程中每秒请求最后一个已知位置。收到位置后,我检查 elapsedRealtimeNanos 并将它们与SystemClock.elapsedRealtimeNanos() 进行比较。在大多数情况下,最后一个已知位置的年龄也设置为SystemClock.elapsedRealtimeNanos(),因此差值几乎为 0。这意味着,FusedLocationProvider 告诉我最后一个已知位置的修复是现在,这会进行年龄检查不可靠。
这种行为已经够奇怪了,但越来越严重。
当我在测试期间启动并行位置请求或启动 Google 地图时,最后一个已知位置的 elapsedRealtimeNanos 将停止增长,并且仅在找到“真实”新位置时更新到较新的时间。这应该是我所期望的默认行为。
我在 HIGH_ACCURACY 和 SENSORS_ONLY 等不同的位置设置中观察到了这种行为。
这是否意味着不可能检查最后一个已知位置的年龄?谁能解释一下这种行为?
更新 1
与location.getTime() 的行为相同
代码片段:
@Override void getLastKnownLocation() {
try {
mLocationClient.getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
try {
Location location = task.getResult();
if (location != null) {
location.getElapsedRealtimeNanos()
//Compare to SystemClock.elapsedRealtimeNanos();
...
而且(我知道它很乱)
new Thread(){
@Override public void run() {
locationFinder.getLastKnownLocation();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
run();
}
}.start();
位置更新请求
public PlayServicesLocationFinder(Context context){
mLocationClient = LocationServices.getFusedLocationProviderClient(context);
}
@Override
public void getLocationUpdates() {
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setInterval(60000);
locationRequest.setFastestInterval(15000);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationClient.requestLocationUpdates(locationRequest, continuousUpdatesLocationListener, null);
}
【问题讨论】:
-
getTime()的情况是否相同? -
@TpoM6oH 不幸的是,我更新了我的问题。
-
你如何开始你的服务?
-
@TpoM6oH
PlayServicesLocationFinder在我的应用程序的应用程序类中有一个静态属性,以启动我调用getLocationUpdates的位置更新(请参阅更新问题)
标签: android location google-play-services android-fusedlocation fusedlocationproviderclient