Android Step Counter - Count与fitbit / Samsung Step Counter不匹配。 (成千上万)

时间:2015-06-07 03:33:40

标签: android service

我遇到的问题是我的计数完全没有,来自任何计步器,fitbit或三星计步器。

它似乎关闭了,一段时间后没有添加任何步骤。 例如,如果我输入我从3000开始,它会计算一个偏移量并将其存储为共享首选项。它会尝试保持对Sensor的注册。我还存储当前步骤,以便在恢复正在侦听步骤广播的活动时,它将请求输出步骤。

我试过让服务提供通知并成为前台服务,但准确性没有提高,而且它使用了大量的电力,我尝试了一个唤醒锁,结果相似,不准确,并且耗电量过大

目前,我的应用程序没有显示在电源使用情况统计信息中,因此根本不使用电源。硬件传感器应该从加速度计捕获步骤,当它唤醒时,它应该输出最新的步骤。当它更新时,它更接近我设置为步数的值。

我正在使用在某些设备上以kitkat或以上版本提供的步数计数器。以下代码注册传感器。

Sensor sensor =  sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
    if (null != sensor)
    {
        sensorManager.registerListener(this, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
    }

这是我构建的OnCreate服务方法。   服务创建为粘性。并使用广播接收器接收活动的开始步骤,以计算偏移量。它还广播已经发生的步骤。这是更多的代码。

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上步进计数器的计步器问题的堆栈溢出。或者关于最佳实践的任何内容。

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

1 个答案:

答案 0 :(得分:0)

从我的研究中:

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

所以我将应用我发现并继续使用我的应用程序,应该在7月中旬在App Store上。