Android - LocationManager requestLocationUpdates - 位置更新不一致

Posted

技术标签:

【中文标题】Android - LocationManager requestLocationUpdates - 位置更新不一致【英文标题】:Android - LocationManager requestLocationUpdates - location updates not consistent 【发布时间】:2014-04-03 09:12:57 【问题描述】:

我尝试每 10 分钟获取一次位置更新,但位置更新时间不一致。有时我会在 10 分钟后获得位置更新,有时我会在 2 小时后获得位置更新。应用在后台线程上获取位置更新。

代码如下:

_locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER,
                10 *  60 * 1000,
                0, 
                _locationListener,
                _gpsHandlerThread.getLooper());

我还尝试设置 minTime(10) 和 minDistance(10 米) 这两个值,但即使在 1-2 分钟后我也会收到更新。我不确定 minTime 和 minDistance 是否具有 OR 逻辑,即时间间隔是否为 10 分钟或用户已移动 10 米或具有逻辑。

我的要求是 - 如果用户距离上一个位置 10 米,则每 10 分钟获取一次用户位置。

我怎样才能做到这一点?我寻求帮助,但几乎没有解释它是如何工作的。

【问题讨论】:

如果您使用的是LocationManager.GPS_PROVIDER,则可能需要长达 20 分钟才能从卫星上获得第一个修复 - 更不用说您需要清晰的天空视野,如果您正在室内的。另一方面,LocationManager.NETWORK_PROVIDER 可以在您的设备连接到无线网络后立即为您提供位置更新 - 缺点是这种方法不如您使用的 GPS 方法准确。 【参考方案1】:

使用这个处理程序来获取位置

private Handler customHandler = new Handler();
private Runnable updateTimerThread = new Runnable() 

@Override
public void run()
    
        try
            

                Location myLocation = mGoogleMap.getMyLocation();
                secndLocationListener.onLocationChanged(myLocation);
            
        catch (Exception e)
            
                Log.getStackTraceString(e);
            

    
    ;

叫这个

   customHandler.postDelayed(updateTimerThread , 10 *  60 * 1000);

【讨论】:

【参考方案2】:

最好的方法不是通过 requestLocationUpdates,而是通过使用计时器定期启动更新。这应该可以避免您不必要地耗尽电池。所以我最终做了这样的事情:

    我有一些检查,看看我是否喜欢 GPS 值。 如果我对 GPS 感到满意,我会删除更新,并启动计时器以再次开始获取更新。 我总是在恢复应用程序时收到更新。

重新启动 GPS 更新的代码可能如下所示:

Timer mTimer;
private void sendFinalGps() 
    mLocationManager.removeUpdates(this);
    mTimer = new Timer();
    mTimer.schedule(new findGpsTime(), getTimeBetweenUpdates());

【讨论】:

以上是关于Android - LocationManager requestLocationUpdates - 位置更新不一致的主要内容,如果未能解决你的问题,请参考以下文章

Android之LocationManager

Android - 使用 LocationManager 不会提供地理修复

Android:LocationManager 构造函数的循环器

当我得到 LocationManager 时发生异常。(Android)

Android开发之LocationManager和定位

[Android-Location]无法从LocationManager获取经纬度