更新 2
我在 Google I/O '18 上与一位 Google 工程师进行了交谈。他告诉我,我可以信任 fusedLocationProvider。如果他用新的时间戳标记最后一个已知位置,则用户可能仍在同一位置。
我想在未来用“移动”设备做一些测试来证明这个说法。
原始问题
我正在向 with 请求最后一个已知位置FusedLocationProviderClient
,getLastLocation()
并想检查最后一个已知位置是否早于 5 分钟以开始新的位置请求。
在我的测试过程中,我发现elapsedRealtimeNanos
应该用来比较的位置有一个奇怪的行为。
出于测试目的,我在一个简单的 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);
}