2013-07-26 10 views
12

W klasie Criteria istnieją dwie stałe: ACCURACY_HIGH i ACCURACY_FINE, które najwyraźniej wymagają, aby LocationManager zwracał aktualizacje o wyższej dokładności. Oto co documentation mówi o każdym z tych stałych:Jakie są kryteria wyższej dokładności: ACCURACY_HIGH lub ACCURACY_FINE?

public static final int ACCURACY_FINE (Dodano w poziomie API 1)

A constant indicating a finer location accuracy requirement 
    Constant Value: 1 (0x00000001) 

public static final int ACCURACY_HIGH (Dodano w API poziom 9)

a constant indicating a high accuracy requirement - may be used for horizontal, altitude, speed or bearing accuracy. For horizontal and vertical position this corresponds roughly to an accuracy of less than 100 meters. 
    Constant Value: 3 (0x00000003) 

Czy yone wiedzą, która z tych dwóch stałych zapewnia (tj. wymaga) najwyższego poziomu dokładności?

Odpowiedz

16

Z tego, co widzę w kodzie źródłowym, ACCURACY_FINE jest zgrupowane z ACCURACY_COARSE o wartościach stałych odpowiednio 1 & 2. ACCURACY_LOW, średnie i wysokie są zgrupowane razem z wartościami stałych 1, 2 & 3.

Wydaje się, że setAccuracy oczekuje i powraca albo GRUBA lub grzywny, natomiast setVerticalAccuracy, setHorizontalAccuracy, setSpeedAccuracy i setBearingAccuracy oczekiwać LOW, średni lub wysoki. Ponadto, gdy dzwonisz setAccuracy, ustawia dokładność poziomą tak:

public void setAccuracy(int accuracy) { 
    if (accuracy < NO_REQUIREMENT || accuracy > ACCURACY_COARSE) { 
     throw new IllegalArgumentException("accuracy=" + accuracy); 
    } 
    if (accuracy == ACCURACY_FINE) { 
     mHorizontalAccuracy = ACCURACY_HIGH; 
    } else { 
     mHorizontalAccuracy = ACCURACY_LOW; 
    } 
} 

To naprawdę dziwne, ale mam nadzieję, że nie straciła gola dla was trochę. Oto link do źródła w grepcode, możesz go pobrać i przekonać się, jeśli nie masz lokalnego źródła.

+0

Dzięki! Niestety wygląda na to, że dokumentacja systemu Android jest nieco słabsza. Link do kodu źródłowego jest pomocny! – robguinness

+2

Nie prosić o zbyt wiele, ale jeśli odpowiedź ci pomogła, możesz to zaakceptować! – npace

+0

Lubię dawać pytania dzień lub dwa przed zaakceptowaniem odpowiedzi. Zrobiłem to jednak! – robguinness

5

Obie stałe oznaczają najwyższą dokładność, ale są przeznaczone dla różnych metod. Z dokumentacji (która mogła zostać zaktualizowana od czasu zadawania pytania):

ACCURACY_FINE jest prawidłowym wpisem do setAccuracy.

ACCURACY_HIGH obowiązuje wejście dla setBearingAccuracy, setHorizontalAccuracy, setSpeedAccuracy i setVerticalAccuracy.

Uważam, że idea tego modelowania jest FINE i COARSE daje do wyboru tylko dwa przeciwieństwa, natomiast LOW, MEDIUM i HIGH pozwalają na bardziej subtelnej różnicy. (Pozostaje pytanie, dlaczego setSpeedAccuracy wyśmiewa że modelowanie pozwalając tylko LOW i HIGH. Ale wtedy, to może być błąd w obu dokumentacji lub wzoru. :))

Jak wspomniano przez OP, wprowadzili te wartości później, Poziom API 9, w przeciwieństwie do poziomu interfejsu API 1 dla FINE-COARSE. Kod znaleziony przez npace pokazuje po prostu, że wewnętrznie programiści Androida teraz mapują wszystko na nazwy i wartości zakresu wartości LOW do HIGH, aby uzyskać wewnętrzną spójność.

-1

Istnieje kilka criteia celu określenia dokładności lokalizacji

Gdy urządzenie rozpoczyna świadczenie lokalizacji w czasie rzeczywistym, moja propozycja jest taka, aby sprawdzić dokładność każdego wyniku i rozważyć odrzucenie tych większa niż określonej kwoty, które są w oparciu o Twoje wymagania. Im dłużej działa dostawca lokalizacji, a urządzenie ma niezakłócony widok nieba i dobre połączenie komórkowe, zazwyczaj dokładność poprawi się do pewnego punktu, a następnie ustabilizuje się, a następnie ulegnie wahaniom. Oto fragment pseudo-kod pokazujący jak sprawdzić dokładność każdego wyniku lokalizacji GPS:

1 
2 
3 

Oto niektóre przykłady szorstkie progi dokładności. Twoje wymagania mogą się różnić w zależności od tego, w jaki sposób te różne progi wpłyną na zachowanie aplikacji; były to przykłady, które wymagały geokodowania, które przekonwertowały bieżącą lokalizację na przybliżony adres. W zależności od wyniku aplikacja przekazała użytkownikowi inną informację zwrotną:

Rooftop <= 10 meters (desired result) 
Street >10 meters and <= 100 meters (let user know it’s close but not perfect. Good enough?) 
Neighborhood > 100 meters and <= 500 meters (give visual feedback that accuracy is low) 
City > 500 meters and <= 2000 meters (ask user to verify city name from a list) 
County > 2000 meters (prompt for manual location input) 

Weź pod uwagę własne unikalne przypadki użycia. Możesz całkowicie odrzucić dowolną wartość dokładności większą niż 100 metrów (328 stóp), jeśli twoja aplikacja po prostu pomaga ludziom znaleźć otwarte parkingi w grach NFL. Możesz mieć aplikację, która zwraca listę gabinetów dentystycznych w promieniu 5 mil (8000 m). Lub aplikacja pogodowa może tylko wiedzieć, w jakim mieście jesteś. To tylko pomysły, które pomogą Ci myśleć.

public void onLocationChanged(Location location) { 
     if(location.getAccuracy() < 100.0 && location.getSpeed() < 6.95){ 
       //Do something 
     } 
     else{ 
       //Continue listening for a more accurate location 
     } 
Powiązane problemy