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访问来使用。
- 导入模块:
import 'package:heart_bpm/heart_bpm.dart';
- 访问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
更多关于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(),
));