我的应用使用Google Play服务API来获取用户位置,并检查设备是在50 mt半径的特定区域内还是外。 该应用程序使用PRIORITY_HIGH_ACCURACY和1分钟的间隔。 所以我创建了GoogleApiClient:
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
在onConnected回调中:
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(60000);
mLocationRequest.setFastestInterval(10000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
和
MyLocationListener.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mLocationListener);
我的应用程序还根据准确度过滤位置(如果准确度> 200 mt我丢弃它)和时间(如果它太旧我丢弃它)。
该应用程序运行正常,但在某些特定区域,有时它会返回错误的位置,距离实际位置约500米,而这些错误的位置总是靠近同一个地方,距离Cell Tower只有一步之遥。
在这些区域,我得到错误和正确位置的组合,我的应用程序认为设备有时在内部,有时在感兴趣的区域之外。
当我获得位置更新时,我会等待其他3个连续确认位置。我也过滤位置,如果与前一个完全相同。这意味着当我收到这些错误时,我连续收到4个错误的位置,每个位置与其他位置略有不同。
有没有办法防止这种行为?这可能是由Cell Tower造成的吗?
答案 0 :(得分:0)
总有机会出错。 200米的准确度并不意味着它在200米以内 - 这意味着你有200%的机会在200米以内。你还有1/3的机会。
由于大多数Google Play位置信息提供商都是融合的(使用GPS和wifi /小区数据),因此非常靠近塔楼可以搞砸数据。
答案 1 :(得分:0)
将setInterval(60000)
更改为setInterval(20000)
或5000
。
由于间隔为一分钟,即使用户移动,您也不会获得更新。这就是为什么存在不准确的原因。
根据Google的说法,setInterval(long)表示 - 设置您想要获取位置的时间间隔。 setFastestInterval(long)表示 - 如果某个位置很快就可以获得(即另一个应用程序正在使用位置服务。意味着,如果没有其他应用程序正在使用位置服务,则只会在一分钟后获得更新)。< / p>