You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者박종현

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:07:03