Flutter健康数据访问插件health_kit的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter健康数据访问插件health_kit的使用

插件简介

health_kit 是一个用于读取 iOS 和 Android 设备上健康和健身数据的插件。它提供了访问用户步数、心率等健康数据的功能。

使用方法

要使用此插件,请在 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  health_kit: ^x.x.x

开始使用

1 Android

  • 首先,确保已启用 Google Fit API 并获取 OAuth 2.0 客户端 ID。

  • Info.plist 中添加以下条目:

    <key>NSHealthShareUsageDescription</key>
    <string>We will sync your data with the Apple Health app to give you better insights</string>
    <key>NSHealthUpdateUsageDescription</key>
    <string>We will sync your data with the Apple Health app to give you better insights</string>
    
  • 然后,在项目的 Capabilities 标签中启用 “HealthKit”。

  • iOS

    • 启用 HealthKit 服务。

示例代码

下面是一个完整的示例代码,展示了如何使用 health_kit 插件来获取昨天的步数数据。

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:health_kit/health_kit.dart';

void main() {
  runApp(MyApp());
}

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

class _MyAppState extends State<MyApp> {
  var total = 0.0;

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Health Kit'),
        ),
        body: Container(
          width: double.infinity,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              TextButton(
                child: Text("Get Yesterday's Step count"),
                onPressed: () async {
                  getYesterdayStep();
                },
              ),
              Text(total.toString()),
            ],
          ),
        ),
      ),
    );
  }

  Future<bool> readPermissionsForHealthKit() async {
    try {
      final responses = await HealthKit.hasPermissions([DataType.STEP_COUNT]);

      if (!responses) {
        final value = await HealthKit.requestPermissions([DataType.STEP_COUNT]);

        return value;
      } else {
        return true;
      }
    } on UnsupportedException catch (e) {
      // 抛出异常时打印错误信息
      print(e);
      return false;
    }
  }

  void getYesterdayStep() async {
    var permissionsGiven = await readPermissionsForHealthKit();

    if (permissionsGiven) {
      var current = DateTime.now();

      var dateFrom = DateTime.now().subtract(Duration(
        hours: current.hour + 24,
        minutes: current.minute,
        seconds: current.second,
      ));
      var dateTo = dateFrom.add(Duration(
        hours: 23,
        minutes: 59,
        seconds: 59,
      ));

      print('dateFrom: $dateFrom');
      print('dateTo: $dateTo');

      try {
        var results = await HealthKit.read(
          DataType.STEP_COUNT,
          dateFrom: dateFrom,
          dateTo: dateTo,
        );
        if (results != null) {
          for (var result in results) {
            total += result.value;
          }
        }
        setState(() {});
        print('value: $total');
      } on Exception catch (ex) {
        print('Exception in getYesterdayStep: $ex');
      }
    }
  }
}

更多关于Flutter健康数据访问插件health_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter健康数据访问插件health_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用health_kit插件来访问健康数据的示例代码。这个示例将展示如何请求权限并读取用户的步数数据。

首先,确保你已经在pubspec.yaml文件中添加了health_kit依赖:

dependencies:
  flutter:
    sdk: flutter
  health_kit: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,按照以下步骤配置和使用health_kit插件:

  1. 配置iOS权限

    ios/Runner/Info.plist文件中添加以下权限请求:

    <key>NSHealthShareUsageDescription</key>
    <string>App needs access to HealthKit.</string>
    <key>NSHealthUpdateUsageDescription</key>
    <string>App needs access to HealthKit.</string>
    

    同时,确保在Xcode中启用了HealthKit功能。

  2. 配置Android权限

    android/app/src/main/AndroidManifest.xml文件中添加以下权限请求:

    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
    

    并在android/app/build.gradle文件中添加以下配置以支持HealthKit(对于Android,主要是同步数据到Google Fit,然后通过Google Fit API访问数据,但health_kit插件本身在Android上依赖Google Fit):

    implementation 'com.google.android.gms:play-services-fitness:20.0.0'
    
  3. 请求权限并读取步数数据

    在你的Dart代码中,你可以按照以下方式使用health_kit插件:

    import 'package:flutter/material.dart';
    import 'package:health_kit/health_kit.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      HealthKit? _healthKit;
      List<HealthKitType>? _types;
      List<HealthKitSample>? _samples;
    
      @override
      void initState() {
        super.initState();
        _initHealthKit();
      }
    
      Future<void> _initHealthKit() async {
        _healthKit = HealthKit(
          options: HealthKitOptions(
            types: [
              HealthKitType.stepCount,
            ],
          ),
        );
    
        // 请求权限
        bool isAuthorized = await _healthKit!.requestAuthorization();
        if (isAuthorized) {
          // 读取数据
          _samples = await _healthKit!.querySamples(
            types: [HealthKitType.stepCount],
            startDate: DateTime.now().subtract(Duration(days: 7)),
            endDate: DateTime.now(),
          );
          setState(() {});
        } else {
          print('用户拒绝了权限请求');
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Health Kit Example'),
            ),
            body: Center(
              child: _samples != null
                  ? ListView.builder(
                      itemCount: _samples!.length,
                      itemBuilder: (context, index) {
                        HealthKitSample sample = _samples![index];
                        DateTime dateTime = sample.endDate!;
                        double value = sample.value!.toDouble();
                        return ListTile(
                          title: Text('日期: $dateTime'),
                          subtitle: Text('步数: $value'),
                        );
                      },
                    )
                  : Text('加载中...'),
            ),
          ),
        );
      }
    }
    

在这个示例中,我们首先初始化HealthKit实例并请求用户授权访问步数数据。如果用户授予权限,我们将查询过去7天内的步数数据,并在UI中显示。

请注意,实际开发中你需要处理更多的边缘情况和错误处理,这里仅提供了一个基本的示例。同时,由于health_kit插件在不同平台上的实现可能有差异(特别是Android和iOS),请确保查阅官方文档以获取最新的配置和使用指南。

回到顶部