我希望获得5个连续更新位置,以检查用户是否正在移动并确保GPS已校准。我做了以下事情:
我添加了android.permission.ACCESS_FINE_LOCATION“到清单和onConnected:
mLocationRequest = new LocationRequest();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(1000); // Update location every second
mLocationRequest.setFastestInterval(1000);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
在onLocationChanged中我做了以下事情:
locationRetries++;
switch (locationRetries) {
case 1: {
firstLatitude = location.getLatitude();
firstLongitude = location.getLongitude();
}
case 5: {
locationRetries = 0;
lastLatitude = location.getLatitude();
lastLongitude = location.getLongitude();
accuracy = Math.round(location.getAccuracy());
stopLocationUpdates();//will remove from location updates and disconnects
float[] results = new float[1];
Location.distanceBetween(firstLatitude, firstLongitude, lastLatitude, lastLongitude, results);
if (results[0] > 5)... //if moved at least 5meters, show popup that the user is moving else do your thing
}
现在我有3个问题:
1)即使我将两个参数都设置为1000毫秒,检索5次更新似乎还需要不到5秒的时间。
2)即使我走得很快,所有5个位置(至少是第一个和最后一个)都是完全相同的位置。我以为我的动作可能太慢了
3)我关闭了我的应用程序,在远处重新打开它并按下按钮。我几乎立刻得到了以前的位置。我再次按下按钮然后我得到了我所在的真实位置。这就好像它没有真正要求/等待GPS的位置,而是采取了当时远程不准确的最后一个位置。我没有任何“获取最后知道位置”的代码。
我想最重要的是:我怎么能确定它确实询问GPS我在哪里询问的位置以及连续5次询问时,给我真实的位置而不是来自缓存(?)。
答案 0 :(得分:2)
智能地管理底层定位技术,并根据您的需求为您提供最佳位置。
- 简单的API:允许您指定高级别需求,如“高精度”或“低功耗”,而不必担心位置提供商。
- 立即可用:让您的应用可以立即访问最佳的最新位置。
- 功效:最大限度地减少应用对电量的使用。 根据所有传入的位置请求和可用的传感器,融合位置提供商选择最有效的方式来满足这些需求。
- 多功能性:满足广泛的需求,从需要高度精确定位的前景使用到需要定期更新位置的背景使用,而且功率影响可以忽略不计。
无法保证融合位置提供商将使用GPS - 如果它具有您要求的最近精确位置,它将返回直到返回更好的位置(即,实时GPS返回准确位置)。这样可以确保您可以更快地获得更好的位置,而无需等待GPS启动。
如果您特别需要GPS数据,则需要使用LocationManager使用GPS_PROVIDER。
如果您正在尝试确定用户当前正在做什么,您可以使用ActivityRecognitionApi,它返回DetectedActivity,例如WALKING或STILL:使用它会提供更快的方法来理解用户目前正在做。