【问题标题】:Fused Location Provider setSmallestDisplacement not working in specific movement融合位置提供程序 setSmallestDisplacement 在特定运动中不起作用
【发布时间】:2019-01-20 06:37:07
【问题描述】:

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

【问题讨论】:

    标签: android gps location distance fusedlocationproviderapi


    【解决方案1】:

    LocationRequest.setSmallestDisplacement 并没有给你更好的准确度,只是为了避免不必要的更新。

    没有办法提高低精度,你只是得到一个精度高的点,如果你对低精度的位置不感兴趣,就跳过这个位置,等待更好的位置。

    目前没有完美的精度,精度为100m更差。

    查看安卓开发者页面了解更多信息:

    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);
    

    【讨论】:

    • 感谢您的回复@KARAM JABER。你的意思是,我在移动 30 米后无法定位?我只是将位移设置在100米以上?我需要在户外 30 米后更新位置。
    • 你可以在30m之后获得位置,但问题是它的精度并不完美,所以在设置了你的最小位移后,只有在下次更新时超过该位移时才会触发位置请求,否则会触发不是。现在它会继续检查,如果新位置精度低,你应该跳过那个,等待更准确的那个,但到那时你已经移动了超过 30m,你将等待下一个。即使是whatsapp和facebook等大公司,发送位置时也只能精确到最小20m-30m。
    • 感谢@KARAM JABER。如果我不跳过那个低准确度的位置,会发生什么?和 waze 等应用程序如何工作?位智会定期获取位置并在每毫秒显示我的位置!
    • @FahimehHashemian 你会得到一个不受欢迎的行为,就像你现在得到的 100m 而不是 30m。检查此编辑以获取我的答案,我使用的准确度为 10m。
    • 最后@FahimehHashemian 请设置Interval 而不是fastInterval,setInterval 的调用速度比fastestInterval 快。讽刺
    【解决方案2】:

    那是因为您的位置精度高于 30m(可能要高得多)。因此,当您将位置更改 100 m 时,您仍处于估计的位置圈内。您可以获取位置精度以查看是否为真,但无论如何,您没有比经常获取坐标并选择最准确的坐标更好的选择。 看: FusedLocationProviderClient API LocationRequest setSmallestDisplacement doesn't work properly

    【讨论】:

      猜你喜欢
      • 2015-03-02
      • 2015-12-22
      • 2013-09-01
      • 2013-08-02
      • 2014-11-29
      • 2016-09-20
      • 2014-09-05
      • 1970-01-01
      • 2019-07-28
      相关资源
      最近更新 更多