当使用Google Fit API消费食品时,我们可以检索食品类型(如香蕉,牛奶,意大利面,茶等)和膳食类型(如早餐,午餐,小吃和晚餐)吗?
营养数据通过MyFitnessPal输入。
截至目前,我只能使用Google Fit API检索营养素数据和消耗的总卡路里数。
如果Google健身中存在此功能,请直接向我提供一些文档或链接或论文。我可以看到它在文档中说明了here所提到的类型,但不确定如何检索它。任何帮助将非常感激。谢谢!
答案 0 :(得分:0)
我可以看到它在文档中说明了这里提到的类型,但不确定如何检索它。
如果您阅读了自己提供的相同文档链接,则会看到可以使用DataPoint.getValue(Field)访问此字段。
此类包含表示common的字段名称的常量 数据类型,每个都以FIELD_为前缀。这些可用于访问和 通过DataPoint.getValue(Field)设置字段。
实际使用它的一些代码段找到了here:
DataSource nutritionSource = new DataSource.Builder()
.setDataType(DataType.TYPE_NUTRITION)
...
.build();
DataPoint banana = DataPoint.create(nutritionSource);
banana.setTimestamp(now.getMillis(), TimeUnit.MILLISECONDS);
banana.getValue(Field.FIELD_FOOD_ITEM).setString("banana");
banana.getValue(Field.FIELD_MEAL_TYPE).setInt(Field.MEAL_TYPE_SNACK);
banana.getValue(Field.FIELD_NUTRIENTS).setKeyValue(Field.NUTRIENT_TOTAL_FAT, 0.4f);
banana.getValue(Field.FIELD_NUTRIENTS).setKeyValue(Field.NUTRIENT_SODIUM, 1f);
banana.getValue(Field.FIELD_NUTRIENTS).setKeyValue(Field.NUTRIENT_POTASSIUM, 422f);
答案 1 :(得分:0)
当前非常麻烦,因为它们没有提供将Value
转换为HashMap<String, Float>
的方法,而这是一种以可管理的方式获取营养物质所需的方法。
https://developers.google.com/android/reference/com/google/android/gms/fitness/data/Value
API提供了asActivity
,asFloat
,asInt
和asString
方法来转换Value
,但如果是Map
,不幸的是,您只能使用getKeyValue
来请求单个密钥。
这是我目前的做法。实际上,我对于需要遍历预定义的键列表并使用try-catch
语句感到不高兴,但是当您请求Map中不存在键时会得到一个例外。
// Somewhere in your class definitions
private static final String TAG = "NutritionHistory";
private static final String[] NUTRIENTS_ARRAY = new String[] {
Field.NUTRIENT_CALORIES,
Field.NUTRIENT_TOTAL_FAT,
Field.NUTRIENT_SATURATED_FAT,
Field.NUTRIENT_UNSATURATED_FAT,
Field.NUTRIENT_POLYUNSATURATED_FAT,
Field.NUTRIENT_MONOUNSATURATED_FAT,
Field.NUTRIENT_TRANS_FAT,
Field.NUTRIENT_CHOLESTEROL,
Field.NUTRIENT_SODIUM,
Field.NUTRIENT_POTASSIUM,
Field.NUTRIENT_TOTAL_CARBS,
Field.NUTRIENT_DIETARY_FIBER,
Field.NUTRIENT_SUGAR,
Field.NUTRIENT_PROTEIN,
Field.NUTRIENT_VITAMIN_A,
Field.NUTRIENT_VITAMIN_C,
Field.NUTRIENT_CALCIUM,
Field.NUTRIENT_IRON
};
// Then for reading data
public someMethodForReading(long startTime, long endTime) {
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(DataType.TYPE_NUTRITION, DataType.AGGREGATE_NUTRITION_SUMMARY)
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS).build();
DataReadResult dataReadResult = Fitness.HistoryApi.readData(googleFitManager.getGoogleApiClient(), readRequest)
.await(1, TimeUnit.MINUTES);
for (Bucket bucket : dataReadResult.getBuckets()) {
List<DataSet> dataSets = bucket.getDataSets();
for (DataSet dataSet : dataSets) {
// Getting individual datapoints (one for each date)
for (DataPoint dp : dataSet.getDataPoints()) {
Value nutrients = dp.getValue((Field.FIELD_NUTRIENTS));
Date date = new Date(dp.getStartTime(TimeUnit.MILLISECONDS));
HashMap<String, Float> nutrients = getNutrientsAsMap(nutrients);
// Do something with your data
// ...
}
}
}
}
// The method where the 'magic' happens
private HashMap<String, Float> getNutrientsAsMap(Value nutrients) {
HashMap<String, Float> nutrientsMap = new HashMap<>();
for (String nutrientKey : NUTRIENTS_SET) {
try {
Float nutrientVal = nutrients.getKeyValue(nutrientKey);
nutrientsMap.put(nutrientKey, nutrientVal);
} catch (Exception e) {
}
}
return nutrientsMap;
}