Flutter使用health包在Android端获取workout数据时遇登录验证错误
解决Android端使用health包获取WORKOUT数据时的登录验证错误
针对你遇到的Android端获取WORKOUT数据提示"There was an error getting the workout data! 4: The user must be signed in to make this API call."问题,结合你的配置和代码,给出以下针对性解决方案:
1. 检查设备Google账号登录状态
Android端health包依赖Google Fit获取WORKOUT数据,即使权限请求成功,若设备未登录Google账号或Google Fit未关联有效账号,仍会触发登录错误:
- 打开设备设置 > 账号,确认已登录Google账号
- 打开Google Fit应用,确保该账号已关联并正常同步运动数据
2. 补充Google Fit OAuth Scope配置
虽然步数数据正常,但WORKOUT数据需要额外的OAuth权限范围,检查Google Cloud配置:
- 进入Google Cloud控制台,找到你的OAuth 2.0客户端凭证
- 在OAuth同意屏幕中,添加
https://www.googleapis.com/auth/fitness.activity.read权限范围 - 发布更新同意屏幕(测试环境需确保测试账号已添加到允许列表)
3. 验证WORKOUT权限的实际授权状态
requestAuthorization返回Access Granted不代表所有数据类型都成功授权,在授权后添加权限检查代码:
// 授权后检查各数据类型的权限状态 final statuses = await health.getPermissionsStatus(types); for (var entry in statuses.entries) { print("${entry.key}: ${entry.value}"); }
若HealthDataType.WORKOUT对应的权限状态不是HealthDataAccess.READ,则需重新处理授权流程。
4. 补充AndroidManifest配置
除已添加的权限外,需添加Google Play服务相关配置:
<!-- 在<application>标签内添加 --> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
同时针对Android 12+补充WORKOUT相关权限声明:
<uses-permission android:name="android.permission.health.READ_WORKOUT" />
5. 显式触发Google Sign-In验证
部分场景下,health包的授权流程可能未完成Google账号的显式登录验证,可手动添加Google Sign-In流程:
- 在
pubspec.yaml添加依赖:
dependencies: google_sign_in: ^5.4.0
- 实现登录逻辑并在授权前执行:
import 'package:google_sign_in/google_sign_in.dart'; final GoogleSignIn _googleSignIn = GoogleSignIn( scopes: [ 'https://www.googleapis.com/auth/fitness.activity.read', ], ); // 在调用health.requestAuthorization前执行 Future<void> signInWithGoogle() async { try { await _googleSignIn.signIn(); } catch (error) { print("Google Sign-In error: $error"); } }
6. 确认Google Fit服务可用性
- 打开Google Play商店,将Google Fit应用更新至最新版本
- 在设备设置 > 应用 > Google Play服务中确认服务运行正常
内容的提问来源于stack exchange,提问作者kruimeldiev
相关产品推荐
相关产品推荐

