Что является более высоким критерием точности: ACCURACY_HIGH или ACCURACY_FINE?

В классе Criteria существуют две константы: ACCURACY_HIGH и ACCURACY_FINE, которые, по-видимому, используются, чтобы потребовать, чтобы LocationManager возвращал обновления с более высокой точностью местоположения. Вот что документация говорит о каждой из этих констант:

public static final int ACCURACY_FINE (добавлен в уровень API 1)

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

public static final int ACCURACY_HIGH (добавлен в уровень API 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) 

Кто-нибудь знает, какая из этих двух констант обеспечивает (т.е. требует) наивысший уровень точности?

Ответ 1

Из того, что я вижу в исходном коде, ACCURACY_FINE сгруппирован с ACCURACY_COARSE с постоянными значениями 1 и 2 соответственно. ACCURACY_LOW, MEDIUM и HIGH сгруппированы вместе с постоянными значениями 1, 2 и 3.

Кажется, что setAccuracy ожидает и возвращает либо COARSE, либо FINE, тогда как setVerticalAccuracy, setHorizontalAccuracy, setSpeedAccuracy и setBearingAccuracy ожидают LOW, MEDIUM или HIGH. Кроме того, когда вы вызываете setAccuracy, он устанавливает горизонтальную точность так:

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

Это действительно сбивает с толку, но я надеюсь, что немного разобрал это для вас. Здесь ссылка на источник в grepcode, вы можете скачать его и убедиться сами, если у вас нет источника локально.

Ответ 2

Обе константы означают наивысшую точность, но предназначены для разных методов. Из документации (которая, возможно, была обновлена ​​с момента запроса):

ACCURACY_FINE - допустимый ввод для setAccuracy.

ACCURACY_HIGH - допустимый ввод для setBearingAccuracy, setHorizontalAccuracy, setSpeedAccuracy и setVerticalAccuracy.

Я полагаю, что идея этого моделирования заключается в том, что FINE и COARSE дают вам выбор только двух противоположностей, тогда как LOW, MEDIUM и HIGH допускают более тонкое различие. (Остается вопрос, почему setSpeedAccuracy высмеивает это моделирование, разрешая только LOW и HIGH. Но тогда это может быть ошибкой в ​​документации или дизайне.:))

Как уже упоминалось в OP, они ввели эти значения позже, уровень API 9, в отличие от уровня API 1 для FINE-COARSE. Код, найденный npace, просто показывает, что разработчики Android теперь отображают все имена и значения диапазона значений LOW до HIGH, чтобы получить внутреннюю консистенцию.

Ответ 3

Существует несколько критериев для определения точности местоположения

Как только устройство начнет предоставлять места в реальном времени, мое предложение - проверить точность каждого результата и рассмотреть возможность отклонения тех, которые превышают определенную сумму, основанную на ваших требованиях. Чем дольше работает провайдер местоположения, и если у устройства есть беспрепятственный просмотр неба и хорошее сотовую связь, тогда, как правило, точность будет повышаться до определенной точки, а затем выравнивается, а затем она будет колебаться. Вот фрагмент псевдокода, показывающий, как проверить точность каждого результата GPS-местоположения:

1
2
3

Вот приблизительные примеры порогов точности. Ваши требования могут отличаться в зависимости от того, как эти разные пороговые значения повлияют на поведение вашего приложения; это были примеры, требующие геокодирования, которые преобразуют текущее местоположение в приблизительный адрес. В зависимости от результата приложение дало пользователю различные отзывы:

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)

Учитывайте свои уникальные варианты использования. Вы можете полностью отклонить любое значение точности более 100 метров (328 футов), если ваше приложение просто поможет людям найти открытые парковочные места в играх NFL. У вас может быть приложение, которое возвращает список офисов стоматолога в радиусе 5 миль (8000 м). Или приложение погоды может знать только, в каком городе вы находитесь. Это просто идеи, которые помогут вам задуматься.

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