Fused Location Provider: есть ли способ проверить, не произошло ли обновление местоположения?
Введение
В моем приложении я хочу получить одноразовое точное местоположение, где в данный момент находится пользователь. Когда я использовал FusedLocationProviderApi.getLastLocation иногда это будет нулевое или устаревшее местоположение, потому что я обнаружил, что это просто получает кэшированное местоположение и не запрашивает новое обновление местоположения.
Решение состояло в том, чтобы запросить обновление местоположения только один раз, как показано ниже.
LocationRequest locationRequest = LocationRequest.create()
.setNumUpdates(1)
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(0);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest,this)
Теперь я все время получаю более точное местоположение.
Мой Вопрос
Как я могу определить, не произошло ли обновление местоположения? Поскольку я прошу только 1.
При получении обновления местоположения этот обратный вызов вызывается
@Override
public void onLocationChanged(Location location) {
}
Однако это не вызывается, если обновление местоположения не удалось.
Что я пробовал
Я видел, что был ResultCallback. Однако onSuccess, похоже, всегда вызывается, даже если обновление одноразового расположения не удалось.
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest,this).setResultCallback(new ResultCallbacks<Status>() {
@Override
public void onSuccess(@NonNull Status status) {
DebugUtils.log("requestLocationUpdates ResultCallback onSuccess + " + status.toString(),true,true);
}
@Override
public void onFailure(@NonNull Status status) {
DebugUtils.log("requestLocationUpdates ResultCallback onFailure + " + status.toString(),true,true);
}
});
Другое
Используя com.google.android.gms:play-services-location:8.4.0
Спасибо за чтение, пожалуйста, помогите мне из.
1 ответ:
Покопавшись еще немного в API и проведя несколько тестов, я нашел решение своей проблемы, которое, похоже, работает.
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, new LocationCallback() { @Override public void onLocationResult(LocationResult result) { DebugUtils.log("onLocationResult"); } @Override public void onLocationAvailability(LocationAvailability locationAvailability) { DebugUtils.log("onLocationAvailability: isLocationAvailable = " + locationAvailability.isLocationAvailable()); } }, null);Вместо использования
LocationListener. Я использовалLocationCallback
onLocationResultвызывается только для предоставления последнего результата определения местоположения на основеLocationRequest. Он не вызывается, если местоположение не может быть предоставлено, и во время моих тестов это не так, когда местоположение было отключено и GPS использовался в помещении и т. д. Пожалуйста, позвонитеresult.getLastLocation(), чтобы получить фактическое местоположение объекта.
onLocationAvailablityесть всегда вызывать.locationAvailability.isLocationAvailable()возвращает true, если местоположение устройства известно и достаточно актуально в пределах подсказок, запрошенных активным LocationRequests. False возвращается, если ошибка определения местоположения может быть вызвана рядом причин, включая отключенные настройки местоположения или невозможность получения данных датчика в среде устройства.Я протестировал без услуг определения местоположения, GPS только в помещении. В каждом случае я удалил всю существующую историю расположения (чтобы предотвратить кэширование пункты назначения). Всегда возвращалось точное актуальное местоположение.
Могут ли другие поручиться за это? Примечание: последний параметр для вызоваrequestLocationUpdates- это петлитель. Передача значения null означает, что он будет использовать очередь сообщений вызывающего потока.
Comments