在Criteria
类中,有两个常量ACCURACY_HIGH
和ACCURACY_FINE
,这些常量显然用于要求LocationManager
返回更高精度的位置更新。以下是documentation关于这些常量的说法:
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)
有谁知道这两个常数中的哪一个提供(即要求)最高准确度?
答案 0 :(得分:18)
从我在源代码中看到的,ACCURACY_FINE与ACCURACY_COARSE分组,其常数值为1&分别为2。 ACCURACY_LOW,MEDIUM和HIGH组合在一起,其值为1,2和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中源代码的链接,您可以下载它,如果您没有本地源代码,请自行查看。
答案 1 :(得分:5)
两个常数都表示最高精度,但适用于不同的方法。从文档中(自问题提出以来可能已更新):
ACCURACY_FINE
是setAccuracy的有效输入。
ACCURACY_HIGH
是setBearingAccuracy,setHorizontalAccuracy,setSpeedAccuracy和setVerticalAccuracy的有效输入。
我认为这种建模的想法是FINE
和COARSE
只允许您选择两个对立面,而LOW
,MEDIUM
和HIGH
允许更微妙的区分。 (问题仍然存在,为什么setSpeedAccuracy
通过仅允许LOW
和HIGH
来嘲笑建模。但是,这可能是文档或设计中的错误。:))
正如OP所提到的,他们后来引入了这些值,API级别9,与FINE-COARSE的API级别1相反。 npace找到的代码简单地揭示了Android开发人员现在在内部将所有内容映射到LOW到HIGH值范围的名称和值,以在内部获得一致性。
答案 2 :(得分:-1)
有几个criteia来确定位置的准确性
一旦设备开始提供实时位置,我的建议是检查每个结果的准确性,并考虑拒绝超过基于您的要求的一定数量的结果。位置提供商运行的时间越长,并且如果设备具有无障碍的天空视图和良好的蜂窝连接,那么通常精度将提高到某一点然后平稳,然后它将波动。这是一段伪代码段,展示了如何检查每个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英里(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
}