在特定时间内获得最佳位置
Get best possible location in certain time
在我的应用程序中,我需要获取用户位置(一次拍摄,而不是连续跟踪),以计算路线。所以位置需要尽可能准确,但我不想让用户在我的应用程序尝试获取准确位置时等待太久。
我正在使用 Google 播放服务位置 api,如下所示:
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setNumUpdates(1);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest, this);
mLocationHandler.sendEmptyMessageDelayed(0, 15000); // Time out location request
我有 Handler mLocationHandler,它会在 15 秒后取消 locationRequest,因为我不想让用户等待太久。
有什么办法,如果高精度定位超时,我该如何尝试获得不太准确的位置?
超时后可以试试,
Location currentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
它会给你最后一个已知位置,并检查准确度是否比你从位置更新中得到的更好。
像这样更新您的更新:
final LocationRequest REQUEST = LocationRequest.create()
.setInterval(16)
.setFastestInterval(16) // 16ms = 60fps
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
这将确保您获得更新。然后,您可以将超时时间减少到不超过一秒就足够了。然后你可以像这样删除位置更新请求:
if(mGoogleApiClient.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);
}
为此我使用了外部库:Android-ReactiveLocation。检查 Cooler examples
部分,它准确地显示了您想要的内容:
LocationRequest req = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setExpirationDuration(TimeUnit.SECONDS.toMillis(LOCATION_TIMEOUT_IN_SECONDS))
.setInterval(LOCATION_UPDATE_INTERVAL);
Observable<Location> goodEnoughQuicklyOrNothingObservable = locationProvider.getUpdatedLocation(req)
.filter(new Func1<Location, Boolean>() {
@Override
public Boolean call(Location location) {
return location.getAccuracy() < SUFFICIENT_ACCURACY;
}
})
.timeout(LOCATION_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS, Observable.just((Location) null), AndroidSchedulers.mainThread())
.first()
.observeOn(AndroidSchedulers.mainThread());
goodEnoughQuicklyOrNothingObservable.subscribe(...);
在我的应用程序中,我需要获取用户位置(一次拍摄,而不是连续跟踪),以计算路线。所以位置需要尽可能准确,但我不想让用户在我的应用程序尝试获取准确位置时等待太久。
我正在使用 Google 播放服务位置 api,如下所示:
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setNumUpdates(1);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest, this);
mLocationHandler.sendEmptyMessageDelayed(0, 15000); // Time out location request
我有 Handler mLocationHandler,它会在 15 秒后取消 locationRequest,因为我不想让用户等待太久。
有什么办法,如果高精度定位超时,我该如何尝试获得不太准确的位置?
超时后可以试试,
Location currentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
它会给你最后一个已知位置,并检查准确度是否比你从位置更新中得到的更好。
像这样更新您的更新:
final LocationRequest REQUEST = LocationRequest.create()
.setInterval(16)
.setFastestInterval(16) // 16ms = 60fps
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
这将确保您获得更新。然后,您可以将超时时间减少到不超过一秒就足够了。然后你可以像这样删除位置更新请求:
if(mGoogleApiClient.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);
}
为此我使用了外部库:Android-ReactiveLocation。检查 Cooler examples
部分,它准确地显示了您想要的内容:
LocationRequest req = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setExpirationDuration(TimeUnit.SECONDS.toMillis(LOCATION_TIMEOUT_IN_SECONDS))
.setInterval(LOCATION_UPDATE_INTERVAL);
Observable<Location> goodEnoughQuicklyOrNothingObservable = locationProvider.getUpdatedLocation(req)
.filter(new Func1<Location, Boolean>() {
@Override
public Boolean call(Location location) {
return location.getAccuracy() < SUFFICIENT_ACCURACY;
}
})
.timeout(LOCATION_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS, Observable.just((Location) null), AndroidSchedulers.mainThread())
.first()
.observeOn(AndroidSchedulers.mainThread());
goodEnoughQuicklyOrNothingObservable.subscribe(...);