我正在为我的应用程序开发一个演示,其中有两个按钮,分别命名为“START”和“STOP”。当用户点击“开始”时,他将开始行走。我想要做的是,当用户点击“STOP”时,演示将计算他在“START”和“STOP”之间的距离。如果用户按下“START”并按下“STOP”而不执行任何步骤,则必须显示0km或0m。我不知道如何开始这个;请提出建议。
答案 0 :(得分:18)
有不同的方法可以做到这一点:
答案 1 :(得分:13)
一种方法是使用加速度计数据。用户按下“开始”按钮后,您的应用应连续记录加速计数据。每当用户迈出一步时,您将在数据中观察到峰值。对此数据应用过滤器,您应能够以合理的准确度检测所采取的步骤数。将其乘以步长,您应该得到行进距离的近似值。将用户的高度作为输入参数。步长约为0.45 *一个人的身高。由于这种方法独立于GPS,因此它也适用于室内。 编辑: 您需要使用所有三个轴的加速度计值使其完全独立于设备方向。您可以使用x ^ 2 + y ^ 2 + z ^ 2
答案 2 :(得分:6)
在您的应用中询问GPS权限。点击开始时,记录GPS坐标。做同样的停止。你现在有两个坐标。然后,您可以应用距离公式来获得行进的总距离。
修改强>
至于评论中澄清的情况,我认为你需要研究的是Android的motion sensors。您可能需要做出很多假设,或者要求用户在实际使用前校准您的应用程序。
假设您了解用户的节奏因素。使用运动传感器,计算用户“走路”的时间长度(显然,没有简单的方法来确定您的用户是实际走路还是只是摇动手机)。将其与用户的节奏因子相乘,您就可以非常清楚地了解用户的步行量。
答案 3 :(得分:3)
评论"此解决方案存在一个问题。如果您以恒定速度行驶,加速度为0,因此加速度计不会读取任何读数。 - 16秒前的jnovacho" (对不起,没有足够的声誉可以直接评论)
当你加速时,保存加速度,然后计算你走的速度。每当加速度改变并重新开始时停止计算速度。如果你停下来,你应该得到一个负面的加速,然后你必须计算你是否只是放慢速度或完全停止。但那仅仅是数学:)
答案 4 :(得分:3)
我选择了Gps方法。 通过以下步骤: 点击开始按钮,获取起点的纬度和经度,并将其存储在我的dto中并使用正确的TripId。
点击停止按钮:
TripDto dto = service.GetStartLatLong(TripIdA);
double lat = Double.valueOf(dto.getStartLati());
double lon = Double.valueOf(dto.getStartLongi());
Location locationa = new Location("point A");
locationa.setLatitude(lat);
locationa.setLongitude(lon);
double distance = location.distanceTo(locationa);
location.distanceTo()方法返回的距离以米为单位。
答案 5 :(得分:2)
public double getDistance(double lat1, double lon1, double lat2, double lon2)
{
double latA = Math.toRadians(lat1);
double lonA = Math.toRadians(lon1);
double latB = Math.toRadians(lat2);
double lonB = Math.toRadians(lon2);
double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
(Math.sin(latA) * Math.sin(latB));
double ang = Math.acos(cosAng);
double dist = ang *6371;
return dist;
}
答案 6 :(得分:1)
尝试使用传感器,我觉得你不应该使用GPS,因为它可能不那么准确。 请参阅以下开源计步器项目,了解您所说的内容。
如果您想使用传感器,将使用更多指定的代码更新此答案。
答案 7 :(得分:0)
您可以使用位置管理器使用 START 按钮找到当前位置的纬度和经度,并将其存储在变量中。然后使用相同的方法找到终点的纬度和经度。使用这个找到它们之间的距离 -
答案 8 :(得分:0)
如果您的轨迹不是直接的方式(曲线或之字形),那么您应该每 3-10 秒使用一次检查位置 别人在我之前说(x 秒)。