Flutter健康数据同步插件withings_flutter的使用

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

Flutter健康数据同步插件withings_flutter的使用

使用说明

安装WithingsFlutter

要安装WithingsFlutter,请在项目的pubspec.yaml文件的依赖项中添加以下内容:

dependencies:
  withings_flutter: #最新版本

保存后运行flutter pub get以获取该包。

Android平台设置

在Android平台上,你需要在android/app/src/main/AndroidManifest.xml文件中添加以下代码:

<activity android:name="com.linusu.flutter_web_auth.CallbackActivity"
    android:exported="true" >
  <intent-filter android:label="flutter_web_auth">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="CALLBACK_SCHEME" />
  </intent-filter>
</activity>

并将CALLBACK_SCHEME替换为你自己的回调方案(例如example)。

Web平台设置

在Web平台上,你需要创建一个端点来捕获回调URL,并将其发送到应用中。在项目中的./web文件夹下,创建一个名为auth.html的HTML文件,内容如下:

<!DOCTYPE html>
<title>认证完成</title>
<p>认证已完成。如果没有自动关闭,请手动关闭此窗口。</p>
<script>
  window.opener.postMessage({
    'flutter-web-auth': window.location.href
  }, window.location.origin);
  window.close();
</script>

重定向URL应与应用程序运行的URL相同(包括模式、主机和端口),路径应指向创建的HTML文件,例如/auth.htmlcallbackUrlScheme参数在authenticate()方法中不考虑,因此可以使用原生平台的方案。

测试WithingsFlutter

安装完成后,我们可以开始测试WithingsFlutter。在这个示例中,我们将使用WithingsFlutter对我们的应用进行授权,并获取一段时间内的ECG记录和Afib分类列表。

注册你的应用

