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);
}

我最近尝试解决这个问题,我尝试了以下方法:

谢谢,如果您需要任何其他信息,请告诉我。

根据我的研究:

  • 当屏幕被锁定时,硬件传感器在输出步骤之前等待。它确实计算步数,但一旦您按下侧面的按钮,它就会唤醒,并收到 SensorEvent。
  • 服务偶尔会调用启动命令。我只注册一次非常重要,所以我添加了一个布尔值,一旦调用初始化就会翻转,然后关闭。服务已暂停,但未终止,启动命令在被唤醒时会 运行。
  • 将服务设置为前台,似乎越来越接近其他计步器的值。使用更多电池,但要保持更多电量,所以这是有道理的。
  • 不需要唤醒锁,它只开启了几毫秒,但这并没有导致硬件传感器发送结果。
  • 将有我的服务 运行 直到达到目标,或者提供在中途停止跟踪的选项。我真的只是想告诉我,如果我转身,我就会达到我的目标,其他任何事情都等同于额外的步骤。

所以我会应用我发现的内容并继续开发我的应用程序,应该在 7 月中旬在 App Store 上架。