融合的位置提供程序setSmallestDisplacement在特定运动中不起作用

时间:2019-01-20 06:37:08

标签: android gps location distance fusedlocationproviderapi

我试图在用户移动时获取用户位置。我在下面的代码中编写了代码,并将最小位移设置为30米,将间隔设置为0毫秒,以使我每30米移动一次即可获得位置,但是我的应用程序无法正常工作。如果我停在某个地方,则应用程序无法获取位置,这是事实,但是当我移动时,有时我会以100米或更高的移动幅度获得位置。为什么? 如果我的位置超过30米,我将失去一些积分,这对我来说很重要。

这是我的请求位置更新代码:

 private void createLocationRequest() {
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(0);//(UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setFastestInterval(0);//(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setSmallestDisplacement(30);
    mLocationRequest.setMaxWaitTime(MAX_WAITE_TIME);

    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}

2 个答案:

答案 0 :(得分:0)

LocationRequest.setSmallestDisplacement不能给您带来更好的准确性,只是为了避免不必要的更新。

没有提高低精度的方法,您只是获得了一定精度的点,如果您对低精度的位置不感兴趣,只需跳过此位置并等待更好的位置即可。

目前没有完美的精度,精度为100m会降低精度。

检查android开发人员页面以获取更多信息:

https://developer.android.com/training/location/receive-location-updates#location-request

尝试一下: 将准确性级别设置为ACCURACY_FINE

设置最高功率(以获得最佳GPS信号)

不要求海拔。

将speedRequired设置为false

将CostAllowed标志设置为true

将BearingRequired设置为false

将Horizo​​ntalAccuracy和VerticalAccuracy设置为HIGH

详细了解这些功能,您将了解原因。

Criteria tenM= new Criteria();
tenM.setAccuracy(Criteria.ACCURACY_FINE);
tenM.setPowerRequirement(Criteria.POWER_HIGH);
tenM.setAltitudeRequired(false);
tenM.setSpeedRequired(false);
tenM.setCostAllowed(true);
tenM.setBearingRequired(false);
tenM.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
tenM.setVerticalAccuracy(Criteria.ACCURACY_HIGH);

locationManager.requestLocationUpdates(1000 /*milliseconds*/,  1 
/*1 meter*/, 
tenM /*criteria*/, this /*context*/, null);

答案 1 :(得分:0)

那是因为您的位置精度在30m以上(可能更高)。因此,当您将位置更改100 m时,您仍处于估计的位置圆中。您可以获取位置精度以查看其是否为真,但是无论如何,您没有比频繁获取坐标并选择精度最高的坐标更好的选择。 看到: FusedLocationProviderClient API LocationRequest setSmallestDisplacement doesn't work properly