Google FIT: получение типа продуктов питания (например, банан, молоко, макаронные изделия, чай и т. Д.) И типа питания (например, завтрак, обед, закуски и ужин)

Можем ли мы получить тип продукта (например, банан, молоко, макаронные изделия, чай и т. Д.) И тип пищи (например, завтрак, обед, закуски и ужин), когда продукт потребляется с помощью Google Fit API?

Данные о питании вводятся через MyFitnessPal.

На данный момент я могу получать только данные о питательных веществах и общее количество потребляемых калорий с помощью Google Fit API.

Пожалуйста, направьте меня к какой-либо документации, ссылкам или статьям, если эта функция существует в Google Fit Я вижу, что в документации указаны типы, упомянутые здесь, но не уверен, как их получить. Любая помощь приветствуется. Спасибо!

1 ответ

Я вижу, что в документации указаны типы, упомянутые здесь, но не уверен, как их получить.

Если вы прочитаете ту же самую ссылку на документ, которую вы указали, вы увидите, что к этим полям можно получить доступ с помощью DataPoint.getValue (Field).

Этот класс содержит константы, представляющие имена полей общих типов данных, каждый из которых имеет префикс FIELD_. Их можно использовать для доступа и установки полей через DataPoint.getValue(Field).

Некоторые фрагменты кода его использования можно найти здесь:

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);

It is currently very cumbersome, since they don't provide a method to convert a Value to HashMap<String, Float>, which would be needed to get the nutrients field in a manageable way.https://developers.google.com/android/reference/com/google/android/gms/fitness/data/Value

The API provides asActivity, asFloat, asInt and asString methods to convert a Value, but in case of a Map, unfortunately you can only ask for individual keys, using getKeyValue.

This is my current approach. I actually feel dirty about needing to go through a predefined list of keys and use try-catch statements, but an exception is what you get when you ask for inexistent keys in the 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;
    }
Другие вопросы по тегам