在 datapointListener google Fit 期间获取当天的步数

Get current day's steps during datapointListener google Fit

使用以下代码,我获得了自开始记录值以来的累积步数。但我只想显示当天的步数而不是累积步数。

@Override
public void onConnected(@Nullable Bundle bundle) {
    DataSourcesRequest dataSourceRequest = new DataSourcesRequest.Builder()
            .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE)
            .setDataSourceTypes(DataSource.TYPE_RAW)
            .build();

    ResultCallback<DataSourcesResult> dataSourcesResultCallback = new ResultCallback<DataSourcesResult>() {
        @Override
        public void onResult(DataSourcesResult dataSourcesResult) {
            for( DataSource dataSource : dataSourcesResult.getDataSources() ) {
                if(DataType.TYPE_STEP_COUNT_CUMULATIVE.equals(dataSource.getDataType())) {
                    registerStepsDataListener(dataSource, DataType.TYPE_STEP_COUNT_CUMULATIVE);
                }
            }
        }
    };

    Fitness.SensorsApi.findDataSources(googleApiClient, dataSourceRequest)
            .setResultCallback(dataSourcesResultCallback);

    Fitness.RecordingApi.subscribe(googleApiClient, DataType.TYPE_STEP_COUNT_DELTA)
            .setResultCallback(subscribeResultCallback);
}

//onDataPointListener
@Override
public void onDataPoint(DataPoint dataPoint) {
    for( final Field field : dataPoint.getDataType().getFields() ) {
        final Value value = dataPoint.getValue( field );
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvSteps.setText("Field: " + field.getName() + " Value: " + value.toString());
            }
        });
    }
}

我尝试替换数据类型常量,但没有用。在 DataPointListener 中使用 History API 调用 readData 方法失败得很惨。当您获得所需的输出时,它会滞后很多,不应该做这样的事情。

另一种方法是换日,我在午夜获取累积步数的数据,然后将其存储在SharedPreferences中。然后从显示的累积值中减去 onDatapoint 期间的这个数字。

但是还有比这更好的方法吗?

根据第 2 步:使用 Google 拟合历史显示今天的数据 API,Google Fit for Android: History API 提到:

One common use case developers have is needing data for the current day. Luckily, Google has made this easy by adding the Fitness.HistoryApi.readDailyTotal call, which creates a DailyTotalResult object containing data collected for the day.

记录用户当天步数的示例代码:

private void displayStepDataForToday() {
    DailyTotalResult result = Fitness.HistoryApi.readDailyTotal( mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA ).await(1, TimeUnit.MINUTES);
    showDataSet(result.getTotal());
}

您也可以尝试此 SO post - 中给出的解决方案。我希望这对你有用。

  1. 检测应用是否为首次打开。如果为 true,则将第一次显示的步长值存储在 onDataPoint 方法中。此步数数据包含 google fit 之前记录的步数信息(通过其他应用程序或 google fit 本身)。将值存储在共享首选项中。
  2. 然后从显示的当前步数中减去存储的步数。这等于当前的步数。 //日常使用
  3. 检测自上次打开应用后日期是否发生变化。
  4. 如果是,那么使用google适合1天时间段的readDataapi,得到步数。
  5. 将这些步骤添加到存储的步骤中。因此,存储的步数会随着前一天的步数值增加。
  6. 在 onDataPoint 中,从显示的步数值中减去存储的步数值。

注意:您必须考虑几天未打开该应用程序。 Google fit应该还在记录步数。存储的步数应将应用未打开的所有天数相加。