Flutter心率监测插件heart_bpm的使用

Flutter心率监测插件heart_bpm的使用

heart_bpm 是一个用于通过智能手机摄像头测量心率(以每分钟心跳次数表示)的Widget。

工作原理

覆盖摄像头镜头的手指可以让摄像头检测到皮肤色调的细微变化。这些变化与指尖下方动脉的血流变化成正比。这又与心跳有关。因此,皮肤色调的变化可以近似为心跳实例。测量两个峰值之间的时间差可以得到 每分钟心跳次数

这些值并不稳定,因此实现了一个 指数移动平均滤波器。平滑因子α可以通过调用的widget从用户处控制。

实现

要访问摄像头,该模块利用了 camera 包。因此,使用此包的要求与使用该包的要求相同。

Android

最低Android SDK版本为21:

在你的 android/app/build.gradle 文件中更改最低Android SDK版本为21(或更高)。

minSdkVersion 21
iOS

需要iOS 10.0或更高的版本才能使用摄像头插件。如果编译版本低于10.0,请确保在使用摄像头插件之前检查iOS版本。例如,使用 device_info 插件。

向文件 ios/Runner/Info.plist 添加两行:

  • 一个带有 Privacy - Camera Usage Description 键和描述。
  • 另一个带有 Privacy - Microphone Usage Description 键和描述。

或者以文本格式添加键:

<key>NSCameraUsageDescription</key>
<string>Heart BPM插件需要使用摄像头来测量你的心率。</string>
<key>NSMicrophoneUsageDescription</key>
<string>我可以使用麦克风吗?</string>

虽然麦克风键是必需的,但功能并未使用且未启用音频。

入门指南

该模块可以通过将其作为Widget访问来使用。

  1. 导入模块:
import 'package:heart_bpm/heart_bpm.dart';
  1. 访问Widget:
/// 存储原始数据的列表
List<SensorValue> data = [];

/// 存储测量的BPM值的变量
int bpmValue;

[@override](/user/override)
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Heart BPM Demo'),
    ),
    body: Column(
      children: [
        isBPMEnabled ? HeartBPMDialog(
            context: context,
            onRawData: (value) {
              setState(() {
                // 将原始数据点添加到列表中,最大长度为100
                if (data.length == 100)
                  data.removeAt(0);
                data.add(value);
              });
            },
            onBPM: (value) => setState(() {
              bpmValue = value;
            }),
          )
          : SizedBox(),
        Center(
          child: ElevatedButton.icon(
            icon: Icon(Icons.favorite_rounded),
            label: Text(isBPMEnabled
                ? "停止测量" : "测量BPM"),
            onPressed: () => setState(() =>
                isBPMEnabled = !isBPMEnabled
            ),
          ),
        ),
      ],
    ),
  );
}

更多关于Flutter心率监测插件heart_bpm的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter心率监测插件heart_bpm的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


heart_bpm 是一个用于 Flutter 的插件,可以帮助你在应用中实现心率监测功能。它通常与设备的传感器(如摄像头或光电容积描记法传感器)结合使用,通过分析用户的皮肤颜色变化来计算心率。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 heart_bpm 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  heart_bpm: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装插件。

使用插件

1. 导入包

import 'package:heart_bpm/heart_bpm.dart';

2. 初始化 HeartBPM

final heartBPM = HeartBPM();

3. 开始监测心率

你可以使用 start() 方法来开始心率监测。通常,你需要提供一个视频流或图像流来让插件分析。

// 假设你有一个摄像头流
CameraController cameraController = CameraController(
  // 初始化摄像头
);

await cameraController.initialize();

// 开始心率监测
heartBPM.start(
  onBPM: (double bpm) {
    print('当前心率: $bpm');
  },
  onError: (String error) {
    print('发生错误: $error');
  },
  cameraController: cameraController,
);

4. 停止监测

当你不再需要监测心率时,可以调用 stop() 方法来停止监测。

heartBPM.stop();

示例代码

以下是一个完整的示例代码,展示了如何使用 heart_bpm 插件来监测心率:

import 'package:flutter/material.dart';
import 'package:heart_bpm/heart_bpm.dart';
import 'package:camera/camera.dart';

class HeartRateMonitor extends StatefulWidget {
  [@override](/user/override)
  _HeartRateMonitorState createState() => _HeartRateMonitorState();
}

class _HeartRateMonitorState extends State<HeartRateMonitor> {
  HeartBPM heartBPM = HeartBPM();
  CameraController cameraController;
  double bpm = 0.0;

  [@override](/user/override)
  void initState() {
    super.initState();
    _initializeCamera();
  }

  Future<void> _initializeCamera() async {
    final cameras = await availableCameras();
    cameraController = CameraController(cameras[0], ResolutionPreset.medium);
    await cameraController.initialize();
  }

  void _startMonitoring() {
    heartBPM.start(
      onBPM: (double bpm) {
        setState(() {
          this.bpm = bpm;
        });
      },
      onError: (String error) {
        print('Error: $error');
      },
      cameraController: cameraController,
    );
  }

  void _stopMonitoring() {
    heartBPM.stop();
  }

  [@override](/user/override)
  void dispose() {
    heartBPM.stop();
    cameraController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('心率监测'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '心率: ${bpm.toStringAsFixed(1)} BPM',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _startMonitoring,
              child: Text('开始监测'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _stopMonitoring,
              child: Text('停止监测'),
            ),
          ],
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: HeartRateMonitor(),
));
回到顶部