Fused Location Provider - onLocationChanged перестает получать вызов

В нашем приложении мы использовали Fused Location Provider (FLP) для отслеживания местоположения. Мы заметили, что иногда приложение может попасть в состояние, когда обратный вызов местоположения перестает вызываться. Рассматриваемое приложение используется в основном на двух планшетах (Nexus 7 и LG G-Pad 8.3). Мы видели, что проблема возникла на обоих устройствах. В целом сброс устройства, похоже, решает проблему. Мы считаем, что следуем большинству передовых практик использования FLP. Но на всякий случай мы собрали этот пример кода, который иллюстрирует, как мы используем FLP.

Получите клиент API Google и вызовите connect:

m_googleApiClient = builder
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
m_googleApiClient.connect()

После подключения мы начинаем прослушивать обратные вызовы местоположения:

@Override
public void onConnected(Bundle bundle) {
    m_fusedLocationProviderApi.requestLocationUpdates(m_googleApiClient, m_locationRequest, this);
}

Запрос местоположения выглядит так:

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
    locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);

Затем мы реализуем обратный вызов следующим образом:

    @Override
public void onLocationChanged(Location location) {
   // set location member var and record timestamp.
}

Когда возникают проблемы, мы не получаем никаких обратных вызовов об ошибках. Мы попытались также вызвать reset () в клиенте Google API, когда мы обнаружили, что не получали GPS в течение длительного времени. Мы также отслеживаем доступность местоположения с помощью таймера каждые 2 секунды (используя getLocationAvailability). Обычно мы обнаруживаем, что сброс пользователем своего устройства (включение, выключение) решает проблему.

Наши вопросы:

  1. Кто-нибудь еще заметил эту проблему с FLP?
  2. Есть ли что-то еще, что мы можем сделать, чтобы решить эту проблему, за исключением сброса настроек пользователя? Удалит ли добавление помощи при добавлении обновлений местоположения?
  3. Есть ли дополнительная информация, которую мы можем / должны собрать для диагностики проблемы?

comment
У меня такая же проблема. Какую версию сервисов Google Play вы используете и какие версии ОС у вас установлены на устройствах? Интересно, имеет ли это значение?   -  person Ben Strawson    schedule 13.07.2016
comment
Я недавно начал использовать 9.2.1 и еще не заметил проблемы (скрестив пальцы).   -  person noahd    schedule 14.07.2016
comment
У меня недавно возникла точно такая же проблема. Вы видели эту проблему с тех пор, как обновили версию Google Play Service? Спасибо.   -  person Ziwei Zeng    schedule 16.08.2017
comment
Да, после обновления мы его больше никогда не видели. Я больше не работаю над этим проектом, поэтому, насколько я знаю, это может повториться снова.   -  person noahd    schedule 17.08.2017


Ответы (2)


Я активно работал с FusedLocationProvider над широким спектром устройств, как бюджетных, так и высокопроизводительных, и встречал похожие проблемы, когда данные GPS содержали плохие исправления между ними. По этой причине я внес несколько изменений, направленных на решение этих проблем, связанных с надежностью и отказоустойчивостью (как указано ниже), и после этого не замечал этих проблем.

По моему опыту, возможные решения таких проблем:

  1. # P3 #
    # P4 #
  2. # P5 #
    # P6 #
  3. # P7 #
    # P8 #

Помимо этого, есть еще одна причина, которая может быть причиной этой проблемы:

Исправление GPS устройства потеряно. Бывают случаи, когда устройство теряет привязку GPS, что приводит к отсутствию данных GPS до тех пор, пока оно не сможет вернуть исправление GPS. Нет абсолютно никакого способа определить, было ли местоположение потеряно из-за исправления GPS. Сброс настроек местоположения устройства влияет на то, что устройство пытается исправить GPS, что, возможно, также может быть причиной здесь.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я разработчик Android @ HyperTrack и мы разрабатываем стек местоположения для разработчиков, которые создают функции определения местоположения в своих приложениях, и это те проблемы, которые мы решаем. Было бы здорово протестировать аналогичные сценарии с помощью нашего SDK. и если вы все еще видите проблему, мы будем рады помочь вам найти ее первопричину и устранить проблему.

person Piyush Gupta    schedule 04.09.2017
comment
Я ценю подробный ответ! - person noahd; 06.09.2017

Вы можете попробовать проверить LocationSettings следующим образом:

    request = LocationRequest.create();
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(request);
    builder.setAlwaysShow(true);
    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(apiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(@NonNull LocationSettingsResult result) {
            final Status status = result.getStatus();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener);
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        status.startResolutionForResult(context, REQUEST_CODE);
                    } catch (IntentSender.SendIntentException e) {}
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    break;
            }
        }
    });

затем обработать запрос настроек в onActivityResult

switch (requestCode) {
    case REQUEST_CODE:
      switch (resultCode) {
        case Activity.RESULT_OK:
        // All required changes were successfully made
        LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener);
        break;
        case Activity.RESULT_CANCELED:
        // The user was asked to change settings, but chose not to
        break;
        default:
        break;
      }
    break;
}

Если не помогло, попробуйте понизить версию google-play-services.

person Aidar Dauylbai    schedule 30.05.2016
comment
Да, я знаю об этой проверке настроек. Я не думаю, что есть проблема с настройками ... Я действительно получаю обратный вызов большую часть времени. Проблема в том, что иногда мы попадаем в состояние, когда обратный вызов перестает выполняться, и устройство необходимо перезагрузить, чтобы снова начать его получать. - person noahd; 31.05.2016