如何在Flutter中获取Galaxy Watch的实时睡眠等健康数据?
Flutter对接Galaxy Watch获取实时健康数据方案解析
可行性说明
完全可行。Galaxy Watch基于Tizen系统,三星提供了官方的健康数据采集与设备连接SDK,Flutter可通过**平台通道(Platform Channel)**调用Android原生API对接这些SDK,实现近乎实时的健康数据传输(心率可做到1秒级间隔,睡眠阶段数据会随Watch的分析结果实时推送)。
核心实现方案
1. Galaxy Watch端配置(Tizen开发)
- 集成三星Health SDK,申请心率、睡眠监测等权限(需在Tizen Manifest中声明,并引导用户在三星健康APP中授权)。
- 配置数据采集策略:心率可设置1秒/次的采集间隔;睡眠阶段由Watch内置算法分析,会在阶段切换时主动推送更新。
- 基于三星Accessory Protocol建立与手机的稳定连接,将采集到的健康数据实时推送至Android端。
2. Android原生层对接
- 集成三星Accessory SDK,监听Watch端的数据推送回调。
- 通过Flutter的
EventChannel建立原生与Flutter的实时数据流通道,将接收到的健康数据(如心率数值、睡眠阶段枚举)封装为Map格式传递给Flutter。
3. Flutter层数据展示与处理
- 用
StreamBuilder监听EventChannel的数据流,实时更新UI。 - 实现异常处理逻辑:如设备断开重连提示、数据解析失败的容错处理。
推荐资源与工具
- 三星官方SDK:优先使用三星Health SDK(Tizen)和Accessory SDK(Android),兼容性与稳定性远高于第三方插件。
- Flutter通道:无需第三方插件,直接通过
MethodChannel/EventChannel封装原生逻辑即可,避免依赖风险。
代码示例
Flutter端核心代码
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: const MyHomePage(title: 'Flutter - Watch : 接收传感器数据'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { // 定义与原生通信的EventChannel static const EventChannel _healthDataChannel = EventChannel('com.example.health_data_channel'); String _heartRate = '0'; String _sleepStage = '未检测'; @override void initState() { super.initState(); _startListeningHealthData(); } // 启动健康数据监听 void _startListeningHealthData() { _healthDataChannel.receiveBroadcastStream().listen((dynamic data) { setState(() { if (data['type'] == 'heartRate') { _heartRate = data['value'].toString(); } else if (data['type'] == 'sleepStage') { _sleepStage = data['value']; } }); }, onError: (dynamic error) { print('健康数据监听错误: $error'); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(widget.title)), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('实时心率:', style: TextStyle(fontSize: 20)), Text('$_heartRate bpm', style: const TextStyle(fontSize: 32, fontWeight: FontWeight.bold)), const SizedBox(height: 40), const Text('睡眠阶段:', style: TextStyle(fontSize: 20)), Text(_sleepStage, style: const TextStyle(fontSize: 28)), ], ), ), ); } }
Android原生端(Kotlin)EventChannel实现
import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.EventChannel class MainActivity : FlutterActivity() { private val HEALTH_DATA_CHANNEL = "com.example.health_data_channel" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) EventChannel(flutterEngine.dartExecutor.binaryMessenger, HEALTH_DATA_CHANNEL).setStreamHandler( object : EventChannel.StreamHandler { private var eventSink: EventChannel.EventSink? = null // 监听三星Accessory SDK推送的健康数据广播 private val healthDataReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { intent?.extras?.let { bundle -> val data = mapOf( "type" to bundle.getString("type"), "value" to bundle.get("value") ) eventSink?.success(data) } } } override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { eventSink = events // 注册广播接收器 registerReceiver(healthDataReceiver, IntentFilter("com.samsung.health.data.RECEIVE")) } override fun onCancel(arguments: Any?) { unregisterReceiver(healthDataReceiver) eventSink = null } } ) } }
注意事项
- 权限配置:Android端需声明
BLUETOOTH、BLUETOOTH_ADMIN、ACCESS_FINE_LOCATION等权限,同时需引导用户在三星健康APP中授予健康数据访问权限。 - 功耗平衡:高频率心率采集会增加Watch功耗,建议根据场景动态调整采集间隔(如运动时1秒/次,静止时5秒/次)。
- 睡眠阶段特性:睡眠阶段由Watch内置算法分析,并非每秒更新,会在进入浅睡、深睡、REM等阶段时推送最新结果。
内容的提问来源于stack exchange,提问作者박종현
相关产品推荐
相关产品推荐

