Android 计步器 -- 计数与 fitbit / Samsung 计步器都不匹配。 (以千计)
Android Step Counter -- Count does not match either fitbit / Samsung Step Counter. (Off by thousands)
我遇到的问题是我的计步器、fitbit 或 Samsung 计步器的计数完全不对。
好像关机了,过段时间就没有添加任何步骤了。
例如,如果我输入我从 3000 开始,它会计算一个偏移量并将其存储为共享首选项。它会尝试保持对传感器的注册。我还存储了当前步数,因此如果正在侦听步数广播的 activity 恢复,它将请求输出步数。
我试过让服务提供通知并成为前台服务,但准确性没有提高,而且非常耗电,我试过唤醒锁,结果相似,不准确,而且使用太多好强大。
就目前而言,我的应用程序未显示在电量使用统计信息中,因此它几乎没有用电。硬件传感器应该从加速度计捕获步数,当它醒来时,它应该输出最新的步数。当它确实更新时,它更接近我设置为步数的值。
我在某些设备上使用 kitkat 或更高版本中提供的计步器。以下代码为传感器注册。
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
if (null != sensor)
{
sensorManager.registerListener(this, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
这是在我构建的服务的 OnCreate 方法中。
该服务被创建为粘性的。并使用广播接收器接收来自 activity 的起始步数,以计算偏移量。它还广播已发生的步骤。这是更多代码。
class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_REQUEST_STEPS))
{
SendStepBroadcast(currentSteps);
}
else if (intent.getAction().equals(ACTION_SET_STEPS))
{
setSteps = intent.getFloatExtra(
STEPS_OCCURRED, -1);
SendStepBroadcast(setSteps);
}
}
}
@Override
public void onSensorChanged(SensorEvent event) {
if (setSteps > -1) {
offset = setSteps - event.values[0] + 1;
SharedPreferences prefs = getSharedPreferences("com.halfwaythere",
MODE_PRIVATE);
prefs.edit().putFloat("offset", offset).apply();
setSteps = -1;
}
currentSteps = event.values[0] + offset;
SharedPreferences prefs = getSharedPreferences("com.halfwaythere",
MODE_PRIVATE);
prefs.edit().putFloat("currentSteps", currentSteps).apply();
SendStepBroadcast(currentSteps);
}
private void SendStepBroadcast(float steps) {
Intent broadcastSteps = new Intent();
broadcastSteps.setAction(ACTION_STEPS_OCCURRED);
broadcastSteps.putExtra(STEPS_OCCURRED, steps);
this.sendBroadcast(broadcastSteps);
}
在Activity中使用以下代码启动服务:
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, StepService.class);
startService(intent);
}
我最近尝试解决这个问题,我尝试了以下方法:
- 使用 android:process=":background" 在它自己的进程中启动服务。我明天将在现场测试中尝试这个,看看它是如何工作的。
- 我尝试将计数设置为零,但发现我的代码不允许,所以在上面的代码中我使用了 > -1。因为 -1 不应该是有效的步数。
- 上面的所有代码都围绕它进行了测试,我试图找到任何边缘情况,并查看了三星 Galaxy S4 上 Step Counter 计步器问题的堆栈溢出。或者关于最佳实践的任何事情。
谢谢,如果您需要任何其他信息,请告诉我。
根据我的研究:
- 当屏幕被锁定时,硬件传感器在输出步骤之前等待。它确实计算步数,但一旦您按下侧面的按钮,它就会唤醒,并收到 SensorEvent。
- 服务偶尔会调用启动命令。我只注册一次非常重要,所以我添加了一个布尔值,一旦调用初始化就会翻转,然后关闭。服务已暂停,但未终止,启动命令在被唤醒时会 运行。
- 将服务设置为前台,似乎越来越接近其他计步器的值。使用更多电池,但要保持更多电量,所以这是有道理的。
- 不需要唤醒锁,它只开启了几毫秒,但这并没有导致硬件传感器发送结果。
- 将有我的服务 运行 直到达到目标,或者提供在中途停止跟踪的选项。我真的只是想告诉我,如果我转身,我就会达到我的目标,其他任何事情都等同于额外的步骤。
所以我会应用我发现的内容并继续开发我的应用程序,应该在 7 月中旬在 App Store 上架。
我遇到的问题是我的计步器、fitbit 或 Samsung 计步器的计数完全不对。
好像关机了,过段时间就没有添加任何步骤了。 例如,如果我输入我从 3000 开始,它会计算一个偏移量并将其存储为共享首选项。它会尝试保持对传感器的注册。我还存储了当前步数,因此如果正在侦听步数广播的 activity 恢复,它将请求输出步数。
我试过让服务提供通知并成为前台服务,但准确性没有提高,而且非常耗电,我试过唤醒锁,结果相似,不准确,而且使用太多好强大。
就目前而言,我的应用程序未显示在电量使用统计信息中,因此它几乎没有用电。硬件传感器应该从加速度计捕获步数,当它醒来时,它应该输出最新的步数。当它确实更新时,它更接近我设置为步数的值。
我在某些设备上使用 kitkat 或更高版本中提供的计步器。以下代码为传感器注册。
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
if (null != sensor)
{
sensorManager.registerListener(this, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
这是在我构建的服务的 OnCreate 方法中。 该服务被创建为粘性的。并使用广播接收器接收来自 activity 的起始步数,以计算偏移量。它还广播已发生的步骤。这是更多代码。
class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_REQUEST_STEPS))
{
SendStepBroadcast(currentSteps);
}
else if (intent.getAction().equals(ACTION_SET_STEPS))
{
setSteps = intent.getFloatExtra(
STEPS_OCCURRED, -1);
SendStepBroadcast(setSteps);
}
}
}
@Override
public void onSensorChanged(SensorEvent event) {
if (setSteps > -1) {
offset = setSteps - event.values[0] + 1;
SharedPreferences prefs = getSharedPreferences("com.halfwaythere",
MODE_PRIVATE);
prefs.edit().putFloat("offset", offset).apply();
setSteps = -1;
}
currentSteps = event.values[0] + offset;
SharedPreferences prefs = getSharedPreferences("com.halfwaythere",
MODE_PRIVATE);
prefs.edit().putFloat("currentSteps", currentSteps).apply();
SendStepBroadcast(currentSteps);
}
private void SendStepBroadcast(float steps) {
Intent broadcastSteps = new Intent();
broadcastSteps.setAction(ACTION_STEPS_OCCURRED);
broadcastSteps.putExtra(STEPS_OCCURRED, steps);
this.sendBroadcast(broadcastSteps);
}
在Activity中使用以下代码启动服务:
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, StepService.class);
startService(intent);
}
我最近尝试解决这个问题,我尝试了以下方法:
- 使用 android:process=":background" 在它自己的进程中启动服务。我明天将在现场测试中尝试这个,看看它是如何工作的。
- 我尝试将计数设置为零,但发现我的代码不允许,所以在上面的代码中我使用了 > -1。因为 -1 不应该是有效的步数。
- 上面的所有代码都围绕它进行了测试,我试图找到任何边缘情况,并查看了三星 Galaxy S4 上 Step Counter 计步器问题的堆栈溢出。或者关于最佳实践的任何事情。
谢谢,如果您需要任何其他信息,请告诉我。
根据我的研究:
- 当屏幕被锁定时,硬件传感器在输出步骤之前等待。它确实计算步数,但一旦您按下侧面的按钮,它就会唤醒,并收到 SensorEvent。
- 服务偶尔会调用启动命令。我只注册一次非常重要,所以我添加了一个布尔值,一旦调用初始化就会翻转,然后关闭。服务已暂停,但未终止,启动命令在被唤醒时会 运行。
- 将服务设置为前台,似乎越来越接近其他计步器的值。使用更多电池,但要保持更多电量,所以这是有道理的。
- 不需要唤醒锁,它只开启了几毫秒,但这并没有导致硬件传感器发送结果。
- 将有我的服务 运行 直到达到目标,或者提供在中途停止跟踪的选项。我真的只是想告诉我,如果我转身,我就会达到我的目标,其他任何事情都等同于额外的步骤。
所以我会应用我发现的内容并继续开发我的应用程序,应该在 7 月中旬在 App Store 上架。