我可以使用 Sensor API 实时获取步数数据。我也可以实时获取距离数据。但是,我无法将步伐和距离放在一起。
这是我的代码。
private void findFitnessDataSources()
{
DataSourcesRequest dataSourcesRequest = new DataSourcesRequest.Builder()
.setDataTypes(DataType.TYPE_STEP_COUNT_DELTA, DataType.TYPE_DISTANCE_DELTA, DataType.TYPE_MOVE_MINUTES)
.setDataSourceTypes(DataSource.TYPE_DERIVED)
.build();
Fitness.getSensorsClient(appContext, googleSignInAccount)
.findDataSources(dataSourcesRequest)
.addOnSuccessListener(
new OnSuccessListener<List<DataSource>>()
{
@Override
public void onSuccess(List<DataSource> dataSources)
{
for (DataSource dataSource : dataSources)
{
Log.i(TAG, "Data source found: " + dataSource.toString());
Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName());
if (dataSource.getDataType().equals(DataType.TYPE_STEP_COUNT_DELTA) && stepsListener == null)
{
Log.i(TAG, "Data source for TYPE_STEP_COUNT_DELTA found! Registering.");
stepsDataSource = dataSource;
stepsListener = new OnDataPointListener()
{
@Override
public void onDataPoint(DataPoint dataPoint)
{
for (Field field : dataPoint.getDataType().getFields())
{
Value val = dataPoint.getValue(field);
Log.i(TAG, "Detected DataPoint field: " + field.getName());
Log.i(TAG, "Detected DataPoint value: " + val);
}
}
};
registerFitnessDataListener(stepsDataSource, stepsListener, DataType.TYPE_STEP_COUNT_DELTA, 3, TimeUnit.SECONDS);
}
else if (dataSource.getDataType().equals(DataType.TYPE_DISTANCE_DELTA) && distanceListener == null)
{
Log.i(TAG, "Data source for TYPE_DISTANCE_DELTA found! Registering.");
distanceDataSource = dataSource;
distanceListener = new OnDataPointListener()
{
@Override
public void onDataPoint(DataPoint dataPoint)
{
for (Field field : dataPoint.getDataType().getFields())
{
Value val = dataPoint.getValue(field);
Log.i(TAG, "Detected DataPoint field: " + field.getName());
Log.i(TAG, "Detected DataPoint value: " + val);
}
}
};
registerFitnessDataListener(distanceDataSource, distanceListener, DataType.TYPE_DISTANCE_DELTA, 3, TimeUnit.SECONDS);
}
else if (dataSource.getDataType().equals(DataType.TYPE_MOVE_MINUTES) && moveMinutesListener == null)
{
Log.i(TAG, "Data source for TYPE_MOVE_MINUTES found! Registering.");
moveMinutesDataSource = dataSource;
moveMinutesListener = new OnDataPointListener()
{
@Override
public void onDataPoint(DataPoint dataPoint)
{
for (Field field : dataPoint.getDataType().getFields())
{
Value val = dataPoint.getValue(field);
Log.i(TAG, "Detected DataPoint field: " + field.getName());
Log.i(TAG, "Detected DataPoint value: " + val);
}
}
};
registerFitnessDataListener(moveMinutesDataSource, moveMinutesListener, DataType.TYPE_MOVE_MINUTES, 3, TimeUnit.SECONDS);
}
}
}
})
.addOnFailureListener(
new OnFailureListener()
{
@Override
public void onFailure(@NonNull Exception e)
{
Log.e(TAG, "failed", e);
}
});
}
private void registerFitnessDataListener(DataSource dataSource, OnDataPointListener listener, DataType dataType, long samplingRate, TimeUnit timeUnit)
{
SensorRequest sensorRequest = new SensorRequest.Builder()
.setDataSource(dataSource)
.setDataType(dataType)
.setSamplingRate(samplingRate, timeUnit)
.build();
Fitness.getSensorsClient(appContext, googleSignInAccount)
.add(sensorRequest, listener)
.addOnCompleteListener(
new OnCompleteListener<Void>()
{
@Override
public void onComplete(@NonNull Task<Void> task)
{
if (task.isSuccessful())
{
Log.i(TAG, "Listener registered!");
}
else
{
Log.e(TAG, "Listener not registered.", task.getException());
}
}
});
}
更改不同数据类型的采样率并没有帮助。
我用谷歌搜索了一下,也许这是由于需要添加线程,结果,只有一个侦听器只在一个现有的主线程中工作。但我不是专业的 Android 开发人员,所以我不太了解它。
谷歌也只给出了文档中最简单的一个数据类型的例子,真可惜。
如果有人知道是否可以同时实时接收多种数据类型的数据,请告诉我!
PS 顺便说一句,似乎无法从传感器 API 接收有关 MOVE_MINUTES 的数据,是真的吗?