Android端查询Google Fit营养历史仅返回第一条数据,如何获取全日数据?
解答
你遇到的问题可通过以下步骤修复:
- 替换查询接口:
readDailyTotal接口针对营养数据的默认聚合逻辑存在限制,仅返回单条汇总数据而非全量条目,请改用readData接口拉取指定时间范围内的所有独立营养数据点,自行聚合得到完整的单日数据。修改后的参考代码如下:
val nowInMillis = 1625656053000 val weekAgoInMillis = 1625137653000 val fitnessOptions = FitnessOptions.builder() .addDataType(DataType.TYPE_NUTRITION, FitnessOptions.ACCESS_READ) .addDataType(DataType.AGGREGATE_NUTRITION_SUMMARY, FitnessOptions.ACCESS_READ) .build() val account = GoogleSignIn.getAccountForExtension(activity, fitnessOptions) coroutineScope.launch { val readRequest = DataReadRequest.Builder() .read(DataType.TYPE_NUTRITION) .setTimeRange(weekAgoInMillis, nowInMillis, TimeUnit.MILLISECONDS) .build() Fitness.getHistoryClient(activity, account) .readData(readRequest) .addOnSuccessListener { response -> var totalCalories = 0f var totalCarbs = 0f var totalFat = 0f var totalProtein = 0f for (dataSet in response.dataSets) { for (dp in dataSet.dataPoints) { val nutrients = dp.getValue(Field.FIELD_NUTRIENTS) // 累加单条食物的营养数据 totalCalories += nutrients.get(Field.NUTRIENT_CALORIES) ?: 0f totalCarbs += nutrients.get(Field.NUTRIENT_TOTAL_CARBS) ?: 0f totalFat += nutrients.get(Field.NUTRIENT_TOTAL_FAT) ?: 0f totalProtein += nutrients.get(Field.NUTRIENT_PROTEIN) ?: 0f } } // 此处得到的即为单日全量营养总和 Log.i(TAG, "单日总营养:热量=$totalCalories 碳水=$totalCarbs 脂肪=$totalFat 蛋白质=$totalProtein") } .addOnFailureListener { e -> Log.d(TAG, "查询失败", e) } }
- 检查第三方应用同步设置:打开Lose It的设置页,找到Google Fit同步选项,确认开启了「同步所有食物条目」,部分应用默认仅同步单日汇总数据,不会上报每一条食物记录,会导致Google Fit端仅存储部分数据。
- 重新授权权限:卸载应用重装后再次请求Google Fit授权,确保营养数据读取权限被完整授予,避免权限缺失导致部分数据无法读取。
内容的提问来源于stack exchange,提问作者Artyom Okun
相关产品推荐
相关产品推荐

