2011-10-12 21 views
10

Otrzymuję okresowe aktualizacje lokalizacji za pośrednictwem GPS, problemem jest czas do pojawienia się pierwszej aktualizacji lokalizacji - to tylko na długo. Kiedy użytkownik znajduje się w budynku, ten czas staje się jeszcze gorszy.Rozpocznij strategię lokalizacji

W związku z tym szukam niektórych strategii, aby poprawić czas uruchamiania (w tej chwili nie używam getLastKnownLocation, ale będę). Zacząłem czytać A Deep Dive Into Location, aby uzyskać kilka pomysłów i mam teraz kilka myśli, które chciałbym omówić z tobą.

Na początku wymieniony wyżej wpis z blogu dotyczy każdego dostawcy lokalizacji na urządzeniu i zapytań o numer getLastKnownLocation, ale uwzględnia je tylko wtedy, gdy nie są one stare i mieszczą się w dozwolonej dokładności.

Oto moje pierwsze pytanie: spodziewałbym się, że lokalizacja oparta na sieci stanie się natychmiast dostępna, więc chciałbym poprosić o nową lokalizację sieciową, wtedy dostałbym getLastKnownLocation od dostawcy GPS i jeśli ostatnia lokalizacja GPS jest w obrębie okręgu utworzonego przez lokalizację w oparciu o punkt i dokładność promienia, wybrałbym lokalizację GPS, bez względu na to, ile ma lat. Co myślisz?

Po sprawdzeniu ostatnią znaną lokalizację zacznę śledzenie pozycji GPS i dlatego, że tylko trzeba go co 2 sekundy i zmianę 10m, użyłbym lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2 * 1000, 10, this);

Jednak znalazłem wzór (wewnątrz prezentacji Being Epic: Best Practices for Android Development na slajd 95 i 96, który początkowo włącza grube i drobne lokalizacje (z 0,0 dla zmiany czasu i odległości), a następnie, po odebraniu pierwszego zdarzenia, przełącza się na naprawdę potrzebną częstotliwość aktualizacji. Aktualizacja jest szybsza, gdy interwał ustawiony jest na 0?

W opozycji Zgodnie z tym wzorem zachowałbym aktualizację zgrubną do czasu otrzymania pierwszej aktualizacji GPS. Co myślisz?

Mam nadzieję, że otrzymam kilka interesujących odpowiedzi!

---------------- Aktualizacja ----------------

zrobiłem kilka badań: Włączyłem GPS i czekał na naprawę. Potem wyłączyłem GPS i przejechałem 50 km (31 mil). Następnie użyłem kodu z A Deep Dive Into Location, aby uzyskać wszystkie getLastKnownLocation. Próbowałem go dwukrotnie, najpierw z GPS wyłączony, a drugi z GPS włączone, ale bez Fix:

1) z GPS wyłączony mam
- Provider: sieć, poprawną lokalizację z dokładnością do 680m
- Provider : pasywne (mProvider = sieciowa), to samo miejsce jak wyżej, w tym samym czasie jak wyżej
- Właściciele: GPS, położenie zerowej

Więc kiedy dowiedziałem się, że GPS jest wyłączony nie dostaniesz getLastKnownLocation.

2) z GPS włączone mam
- Provider: sieć, poprawną lokalizację z dokładnością do 652 mln
- Właściciele: pasywne (mProvider = network), tym samym miejscu jak wyżej, ten sam czas jak powyżej
- Provider: GPS, lokalizacja, jak było 2 godziny wcześniej z dokładnością 12 m, czas był również 2 godziny wcześniej

Tutaj dowiedziałem się, że stare wiadomości nie są unieważniane, nawet jeśli jest oczywiste, że są one złe.

W takim przypadku algorytm działa poprawnie, ponieważ przeniosłem się w czasie, gdy wyłączyłem GPS. Ale co jeśli wejdę do domu? W takim przypadku 2-godzinny wynik GPS byłby bardzo dobry, nawet jeśli jest nieaktualny.

+0

Dobry link do rysowania pozycji na mapach Google, w tym promieniu (dokładność): [freemaptools] (http://www.freemaptools.com/radius-around-point.htm) – ChrLipp

Odpowiedz

4

Na Google IO 2013 pokazali w sesji Beyond the Blue Dot: New Features in Android Location nowe podejście, zobacz film here.

Inżynierowie z Google wypróbowali wiele różnych strategii, czego rezultatem jest "Fused location provider". Jego jakość jest pokazywana na filmie w 12:17.

Firma Ketan Parmar opublikowała numer blog post, w jaki sposób można zastosować dostawcę technologii zespolonej w przykładowej aplikacji.

+0

Czy dostawca usługi Fused location potrzebuje aplikacji AlarmManager i WakeLock często wybierać lokalizację i zapobiegać spaniu urządzenia, a nawet uzyskać lokalizację, gdy aplikacja jest w tle? Lub Fused zrobić to sam i AlarmManager i WakeLock są wewnątrz Google Play API? –

0

Uruchom menedżera lokalizacji z pasywnym pierwszej

locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, AlarmManager.INTERVAL_FIFTEEN_MINUTES, 75, this); 

dostawcy następnie po uzyskaniu odpowiedzi z których można przejść do sprzętu GPS.

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