2013-07-26 8 views
12

Nella classe Criteria, ci sono due costanti, ACCURACY_HIGH e ACCURACY_FINE, che sono apparentemente utilizzate per richiedere il LocationManager per restituire aggiornamenti di posizione più accurati. Ecco ciò che il documentation dice su ciascuna di queste costanti:Quale è un criterio di precisione più elevato: ACCURACY_HIGH o ACCURACY_FINE?

public static final int ACCURACY_FINE (aggiunta nel livello di API 1)

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

public static final int ACCURACY_HIGH (Aggiunto in API livello 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) 

fa un tu sai quale di queste due costanti fornisce (ad es. richiede) il più alto livello di precisione?

risposta

16

Da quello che posso vedere nel codice sorgente, ACCURACY_FINE è raggruppato con ACCURACY_COARSE con valori costanti di 1 & 2 rispettivamente. ACCURACY_LOW, medio e alto sono raggruppati insieme a valori costanti 1, 2 & 3.

Sembra che setAccuracy aspetta e rendimenti sia grossolano o fine, mentre setVerticalAccuracy, setHorizontalAccuracy, setSpeedAccuracy e setBearingAccuracy aspettano BASSO, media o alta. Inoltre, quando si chiama setAccuracy, imposta la precisione orizzontale in questo modo:

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; 
    } 
} 

è davvero confuso, ma spero riesce per voi un po '. Ecco un link alla fonte in grepcode, puoi scaricarlo e vedere di persona se non hai la fonte localmente.

+0

Grazie! Sfortunatamente, sembra essere un altro caso in cui la documentazione di Android è un po 'carente. Il collegamento del codice sorgente è utile! – robguinness

+2

Non chiedere troppo, ma se la risposta ti ha aiutato, potresti accettarlo! – npace

+0

Mi piace dare domande un giorno o due prima di accettare una risposta. Ti ho fatto invidia anche se! – robguinness

5

Entrambe le costanti indicano la massima precisione, ma sono destinate a metodi diversi. Dalla documentazione (che potrebbe essere stata aggiornata dopo la domanda):

ACCURACY_FINE è un input valido per setAccuracy.

ACCURACY_HIGH è input valido per setBearingAccuracy, setHorizontalAccuracy, setSpeedAccuracy e setVerticalAccuracy.

credo che l'idea di questo modellazione è che FINE e COARSE vi darà una scelta di soli due opposti, mentre LOW, MEDIUM e HIGH permettono per una distinzione più sottile. (La domanda rimane, perché setSpeedAccuracy ridicolizza che la modellazione consentendo solo LOW e HIGH. Ma allora, questo potrebbe essere un bug in uno documentazione o di progettazione. :))

Come accennato dal PO, hanno introdotto questi valori in seguito, Livello API 9, in contrasto con il livello API 1 per FINE-COARSE. Il codice trovato da npace rivela semplicemente che internamente gli sviluppatori Android ora mappano tutto ai nomi e ai valori dell'intervallo di valori da LOW a HIGH, per ottenere una certa coerenza internamente.

-1

Ci sono diversi criteia per determinare l'accuratezza della posizione

Una volta che il dispositivo inizia fornendo sedi in tempo reale, il mio suggerimento è quello di verificare l'esattezza di ogni risultato e considerare rifiutando quelle maggiore di una certa quantità che sono in base alle tue esigenze. Quanto più lungo è il provider di posizione, e se il dispositivo ha una visuale non ostruita del cielo e una buona connessione cellulare, in genere l'accuratezza migliorerà fino a un certo punto e poi si stabilizzerà, quindi fluttuerà. Ecco un frammento pseudo-codice che mostra come controllare l'accuratezza di ogni risultato posizione GPS:

1 
2 
3 

Ecco alcuni esempi di massima delle soglie di precisione. Le tue esigenze possono variare in base a come queste diverse soglie influenzeranno il comportamento della tua applicazione; questi erano esempi che richiedevano il geocoding che convertiva la posizione corrente in un indirizzo approssimativo. A seconda del risultato l'applicazione ha dato un feedback diverso all'utente:

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) 

Prendere in considerazione i propri casi d'uso unici. Potresti rifiutare completamente qualsiasi valore di precisione superiore a 100 metri (328 piedi) se la tua app aiuta semplicemente le persone a trovare parcheggi aperti nei giochi NFL. Potresti avere un'app che restituisce un elenco di uffici dentisti entro un raggio di 5 miglia (8000 m). O un'app meteo potrebbe solo aver bisogno di sapere approssimativamente in quale città ti trovi. Queste sono solo idee per aiutarti a pensare.

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