¿Cuáles son los criterios de mayor exactitud: ACCURACY_HIGH o ACCURACY_FINE?

En la clase Criteria , hay dos constantes, ACCURACY_HIGH y ACCURACY_FINE , que aparentemente se utilizan para requerir que LocationManager devuelva las actualizaciones de ubicación de mayor precisión. Esto es lo que dice la documentación acerca de cada una de estas constantes:

Public static final int ACCURACY_FINE (Añadido en el nivel 1 de la API)

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

Public static final int ACCURACY_HIGH (Añadido en API nivel 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) 

¿Alguien sabe cuál de estas dos constantes proporciona (es decir, requiere) el mayor nivel de precisión?

Por lo que puedo ver en el código fuente, ACCURACY_FINE se agrupa con ACCURACY_COARSE con valores constantes de 1 & 2, respectivamente. ACCURACY_LOW, MEDIUM y HIGH se agrupan con valores constantes 1, 2 y 3.

Parece que setAccuracy espera y devuelve COARSE o FINE, mientras setVerticalAccuracy, setHorizontalAccuracy, setSpeedAccuracy y setBearingAccuracy esperan BAJO, MEDIO o ALTO. Además, al llamar a setAccuracy, ajusta la precisión horizontal de la siguiente manera:

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

Es muy confuso, pero espero haberle aclarado un poco. Aquí hay un enlace a la fuente en grepcode , puedes descargarlo y ver por ti mismo si no tienes el origen localmente.

Ambas constantes significan la mayor precisión, pero están destinadas a diferentes métodos. De la documentación (que puede haber sido actualizada desde que se hizo la pregunta):

ACCURACY_FINE es entrada válida para setAccuracy .

ACCURACY_HIGH es entrada válida para setBearingAccuracy , setHorizontalAccuracy , setSpeedAccuracy y setVerticalAccuracy .

Creo que la idea de este modelo es que FINE y COARSE dan una opción de dos opuestos solamente, mientras que LOW , MEDIUM y HIGH permiten una distinción más sutil. (La pregunta sigue siendo, ¿ setSpeedAccuracy qué setSpeedAccuracy ese modelado al permitir sólo LOW y HIGH ? Pero entonces, esto puede ser un error en la documentación o el diseño :))

Como se mencionó por el OP, que introdujo los valores más tarde, API nivel 9, en contraste con el API nivel 1 para FINE-COARSE. El código encontrado por npace simplemente revela que internamente los desarrolladores de Android ahora asignan todo a los nombres y valores del rango LOW a HIGH, para obtener cierta consistencia internamente.

Hay varios criterios para determinar la exactitud de la ubicación

Una vez que el dispositivo comienza a proporcionar ubicaciones en tiempo real, mi sugerencia es comprobar la exactitud de cada resultado y considerar rechazar los mayores de una cierta cantidad que se basan en sus necesidades. Cuanto más tiempo se ejecute el proveedor de ubicación y si el dispositivo tiene una vista sin obstrucciones del cielo y una buena conexión celular, normalmente la precisión mejorará hasta cierto punto y luego se nivelará y, a continuación, fluctuará. Aquí hay un fragmento de pseudo-código que muestra cómo comprobar la exactitud de cada resultado de ubicación GPS:

 1 2 3 

Aquí hay algunos ejemplos aproximados de umbrales de precisión. Sus requisitos pueden variar en cuanto a cómo estos diferentes umbrales afectarán el comportamiento de su aplicación; Estos fueron ejemplos que requirieron geocodificación que convirtió la ubicación actual en una dirección aproximada. Dependiendo del resultado, la aplicación dio diferentes comentarios al usuario:

 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) 

Tenga en cuenta sus casos de uso únicos. Puede rechazar completamente cualquier valor de precisión superior a 100 metros si su aplicación simplemente ayuda a las personas a encontrar parques de estacionamiento abiertos en los juegos de la NFL. Usted podría tener una aplicación que devuelve una lista de oficinas de dentista dentro de un radio de 5 millas (8000m). O una aplicación de tiempo sólo podría necesitar saber aproximadamente qué ciudad que está pulg Estas son sólo ideas para ayudarle a pensar.

 public void onLocationChanged(Location location) { if(location.getAccuracy() < 100.0 && location.getSpeed() < 6.95){ //Do something } else{ //Continue listening for a more accurate location } 
  • Convertir latitud y longitud en esri arcGIS MapPoint
  • Cómo activar mediante programación GPS en Android Cupcake
  • ¿Cómo puedo obtener el nombre de la ciudad de mi posición actual?
  • ACCESS_FINE_LOCATION Permisos de AndroidManifest no concedidos
  • Android, Solicitud de ubicación, establecer la duración de caducidad no funciona
  • Android simulacro de ubicación en el dispositivo?
  • Cómo encontrar el código postal por latitud y logitud para el Reino Unido
  • Cómo corregir el movimiento suave del marcador en google maps v2?
  • GPS VS acelerómetro para calcular la distancia
  • Android: CellID no está disponible en todas las compañías?
  • ¿Cómo obtener la latitud y longitud actuales sin utilizar el método getLastKnownLocation en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.