0

我想让我的应用程序的用户添加他们吃的食物的信息,我需要将营养信息保存到谷歌健康历史。我已连接到谷歌播放服务,我希望我请求正确的 API 和范围。

mClient = new GoogleApiClient.Builder(this)
                .addApi(Fitness.HISTORY_API)
                .addScope(new Scope(Scopes.FITNESS_NUTRITION_READ_WRITE))
                ...

但是找不到任何好的示例如何将包含所有营养信息的数据添加到用户谷歌适合历史记录。我想我需要使用 com.google.nutrition DATA_TYPE并以某种方式填写所有字段,但是没有代码片段可以准确地告诉我如何做到这一点。

谢谢你的帮助

4

2 回答 2

0

事实证明,毕竟google fit doc中有一些东西。创建你的香蕉:

 DataSource nutritionSource = new DataSource.Builder()
     .setDataType(TYPE_NUTRITION)
     ...
     .build();

 DataPoint banana = DataPoint.create(nutritionSource);
 banana.setTimestamp(now.getMillis(), MILLISECONDS);
 banana.getValue(FIELD_FOOD_ITEM).setString("banana");
 banana.getValue(FIELD_MEAL_TYPE).setInt(MEAL_TYPE_SNACK);
 banana.getValue(FIELD_NUTRIENTS).setKeyValue(NUTRIENT_TOTAL_FAT, 0.4f);
 banana.getValue(FIELD_NUTRIENTS).setKeyValue(NUTRIENT_SODIUM, 1f);
 banana.getValue(FIELD_NUTRIENTS).setKeyValue(NUTRIENT_POTASSIUM, 422f);

然后你可能想保存你的香蕉:

DataSet dataSet = DataSet.create(nutritionSource);
dataSet.add(banana);
PendingResult<Status> result = Fitness.HistoryApi.insertData(mClient, dataSet);
于 2015-06-16T21:45:36.787 回答
0

读一些香蕉:

    // 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()) {
                    Date date = new Date(dp.getStartTime(TimeUnit.MILLISECONDS));
                    String foodItem = dp.getValue(FIELD_FOOD_ITEM).asString();
                    int mealType = dp.getValue(FIELD_MEAL_TYPE).asInt();

                    Value nutrients = dp.getValue((Field.FIELD_NUTRIENTS));

                    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;
    }
于 2019-07-31T10:16:52.223 回答