要使用Withings API执行任何操作,首先需要在Withings开发者门户中注册你的应用并获取两个ID,即Client ID(Client) Secret。以下是步骤:

  1. https://developer.withings.com/dashboard/welcome上选择你的应用将运行的环境。 Withings环境选择

  2. 创建或登录你的Withings帐户。

  3. https://developer.withings.com/dashboard/create上注册新应用,点击按钮+ 创建应用Withings创建应用

  4. 选择集成平面并接受条款和条件。 Withings应用创建

  5. 填写表单:

    • 设置应用名称
    • 设置简短的应用描述(例如,“只是一个简单的测试应用。”)
    • 设置注册URL回调URL(例如,example://withings/auth
    • 上传项目徽标(可选)
    • 点击完成按钮
    • 在随后的页面中复制并保存Client ID(Client) Secret
    • 点击确认按钮,你会看到应用的相关信息摘要,包括:
      • Client ID
      • (Client) Secret
      • Callback URL
      • API Endpoint

应用授权

现在你已经准备好授权你的应用了。只需调用异步方法WithingsConnector.authorize(),在代码中如:

WithingsCredentials? withingsCredentials = await WithingsConnector.authorize(
  clientID: Strings.withingsClientID,
  clientSecret: Strings.withingsClientSecret,
  scope: 'user.activity,user.metrics,user.sleepevents',
  redirectUri: Strings.withingsRedirectUri,
  callbackUrlScheme: Strings.withingsCallbackScheme);

其中:

  • clientID: 获取的Client ID
  • clientSecret: 获取的(Client) Secret
  • scopes: 逗号分隔的字符串列表,表示你想要请求的权限范围
  • redirectUri: 获取的Callback URL,例如'example://withings/auth'
  • callbackUrlScheme: 回调URL方案,例如'example'

这将打开一个网页视图,用户可以在其中输入他们的Withings凭据并登录。登录后,网页视图将关闭,并返回一个包含用于通过withings_flutter向Withings Web API发起请求的凭据的WithingsCredentials?实例。具体地,withingsCredentials.userID包含刚刚授权的用户的Withings用户ID,withingsCredentials.withingsAccessToken包含Withings访问令牌,withingsCredentials.withingsRefreshToken包含Withings刷新令牌,withingsCredentials.expires定义了访问令牌的有效期延迟(秒)。

⚠️ 凭证不会自动存储在持久位置。你必须根据你的策略管理这些凭证。

获取ECG记录和Afib分类

授权应用后,你可以开始从Withings获取数据。在这个示例中,我们将获取一段时间内的ECG记录和Afib分类列表。

首先实例化一个WithingsHeartListDataManager

WithingsHeartListDataManager withingsHeartListDataManager =
    WithingsHeartListDataManager();

然后使用WithingsHeartListDataManagerfetch方法获取所需数据,使用正确的WithingsHeartAPIURL

WithingsHeartListData listheartdata = await withingsHeartListDataManager
    .fetch(WithingsHeartAPIURL.list(accessToken: withingsCredentials.accessToken));

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

1 回复

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


当然,以下是一个关于如何使用 withings_flutter 插件来同步健康数据的示例代码。这个插件允许你与 Withings API 交互,从而获取用户的健康数据。

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

dependencies:
  flutter:
    sdk: flutter
  withings_flutter: ^最新版本号 # 请替换为最新的版本号

然后,运行 flutter pub get 来获取依赖。

接下来,你需要配置 Withings API 的客户端凭证。这通常包括一个消费者密钥(Consumer Key)和消费者秘密(Consumer Secret)。你需要从 Withings 开发者门户注册并获取这些凭证。

以下是一个示例代码,展示如何使用 withings_flutter 插件来同步健康数据:

import 'package:flutter/material.dart';
import 'package:withings_flutter/withings_flutter.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  WithingsClient? _withingsClient;
  String? _accessToken;
  String? _userId;
  String? _measureData;

  @override
  void initState() {
    super.initState();
    // 初始化 WithingsClient
    _initWithingsClient();
  }

  void _initWithingsClient() {
    final consumerKey = '你的消费者密钥';
    final consumerSecret = '你的消费者秘密';
    _withingsClient = WithingsClient(consumerKey, consumerSecret);

    // 在这里你可以实现 OAuth2 授权流程来获取 accessToken 和 userId
    // 这里假设你已经有了 accessToken 和 userId
    _accessToken = '你的访问令牌';
    _userId = '用户ID';

    // 使用 accessToken 和 userId 获取健康数据
    _fetchMeasureData();
  }

  void _fetchMeasureData() async {
    if (_withingsClient != null && _accessToken != null && _userId != null) {
      try {
        final measures = await _withingsClient!.getMeasures(
          accessToken: _accessToken!,
          userId: _userId!,
          measureTypes: ['weight', 'height'], // 你可以根据需要添加其他测量类型
          startDate: DateTime.now().subtract(Duration(days: 365)), // 过去一年的数据
          endDate: DateTime.now(),
        );
        setState(() {
          _measureData = measures.toJson().toString();
        });
      } catch (e) {
        print('Error fetching measures: $e');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Withings Flutter Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              if (_measureData != null)
                Text(
                  'Measure Data:\n$_measureData',
                  style: TextStyle(fontSize: 16),
                ),
              ElevatedButton(
                onPressed: () {
                  // 这里可以放置重新获取数据的按钮逻辑,如果需要的话
                },
                child: Text('Refresh Data'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  1. 在实际使用中,你需要实现完整的 OAuth2 授权流程来获取 accessTokenuserId。这通常涉及重定向用户到 Withings 的授权页面,并处理返回的授权码以获取访问令牌。

  2. 上面的代码假设你已经有了 accessTokenuserId,并且直接调用 getMeasures 方法来获取健康数据。

  3. 你需要根据你的需求调整 measureTypesstartDateendDate 参数。

  4. 请确保你遵守 Withings API 的使用条款和限制。

  5. 在生产环境中,不要硬编码 consumerKeyconsumerSecret。考虑使用环境变量或安全的密钥管理服务来存储这些敏感信息。

回到顶部