我试图在用户移动时获取用户位置。我在下面的代码中编写了代码,并将最小位移设置为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);
}
答案 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
将HorizontalAccuracy和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