Запрос LocationManagerLocationUpdates minTime OR minDistance

Я использую Android LocationManager и его метод requestLocationUpdates следующим образом:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 10, this);

Как я выяснил, для обновления местоположения должны быть выполнены оба условия minTime и minDistance, но мне нужно получать обновление каждые 3 секунды или 10 метров.

Я попытался поставить 2 запроса следующим образом:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, this);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 10, this);

но это не работает, я получаю обновление только каждые 10 метров с этим кодом, а не каждые 3 секунды.

Я работаю с API19, если это имеет значение.


person Matej    schedule 01.11.2017    source источник


Ответы (2)


Документация по requestLocationUpdate() говорит:

requestLocationUpdates (поставщик строк, long minTime, float minDistance, прослушиватель LocationListener)

Зарегистрируйтесь для получения обновлений местоположения с помощью указанного поставщика и ожидаемого намерения.

Так что вы должны называть это как locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 10, this);

Но если вы установите для minTime значение 0, он будет вызываться один раз при первом получении обновления местоположения, а затем не будет вызываться, пока вы не измените свое положение в счетчиках minDistance.

Ссылка на документацию для справки

ИЗМЕНИТЬ

Согласно обсуждению с @Matej Мне нужно получать обновления каждые 10 метров, даже если это произошло менее чем за 3 секунды, и обновлять каждые 3 секунды, даже если местоположение не изменилось более чем на 10 метров

Если вы хотите регулярно выполнять requestLocationUpdates, вам следует использовать Timer и TimerTask, а requestLocationUpdates запускать каждые 3 секунды.

расписание (задача TimerTask, длительная задержка, длительный период)

Планирует указанную задачу для повторного выполнения с фиксированной задержкой, начиная с указанной задержки.

person Dipali Shah    schedule 01.11.2017
comment
Но как мне заставить его звонить каждые 3 секунды или 10 метров? Должен быть способ - person Matej; 01.11.2017
comment
Но это отправляет мне обновление местоположения, только если местоположение изменилось на 10 метров И прошло 3 секунды. Мне нужно получать обновления каждые 10 метров, даже если это произошло менее чем за 3 секунды, и обновлять каждые 3 секунды, даже если местоположение не изменилось более чем на 10 метров. - person Matej; 01.11.2017
comment
Установив его на 3000 мс, это не обязательно означает, что вы будете получать местоположение каждую 3-ю секунду. Время более или менее в лучшем случае. В любом случае 10-метрового расстояния будет более чем достаточно для точных данных или возьмите TimerTask и запрашивайте каждые три секунды. - person Dipali Shah; 01.11.2017
comment
Проблема в том, что это часть задания, и мы должны регистрировать местоположение каждые 3 секунды или 10 метров. - person Matej; 01.11.2017
comment
Я думал об этом уже давно, но я думал, что смогу как-то заставить его работать с requestLocationUpdates. Спасибо - person Matej; 01.11.2017

Я читал это обсуждение для аналогичной проблемы. Мне приходилось обновлять местоположение каждую секунду, но установка:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);

Я не достиг своей цели. В официальной документации я читал, что также, если вы зафиксируете время для обновлений, оно может быть не таким жестким, как установлено. (Я больше не могу найти страницу разработчика, о которой говорят).

Чтобы иметь фиксированный и надежный таймрейт для обновлений, я нашел этот пост.

Моя проблема заключалась в том, что обновления местоположения пошли на обновление (наблюдателями) активности, и я получил ошибку, используя таймер (как было предложено). ошибка была:

Only the original thread that created a view hierarchy can touch its views.

Для тех, у кого есть похожая проблема, я предлагаю использовать Handler:

Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            notifyLocationObservers();
        }
    }, 1000);
person Marco    schedule 26.05.2021