2012-02-07 6 views
4

Я использую MyLocationOverlay для отображения текущего местоположения. Однако для обновления местоположения требуется некоторое время. Я хотел реализовать что-то вроде функции «следовать за мной» на iPhone, где местоположение пользователя также перемещается по мере перемещения пользователя. Как я могу сделать маркер MyLocationOverlay для выполнения обновления в реальном времени по его местоположению?Как реализовать текущее обновление текущего местоположения пользователя?

Обратите внимание, что я переопределяю draw() и drawMyLocation(), потому что мне нужно нарисовать пользовательский маркер.

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

@Override 
public synchronized void onLocationChanged(Location location) 
{ 
    if (location != null && mapController != null) 
    { 
     //Recenter map based on current location 
     mapController.animateTo(new GeoPoint((int) (location.getLatitude() * 1e6), (int) (location.getLongitude() * 1e6))); 
    } 
    super.onLocationChanged(location); 
} 

ответ

2

Вы можете дать менеджеру местоположение и минимальный интервал ожидания между вызовом этого метода, но это точно не будет против того, что интервал 100% от времени (см описание LocationManager.requestLocationUpdates()). Может быть короче, может быть больше - потому что, например, это может быть облачно, и gps-чип не сможет получать обновления местоположения так же регулярно, как вам бы хотелось.

Нет надлежащего способа преодоления этого - службы определения местоположения всегда будут иметь недостатки. Каждое приложение, ориентированное на местоположение, использовало время от времени «зависало» маркером, потому что чип gps потерял исправление на мгновение.

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

UPD Для этого вы можете реализовать вид прослушивателя местоположения прокси-сервера, который будет обновлять ваш маркер, строго учитывая заданные вами интервалы, например. каждые 200 мс, и делайте это на основе сохраненного местоположения. И сохраненное местоположение может быть асинхронно обновлено реальным приемником местоположения. У объектов местоположения есть время исправления, которое предоставило данные (см. Метод getTime()), вы можете использовать это, чтобы определить, следует ли еще «предсказать» движение следующего маркера, или местоположение достаточно старое, чтобы отказаться и уведомить пользователя о том, что gps не имеет понятия, где они:

+0

Спасибо! Сегодня я тестировал свое приложение, и он работает лучше, чем вчера. Хотя бывают моменты, когда маркер все равно прыгает с одного места на другое. Я ничего не меняю в своем коде, поэтому кажется, что вчера я просто плохой. Я напрямую не использую LocationManager, поскольку я просто повторно использую класс MyLocationOverlay, расширяя его. Должен ли я создать LocationManager? Кстати, знаете ли вы, как часто обновляется MyLocationOverlay? – Arci

+0

Предоставление фальшивых обновлений местоположения также пришло мне в голову, но я решил не реализовывать его, потому что из-за него может возникнуть множество проблем, например, если пользователь внезапно изменит свое направление или что, если он столкнется на запад, когда он собирается восток и т. д. Я проверил метод getTime. Я этого раньше не замечал. Спасибо за совет! – Arci

+1

Вам не нужно создавать LocationManager :) здесь: http://developer.android.com/guide/topics/location/obtaining-user-location.html - пример того, как его получить, но вы не вам нужно это, пока вы используете MyLocationOverlay - есть методы enable/disable- myLocation(), которые уже делают это внутри. Вы не можете устанавливать частоту обновлений MyLocationOverlay (см. Ответ здесь http://stackoverflow.com/questions/8394867/how-do-you-implement-follow-me-using-the-mylocationoverlay-class), поэтому, если вы хотите полный контроль над частотой, которую вы должны будете написать на свой собственный оверлей и прослушиватель. –