【发布时间】:2017-04-16 19:12:57
【问题描述】:
我有一个计步器应用程序,我在其中运行一项服务,该服务计算所采取的步数,然后向片段发送广播,然后在片段上更新。计步工作正常,但我想根据步数计算速度。这是我现在正在尝试的。
获取步数的接收者:
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int steps = intent.getIntExtra(StepCounterService.STEP_INCREMENT_KEY, 0);
if (firstStepTime.equals("0")) {
firstStepTime = intent.getStringExtra(StepCounterService.TIME_STAMP_KEY);
} else if (secondStepTime.equals("0")) {
secondStepTime = intent.getStringExtra(StepCounterService.TIME_STAMP_KEY);
} else {
firstStepTime = secondStepTime;
secondStepTime = intent.getStringExtra(StepCounterService.TIME_STAMP_KEY);
}
updateAllUI(steps);
}
};
所以我正在做的是,一旦我开始获取步骤,我就会查看变量 firstStepTime 是否为空。如果是,我将时间保存在firstStepTime 变量中。在下一步中,我查看secondStepTime 是否为空,如果是,我将时间保存在secondStepTime 变量中。
现在对于接下来的步骤,这两个都已更新。
public void updateAllUI(int numberOfSteps) {
if (!(firstStepTime.equals("0")) && !(secondStepTime.equals("0"))) {
try {
Calendar c = Calendar.getInstance();
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss.SSS");
timeDifference = timeFormat.parse(secondStepTime).getTime() - timeFormat.parse(firstStepTime).getTime();
speed = (float) ((0.0254 / (timeDifference * 0.001)) * 3.6);
} catch (Exception e) {
timeDifference = 0;
speed = 0;
}
textview.settext(speed +"Km/h);
}
}
所以在这里我只检查两者是否不为空,我取值并计算时间差。这里的问题是有时它不能正确计算速度。而更大的问题是,如果用户停下来,速度保持不变,不会降到零。
有没有更好的方法来计算速度?
【问题讨论】:
-
如果您使用的是 FineLocation,那么使用带有 google maps api 的 getSpeed 应该不会太难。我使用 api 制作了一个速度计,效果很好,但是当用户的移动速度不超过 1 英里/小时时会有点延迟,有时会有点偏离。
-
这个 0.0254 是每一步的固定距离吗?什么是 3.6?
-
另外,你是如何收集时间戳的?是用加速度计吗?
-
只有在调用
updateAllUI时才会显示或更新您的速度,即每当您的接收器变量调用其onReceive方法时。所以我的问题是,它什么时候被调用?它是在每一步之后调用的(这可以解释为什么当一个人停止时它不会更新为 0)还是有一个设定的时间间隔(在这种情况下,您需要一个“超时”窗口来更新速度到 0)?附带说明:为什么要更新变量?你不应该处理手头的异常吗? -
我是否遗漏了什么,或者这根本不可能?要测量速度,您需要将行驶距离除以到达那里所需的时间(即
speed = distance / time)。您正在使用的StepCounterService似乎只给您步骤之间的时间,而不是步骤的距离;那你怎么可能计算速度呢?