android - Android 设备稳定 - 仅在一个地方,但有时行驶公里数仍超过 2 公里
问题描述
我正在开发一个应用程序,我正在使用FusedLocationProviderClient获取用户当前位置。类似于下面的代码。我无法理解为什么它将当前位置作为不同的位置,有时它距离当前位置2+KM并且设备只是在一个地方稳定
private void getLastLocation() {
try {
mFusedLocationClient.getLastLocation()
.addOnCompleteListener(new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if (task.isSuccessful() && task.getResult() != null) {
mLocation = task.getResult();
onNewLocation(mLocation);
} else {
Log.e(TAG, "Failed to get location.");
mLocation = null;
}
}
});
} catch (SecurityException unlikely) {
//Log.e(TAG, "Lost location permission." + unlikely);
}
上面的代码在前台服务中......现在的问题是当用户设备稳定但在运行应用程序 5-6 小时后它返回不同的当前位置,即使设备在同一个地方(没有移动)
实际结果:它不应该给我用户行驶的任何公里。我通过用户计算旅行的 KM 类似于下面的代码
double distanceInMeters = currentLocation.distanceTo(priviusLocation);
if (distanceInMeters > getSharedPref.getDefaultDistance() && (mLocation.getAccuracy() < Config.ACCURACY ) //Config.ACCURACY==>70{
// if (distanceInMeters > getSharedPref.getDefaultDistance()) {//getSharedPref.getDefaultDistance()==>10
if (mLocation.getLatitude() > 0) {
getSharedPref.setPreviousLocation(String.valueOf(mLocation.getLatitude()), String.valueOf(mLocation.getLongitude()));
writeDataInLogFile("this set to previous ", String.valueOf(mLocation.getLatitude()) + " getLongitude " + String.valueOf(mLocation.getLongitude()));
}
data.setGPS_Km_Travelled(String.format("%.2f", distanceInMeters / 1000));
data.setGPS_Is_Loc_Changed("1");
}
解决方案
融合位置提供程序的工作方式是,它结合来自设备 GPS 的数据以及来自 Google 的网络信息,使用设备的蜂窝网络和 WiFi 信息以及来自您设备的其他信息。
有时会发生的情况是,当您将设备留在几乎没有 GPS 连接的区域时,会使用来自设备的网络信息来推断用户的位置。这有时精确到 30m,但有时融合位置提供者给出的位置可能不精确到几公里。因此,即使物理设备从未移动,您的应用程序可能会认为设备已移动,因为当前位置已更改。
为了解决这个问题,您有必要实施一种算法来根据某些标准过滤收到的位置。例如,如果该位置的“准确度”值可能高于 100m,那么它甚至不值得考虑作为有效位置,因为用户实际上可能距离 api 返回的位置最多 3 公里。此外,如果用户的当前位置距离上一个位置太远,那么您应该检查新位置是否可以被认为是准确的(一个人通常不能以超过几公里/小时的速度移动)
祝您工作顺利!
推荐阅读
- c# - 如何从 ResourceDictionary 文件访问用户控件属性
- jquery - Jquery 点击功能在 IE 11 上不起作用
- automation - 如何使用 Appium 获取设备内存或应用程序大小(内部存储占用的内存)
- javascript - Javascript以html表单中断文件上传
- r - R根据列将值匹配到列(棘手)
- bash - 如果从属作业处于运行状态,则等待 Box 作业的执行,并在相关作业完成后继续执行 Box 作业
- r - 如果 R 中的 rbinom 函数位于 for 循环的中间,它是如何工作的?
- typescript - 为什么 Typescript 将我的 keyof 类型强制为 never 类型,我该如何解决?
- java - 使用 java8 迭代两个列表以查找匹配并返回布尔值
- javascript - 我可以用python(或slack应用程序?)编写一个脚本,允许输入一个URL,检查5个不同基域的成功加载吗?