Fused Location Provider-onLocationChanged перестает вызываться

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

получите клиент Google api и вызовите 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. там больше информации мы можем / должны собрать для диагностики проблемы?

2 ответов


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

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

  1. обновление Play services: Я использовал версии сервисов Android Play в диапазоне 7.x-8.x, когда у меня были эти проблемы.

    соль: в недавнем прошлом, обновление до 10.x версии play services помогли в решении проблем. Мы не видели этих проблем после обновления, так что это определенно может быть одной из причин в вашем случае.

  2. сделать Android Сервис более надежным и надежным: Это одна из основных причин, по которой мы видели отключения в данных GPS, и при перезапуске устройства или повторной инициализации установки мы обычно перезапускаем службу. И, следовательно, служба, запускающая обратно, может возобновить обновление местоположения до нормального.

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

  3. повторное подключение GoogleAPIClient при приостановке/ошибке подключения Я видел ситуации, когда соединение GoogleAPIClient приостанавливается или возвращает ошибку из-за плохих сетевых условий или других причин. Хотя я не смог проверить прямое влияние этого на потерю данных о местоположении, это вполне может быть причиной в этом случае. Чтобы поддержать это, сброс обновлений местоположения не удастся в случае, если эта проблема подключения GoogleAPIClient происходит, и это то, что было замечено вами.

    соль: простое повторное подключение GoogleAPIClient при приостановке или ошибке может решить эту проблему.

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

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

отказ от ответственности: Я разработчик Android @ HyperTrack и мы разрабатываем стек местоположения для разработчиков, которые строят функции местоположения в своих приложениях, и это те проблемы, которые мы решаем. Было бы здорово для вас, чтобы проверить аналогичные сценарии, используя наш SDKs и в случае, если вы все еще видите вопрос, мы будем рады помочь вам в получении его причину и исправить проблему.


вы можете попробовать, чтобы проверить представление возвращает такой:

    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.