Flutter集成Google Fit API在Android14三星S23 Ultra上计步异常求助
解决方案:Flutter Google Fit在Android 14(三星S23 Ultra)步数统计失效问题
1. 适配Android 14权限规则
- 在
AndroidManifest.xml中补充必要权限声明:<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Android 14+ 后台服务必备 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH" /> <!-- 健康类前台服务权限 --> - 运行时同时请求活动识别和通知权限:
import 'package:permission_handler/permission_handler.dart'; Future<void> requestRequiredPermissions() async { final activityPerm = await Permission.activityRecognition.request(); final notificationPerm = await Permission.notification.request(); if (!activityPerm.isGranted || !notificationPerm.isGranted) { // 处理权限拒绝后的引导逻辑 } }
2. 修复组件切换时的监听生命周期问题
- 不要将Google Fit监听绑定到单个组件的生命周期:
- 把监听逻辑封装成全局单例服务,或用状态管理工具(Provider/Riverpod)托管,避免组件销毁时监听被意外取消。
- 示例单例服务:
class FitStepTracker { static final FitStepTracker _instance = FitStepTracker._internal(); factory FitStepTracker() => _instance; FitStepTracker._internal(); bool _isListening = false; void startStepListening() { if (_isListening) return; // 初始化Google Fit步数监听逻辑 _isListening = true; } void stopStepListening() { if (!_isListening) return; // 停止监听逻辑 _isListening = false; } } - 在应用根组件监听生命周期,确保后台切换后监听自动恢复:
@override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); if (state == AppLifecycleState.resumed) { FitStepTracker().startStepListening(); } }
3. 解除三星OneUI 6.0的系统限制
- 关闭电池优化:进入「设置 > 电池和设备维护 > 电池 > 后台使用限制 > 你的应用」,开启“允许后台活动”,关闭“深度睡眠”和“电池优化”。
- 检查专属权限:在「设置 > 应用 > 你的应用 > 权限 > 身体活动」中设置为“允许”,同时确认三星健康已授权应用访问步数数据。
- 禁用应用省电模式:确保应用未被加入“省电模式”或“超级省电模式”的白名单外。
4. 优化Google Fit API调用逻辑
- 若需后台持续统计步数,优先使用
HistoryApi拉取历史数据,而非仅依赖SensorsApi的实时监听;如果必须用实时监听,需配合前台服务维持进程存活。 - 避免在组件
initState()中仅初始化一次监听,改用全局服务确保应用生命周期内监听状态稳定。
内容的提问来源于stack exchange,提问作者Tolga DURAN
相关产品推荐
相关产品推荐

