Flutter如何从Google Fit(安卓)与iOS Health获取消耗卡路里数据?
在Flutter中通过Health包获取安卓/iOS设备的卡路里消耗数据
要通过Flutter的Health包获取卡路里消耗数据,需要针对安卓和iOS平台分别配置权限,并正确调用对应的健康数据类型接口,以下是具体实现步骤:
1. 平台权限配置
iOS
在Info.plist中添加健康权限描述,说明应用访问健康数据的用途:
<key>NSHealthShareUsageDescription</key> <string>需要访问您的健康数据以计算卡路里消耗</string> <key>NSHealthUpdateUsageDescription</key> <string>需要访问您的健康数据以计算卡路里消耗</string>
安卓
在AndroidManifest.xml中添加所需权限(适配安卓10及以上版本):
<uses-permission android:name="android.permission.READ_HEALTH_DATA" /> <uses-permission android:name="android.permission.WRITE_HEALTH_DATA" /> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
2. 代码实现
Health包支持两种核心卡路里数据类型:
HealthDataType.activeEnergyBurned:活动过程中消耗的卡路里HealthDataType.basalEnergyBurned:基础代谢消耗的卡路里(部分设备可能不提供)
以下是完整的获取示例:
import 'package:health/health.dart'; Future<void> fetchCalories() async { // 初始化Health实例 final health = Health(); // 定义需要获取的卡路里数据类型 final calorieTypes = [ HealthDataType.activeEnergyBurned, HealthDataType.basalEnergyBurned, ]; // 请求权限 final hasPermissions = await health.requestAuthorization(calorieTypes); if (!hasPermissions) { print("未获取到健康数据权限"); return; } try { // 设置时间范围(示例:获取过去24小时的数据) final endDate = DateTime.now(); final startDate = endDate.subtract(const Duration(hours: 24)); // 获取健康数据 final healthData = await health.getHealthDataFromTypes( startDate, endDate, calorieTypes, ); // 计算总卡路里消耗 double totalCalories = 0; for (final dataPoint in healthData) { // 注意:部分平台返回的单位是焦耳,需转换为千卡(1千卡 = 4184焦耳) final value = (dataPoint.value as num).toDouble(); final convertedValue = dataPoint.unit == HealthUnit.joule ? value / 4184 : value; totalCalories += convertedValue; } print("总卡路里消耗:${totalCalories.toStringAsFixed(2)} kcal"); } catch (e) { print("获取卡路里数据失败:$e"); } }
3. 注意事项
- iOS设备上,需确保用户在「健康」App中已授权应用访问卡路里数据;安卓设备需确保Google Fit(或系统健康服务)已授权应用。
- 部分安卓设备可能不提供
basalEnergyBurned数据,仅能获取活动消耗的卡路里,需做好空值兼容。 - 不同平台返回的单位可能不同(iOS通常返回千卡,安卓部分设备返回焦耳),需根据
HealthUnit进行单位转换。
内容的提问来源于stack exchange,提问作者AndyC
相关产品推荐
相关产品推荐

