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



Спасибо за чтение, пожалуйста, помогите мне из.

594   1  

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

    Ничего не найдено.