mar*_*n91 8 android location google-play-services android-fusedlocation fusedlocationproviderclient
我在 Google I/O '18 上与一位 Google 工程师进行了交谈。他告诉我,我可以信任 fusedLocationProvider。如果他用新的时间戳标记最后一个已知位置,则用户可能仍在同一位置。
我想在未来用一个“移动”的设备做一些测试来证明这个说法。
我正在从FusedLocationProviderClientwith请求最后一个已知位置,getLastLocation()并想检查最后一个已知位置是否早于 5 分钟以开始新的位置请求。
在我的测试过程中,我发现了一个奇怪的行为与elapsedRealtimeNanos应该用来比较的位置。
出于测试目的,我在一个简单的 Java 线程中每秒请求最后一个已知位置。收到位置后,我检查 elapsedRealtimeNanos 并将它们与SystemClock.elapsedRealtimeNanos(). 在大多数情况下,最后一个已知位置的年龄也设置SystemClock.elapsedRealtimeNanos()为,因此差异接近 0。这意味着 FusedLocationProvider 告诉我最后一个已知位置的修复是现在,这使得年龄检查不可靠。
这种行为很奇怪,但它变得更糟。
当我在测试会话期间启动并行位置请求或启动 Google 地图时,elapsedRealtimeNanos最后一个已知位置的位置停止增长,只有在找到“真实”新位置时才会更新到更新的时间。这应该是我期望的默认行为。
我在 HIGH_ACCURACY 和 SENSORS_ONLY 等不同的位置设置中观察到了这种行为。
这是否意味着检查最后一个已知位置的年龄是不可能的?任何人都可以解释这种行为吗?
相同的行为 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();
...
Run Code Online (Sandbox Code Playgroud)
和(我知道它很乱)
new Thread(){
@Override public void run() {
locationFinder.getLastKnownLocation();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
run();
}
}.start();
Run Code Online (Sandbox Code Playgroud)
位置更新请求
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);
}
Run Code Online (Sandbox Code Playgroud)
有一种方法可以解决此要求。您将使用updatedLocation 计算savedLocation,是否存储新位置。有两个属性可以帮助您完成此计算。
首先,您必须存储位置返回
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
Run Code Online (Sandbox Code Playgroud)
然后将其与下一个获取的位置进行比较(这两个属性都会为您提供更好的跟踪来管理设备位置更新),然后决定是否应将新获取的位置替换为存储的位置。为此,您已经编写了逻辑,我想我可以分享一些可以帮助您的代码。
private boolean isTimeToUpdateLocation(Location newlocation) {
int LOCATION_ALERT_FREQUENCY = 60000; //1 * 60000; // 1 minute
long timeDelta = System.currentTimeMillis() - newlocation.getTime();
return (timeDelta >= LOCATION_ALERT_FREQUENCY);
}
Run Code Online (Sandbox Code Playgroud)
有一小段关于距离的位置更新的代码
int LOCATION_DEVIATION = 1000; // 1 KM
public boolean shouldUpdateNewLocation(Location location) {
Location prevLocation = getLastStoredLocation();
boolean shouldUpdateToServer = false;
if (prevLocation != null) {
if (prevLocation.distanceTo(location) > LOCATION_DEVIATION)
shouldUpdateToServer = true;
}
return shouldUpdateToServer;
}
Run Code Online (Sandbox Code Playgroud)
我希望您现在可以解决您面临的问题。
| 归档时间: |
|
| 查看次数: |
5392 次 |
| 最近记录: |