Android获取当前位置问题

时间:2016-06-20 05:16:13

标签: android location android-gps android-fusedlocation

我遇到了在Android中获取当前位置的问题。

我正在使用android的FusedLocationAPI。但我得到的经纬度并不准确。我将这些凭据粘贴在谷歌地图上,它显示的是我的位置与我的准确位置不同。

我还试图通过Location.getAccuracy()获取位置更新并验证其准确性,此处我获得的最低精度为10米。 在这里,我使用精确位置作为权限。 所以我的问题是,如何才能获得准确的位置,换句话说,精度不到5米。?

我的代码是

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .enableAutoManage(this, this)
                .build();

    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setSmallestDisplacement(1);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,MainActivity.this);

 @Override
public void onLocationChanged(Location location) {
    Toast.makeText(MainActivity.this,";-"+location.getAccuracy(),Toast.LENGTH_LONG).show();
    if(location.hasAccuracy() && location.getAccuracy()<lastLocationAccuracy){ 
        latitude = location.getLatitude();
        longitude = location.getLongitude();
    }
}

2 个答案:

答案 0 :(得分:1)

我搜索了很多,使用融合位置API我找不到任何关于10准确度的信息。

如果您看到Google IO演示文稿,则会显示一个图表,显示识别算法的不同优先级在Galaxy Nexus上多次测试的效果。

Google IO

如果您想获得低于10的准确度,那么您可以使用GPS,但它还取决于设备,GPS,WiFi,手机信号塔,蓝牙等......

如果GPS硬件可以接收WAAS校正,它可以做得更好,最差情况大约为7.6米,最佳情况为1-2米。

答案 1 :(得分:1)

  

如何获得准确的位置,换句话说,精度小于5米?

简短回答

使用位置时,了解您可以请求某种准确性非常重要,但您无法保证在实际位置更新中获得准确性

您通常不希望获得准确度高的位置更新&lt; 5米。这取决于许多因素,最重要的是设备的功能和物理环境。

答案很长

FusedLocationApi 在幕后做了很多魔术。除此之外,它还试图找出使用哪些提供商(GPS,WiFi,手机信号塔,蓝牙等)。这些提供商中的每一个在准确性,更新频率和电池消耗方面都有优缺点。然后它会融合来自不同提供商的信息,因此得名。

示例1 :如果你在纽约市的一个城市峡谷,你将很难获得一个良好和准确的GPS修复。另一方面,周围将有大量的WiFi网络,这些网络已经过Google映射和地理配准。所以你可能会得到一个快速的位置修复。准确性将取决于WiFi网络的密度,更重要的是取决于墙壁/建筑物的密度。我不希望在这里得到比15-30米更准确的东西。

示例2 :如果你在某个地方的沙漠中,那就是另一种方式。最有可能的是,附近不会有任何WiFi网络,但你会得到一个清晰的GPS修复。在这里,您可以期待位置更新&lt;准确度为5米。

您的设置看起来正确无误。选择高更新率和高优先级将确保GPS用作提供商(如果在设备上可用)。确保您在外面测试您的应用程序,并清楚地看到天空。如果您继续接收真正遥远的位置,请使用其他设备进行测试。如果它仍然无法正常工作,那么您的代码就会出现问题。 您可能希望使用实用程序类,例如LocationAssistant完全披露:我是该项目的作者),以确保您正确设置所有内容。

误解

最后,我想澄清一下我在其他评论中看到的两种常见错误观念:

  • 如文档中所述,Location.getAccuracy()将返回位置读数的估计准确度。这是最好的猜测(通常基于高斯误差模型),这可能是遥远的。我已经看到融合位置声称精确度为3m并且实际上超过100m的情况。所以不依赖它来获得关键功能。

  • ACCESS_FINE_LOCATION权限足以获得高准确度的更新。 无需另外指定 ACCESS_COARSE_LOCATION