在 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 - 中给出的解决方案。我希望这对你有用。
- 检测应用是否为首次打开。如果为 true,则将第一次显示的步长值存储在 onDataPoint 方法中。此步数数据包含 google fit 之前记录的步数信息(通过其他应用程序或 google fit 本身)。将值存储在共享首选项中。
- 然后从显示的当前步数中减去存储的步数。这等于当前的步数。
//日常使用
- 检测自上次打开应用后日期是否发生变化。
- 如果是,那么使用google适合1天时间段的readDataapi,得到步数。
- 将这些步骤添加到存储的步骤中。因此,存储的步数会随着前一天的步数值增加。
- 在 onDataPoint 中,从显示的步数值中减去存储的步数值。
注意:您必须考虑几天未打开该应用程序。 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 aDailyTotalResult
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 -
- 检测应用是否为首次打开。如果为 true,则将第一次显示的步长值存储在 onDataPoint 方法中。此步数数据包含 google fit 之前记录的步数信息(通过其他应用程序或 google fit 本身)。将值存储在共享首选项中。
- 然后从显示的当前步数中减去存储的步数。这等于当前的步数。 //日常使用
- 检测自上次打开应用后日期是否发生变化。
- 如果是,那么使用google适合1天时间段的readDataapi,得到步数。
- 将这些步骤添加到存储的步骤中。因此,存储的步数会随着前一天的步数值增加。
- 在 onDataPoint 中,从显示的步数值中减去存储的步数值。
注意:您必须考虑几天未打开该应用程序。 Google fit应该还在记录步数。存储的步数应将应用未打开的所有天数相加。