在Criteria类中,有两个常量,ACCURACY_HIGH和ACCURACY_FINE,它们显然被用来要求LocationManager返回更高精度的位置更新。下面是文档对每一个常量的说明:
公共静态最终int ACCURACY_FINE (在API级别1中添加) 表示较高定位精度的常数:1 (0x00000001) 公共静态最终int ACCURACY_HIGH (在API级9中添加) 表示高精度要求的常数--可用于水平、高度、速度或轴承精度。对于水平和垂直位置,这大致相当于不到100米的精度。常数:3 (0x00000003)
有谁知道这两个常量中哪一个提供(即要求)最高的精确度?
发布于 2013-07-26 06:42:23
从源代码中可以看到,ACCURACY_FINE是与ACCURACY_COARSE一起分组的,其常量值分别为1和2。ACCURACY_LOW,中等和高分组与常量值1,2和3。
setAccuracy似乎期望并返回粗或细,而setVerticalAccuracy、setHorizontalAccuracy、setSpeedAccuracy和setBearingAccuracy则期望低、中或高。此外,当您调用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源代码的链接,您可以下载它,如果本地没有源代码,您可以自己查看。
发布于 2014-04-06 09:54:50
这两个常数都意味着最高的精度,但适用于不同的方法。从文件(问题提出后可能已经更新):
ACCURACY_FINE是setAccuracy的有效输入。
ACCURACY_HIGH是setBearingAccuracy、setHorizontalAccuracy、setSpeedAccuracy和setVerticalAccuracy的有效输入。
我相信这种建模的思想是,FINE和COARSE只给您两个对立面的选择,而LOW、MEDIUM和HIGH允许一个更微妙的区别。(问题仍然存在,为什么setSpeedAccuracy只允许LOW和HIGH来嘲笑这种建模。但是,这可能是文档或设计中的一个错误。*)
正如OP所提到的,他们在后面引入了这些值,即API级别9,而API级别1用于细粗。npace发现的代码简单地揭示了在内部,安卓开发人员现在将所有东西映射到低到高值范围的名称和值,以获得内部的一致性。
发布于 2015-07-23 12:35:38
确定定位精度的标准有几个。
一旦设备开始提供实时位置,我的建议是检查每个结果的准确性,并考虑拒绝那些大于一定数量的,根据您的要求。定位提供商运行的时间越长,如果设备有通畅的天空视野和良好的蜂窝连接,那么通常情况下,精确度会提高到某个点,然后平稳下来,然后就会波动。下面是一个伪代码片段,展示了如何检查每个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
}https://stackoverflow.com/questions/17874454
复制相似问题