Android LocationClient.getLastLocation()返回带有新时间戳的旧且不准确的位置

时间:2013-07-11 21:06:37

标签: android location android-location

自从发布以来,我一直在使用融合位置提供程序,我对此非常满意(比旧系统更好)。但是当将地理围栏与LocationClient.lastKnownLocation()结合使用时,我遇到了一个特殊的问题。设置如下:

我在一些家庭位置附近丢弃了几个地理围栏(范围越来越大)。当我得到越过栅栏的意图时,我从LocationClient中检索最后一个已知位置并使用它。除了我还注册了更新模式PRIORITY_BALANCED_POWER_ACCURACY的常规位置更新。

大部分时间这种方法都很好,但有时会发生这种情况:

时间000秒 - (Lat,Lon,Accuracy)=(48.127316,11.5855167,683.0)

时间120秒 - (Lat,Lon,Accuracy)=(48.1260497,11.5731745,31.823)

时间300秒 - (Lat,Lon,Accuracy)=(48.1217455,11.5641666,143.81)

时间420秒 - (Lat,Lon,Accuracy)=(48.1189942,11.559061,36.0)

时间600s - (Lat,Lon,Accuracy)=(48.127316,11.5855167,683.0)

请注意getLastKnownLocation()检索所有这些位置。这里看起来很可疑的是第一个和最后一个位置相同(即使在其他属性中),更具体:

* intent at time 0: *

component: ComponentInfo{package.Class}
key [location]: Location[mProvider=fused,mTime=1373524391934,mLatitude=48.127316,mLongitude=11.5855167,mHasAltitude=false,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing=0.0,mHasAccuracy=true,mAccuracy=683.0,mExtras=Bundle[mParcelledData.dataSize=352]]

* intent at time 600: *

component: ComponentInfo{package.Class}
key [location]: Location[mProvider=fused,mTime=1373524994871,mLatitude=48.127316,mLongitude=11.5855167,mHasAltitude=false,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing=0.0,mHasAccuracy=true,mAccuracy=683.0,mExtras=Bundle[mParcelledData.dataSize=352]]

* note the ~600 s difference in the timestamp * 

我不明白这是怎么发生的,因为两者之间的位置既较新又更准确。此外,旧位置的新时间戳让我感到好奇......使用old API时显然发生了类似的事情,但这个新的位置提供商只是被称为fused,所以我无法区分GPS和{{ 3}来自传感器...如果是细胞塔切换问题(在关于旧API的链接问题中概述)那么为什么如果看到更近的塔,电话会连接到“远处”塔?

为什么会这样?

3 个答案:

答案 0 :(得分:1)

使用细胞三角测量获得第一个和最后一个点。错误/准确性是基于单元格的位置的典型情况,看起来谷歌节电逻辑决定切换到单元格是可以的,即使你说它的近期历史包括更接近的点。

答案 1 :(得分:0)

噢,哎呀!我今天也得到了这个......我正准备搬到新的Google Play服务地点以避免这种情况......直到现在,我才非常激动。你可能知道也可能不知道那个老问题有这些问题,这很痛苦。

有很多线索,包括我自己的一个:(

Why is locationmanager returning old location fixes with new gettime-timestamp?

我想唯一要做的就是避免使用缓存的位置......

答案 2 :(得分:0)

使用此订阅机制,可以解决一个或多个不准确的来源,而不是轮询。

LocationListener locListener = new LocationListener() {
    @Override
    public void onLocationChanged(Location location) {
        if (location == null)
            return;
        // process these:
        // location.getLatitude();
        // location.getLongitude();
        // location.getAccuracy();
        ...
    }
    ... 
}

((LocationManager) getSystemService(Context.LOCATION_SERVICE)
        .requestLocationUpdates(LocationManager.GPS_PROVIDER,
                minTimeMilliSec,
                minDistanceMeters,
                locListener));