14

Criteria类中,有两个常量ACCURACY_HIGHACCURACY_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) 

有谁知道这两个常数中的哪一个提供(即要求)最高水平的准确度?

4

3 回答 3

22

From what I can see in the source code, ACCURACY_FINE is grouped with ACCURACY_COARSE with constant values of 1 & 2 respectively. ACCURACY_LOW, MEDIUM and HIGH are grouped together with constant values 1, 2 & 3.

It seems that setAccuracy expects and returns either COARSE or FINE, while setVerticalAccuracy, setHorizontalAccuracy, setSpeedAccuracy and setBearingAccuracy expect LOW, MEDIUM or HIGH. Furthermore, when you call setAccuracy, it sets horizontal accuracy like so:

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

It's really confusing, but I hope I cleared it up for you a bit. Here's a link to the source in grepcode, you can download it and see for yourself if you don't have the source locally.

于 2013-07-26T06:42:23.440 回答
8

这两个常数都意味着最高准确度,但适用于不同的方法。从文档(自提出问题以来可能已更新):

ACCURACY_FINEsetAccuracy的有效输入。

ACCURACY_HIGHsetBearingAccuracysetHorizo​​ntalAccuracysetSpeedAccuracysetVerticalAccuracy的有效输入。

我相信这个建模的想法是FINE并且COARSE只给你两个相反的选择,而LOW,MEDIUMHIGH允许更微妙的区别。(问题仍然存在,为什么只允许和setSpeedAccuracy嘲笑该建模。但是,这可能是文档或设计中的错误。:))LOWHIGH

正如 OP 所提到的,他们稍后引入了这些值,API 级别 9,与 FINE-COARSE 的 API 级别 1 形成对比。npace找到的代码简单地表明,Android 开发人员现在在内部将所有内容映射到 LOW 到 HIGH 值范围的名称和值,以在内部获得一些一致性。

于 2014-04-06T09:54:50.390 回答
-1

有几个标准可以确定位置的准确性

一旦设备开始提供实时位置,我的建议是检查每个结果的准确性,并根据您的要求考虑拒绝大于一定数量的结果。位置提供程序运行的时间越长,如果设备的天空视野畅通无阻并且蜂窝连接良好,那么通常精度会提高到某个点,然后趋于平稳,然后会出现波动。这是一个伪代码片段,展示了如何检查每个 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)

考虑您自己独特的用例。如果您的应用只是帮助人们在 NFL 比赛中找到开放停车场,您可能会完全拒绝任何大于 100 米(328 英尺)的精度值。您可以有一个应用程序返回半径 5 英里 (8000m) 范围内的牙医诊所列表。或者一个天气应用程序只需要知道你在哪个城市。这些只是帮助你思考的想法。

public void onLocationChanged(Location location) {
         if(location.getAccuracy() < 100.0 && location.getSpeed() < 6.95){
              //Do something
         }
         else{
              //Continue listening for a more accurate location
         }
于 2015-07-23T12:35:38.100 回答