在 Flutter 中使用 Google fit API

2023-11-23

我需要我的应用程序从 Google Fit 读取步数。我正在使用 health 3.05 包。现在我复制了示例代码以查看它是否有效,不幸的是它无效。当然,我执行了这个包自述文件中的每一步。我设置了 OAuth2 客户端 ID,我更改了 gradle.properties,如它们所示,并在 AndroidManifest.xml 中放置<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>。但是,运行应用程序后,我没有获得任何权限窗口,当我单击按钮获取数据时,我在控制台中收到错误“未授予授权”。我应该怎么办?谢谢

这是我从包示例中复制的代码:

import 'dart:async';

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

class DailyStepsScreen extends StatefulWidget {
  @override
  _DailyStepsScreenState createState() => _DailyStepsScreenState();
}

enum AppState {
  DATA_NOT_FETCHED,
  FETCHING_DATA,
  DATA_READY,
  NO_DATA,
  AUTH_NOT_GRANTED
}

class _DailyStepsScreenState extends State<DailyStepsScreen> {
  List<HealthDataPoint> _healthDataList = [];
  AppState _state = AppState.DATA_NOT_FETCHED;

  @override
  void initState() {
    super.initState();
  }


  Future<void> fetchData() async {
    /// Get everything from midnight until now
    DateTime startDate = DateTime(2020, 11, 07, 0, 0, 0);
    DateTime endDate = DateTime(2025, 11, 07, 23, 59, 59);

    HealthFactory health = HealthFactory();

    /// Define the types to get.
    List<HealthDataType> types = [
      HealthDataType.STEPS,
      HealthDataType.WEIGHT,
      HealthDataType.HEIGHT,
      HealthDataType.BLOOD_GLUCOSE,
      HealthDataType.DISTANCE_WALKING_RUNNING,
    ];

    setState(() => _state = AppState.FETCHING_DATA);

    /// You MUST request access to the data types before reading them
    bool accessWasGranted = await health.requestAuthorization(types);

    int steps = 0;

    if (accessWasGranted) {
      try {
        /// Fetch new data
        List<HealthDataPoint> healthData =
        await health.getHealthDataFromTypes(startDate, endDate, types);

        /// Save all the new data points
        _healthDataList.addAll(healthData);
      } catch (e) {
        print("Caught exception in getHealthDataFromTypes: $e");
      }

      /// Filter out duplicates
      _healthDataList = HealthFactory.removeDuplicates(_healthDataList);

      /// Print the results
      _healthDataList.forEach((x) {
        print("Data point: $x");
        steps += x.value.round();
      });

      print("Steps: $steps");

      /// Update the UI to display the results
      setState(() {
        _state =
        _healthDataList.isEmpty ? AppState.NO_DATA : AppState.DATA_READY;
      });
    } else {
      print("Authorization not granted");
      setState(() => _state = AppState.DATA_NOT_FETCHED);
    }
  }

  Widget _contentFetchingData() {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Container(
            padding: EdgeInsets.all(20),
            child: CircularProgressIndicator(
              strokeWidth: 10,
            )),
        Text('Fetching data...')
      ],
    );
  }

  Widget _contentDataReady() {
    return ListView.builder(
        itemCount: _healthDataList.length,
        itemBuilder: (_, index) {
          HealthDataPoint p = _healthDataList[index];
          return ListTile(
            title: Text("${p.typeString}: ${p.value}"),
            trailing: Text('${p.unitString}'),
            subtitle: Text('${p.dateFrom} - ${p.dateTo}'),
          );
        });
  }

  Widget _contentNoData() {
    return Text('No Data to show');
  }

  Widget _contentNotFetched() {
    return Text('Press the download button to fetch data');
  }

  Widget _authorizationNotGranted() {
    return Text('''Authorization not given.
        For Android please check your OAUTH2 client ID is correct in Google Developer Console.
         For iOS check your permissions in Apple Health.''');
  }

  Widget _content() {
    if (_state == AppState.DATA_READY)
      return _contentDataReady();
    else if (_state == AppState.NO_DATA)
      return _contentNoData();
    else if (_state == AppState.FETCHING_DATA)
      return _contentFetchingData();
    else if (_state == AppState.AUTH_NOT_GRANTED)
      return _authorizationNotGranted();

    return _contentNotFetched();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
          appBar: AppBar(
            title: const Text('Plugin example app'),
            actions: <Widget>[
              IconButton(
                icon: Icon(Icons.file_download),
                onPressed: () {
                  fetchData();
                },
              )
            ],
          ),
          body: Center(
            child: _content(),
          )
    );

  }
}

Step 1 use health: 3.0.4

Step 2正确设置 OAuth2 客户端 ID,下载新的 google-service.json

Step 3从 Android 10 开始,您必须添加ACTIVITY_RECOGNITION获得 STEP Count 许可AndroidManifest.xml.

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

Step 4然后使用权限处理程序请求许可。

if (Platform.isAndroid) {
  final permissionStatus = Permission.activityRecognition.request();
  if (await permissionStatus.isDenied ||
      await permissionStatus.isPermanentlyDenied) {
    showToast(
        'activityRecognition permission required to fetch your steps count');
    return;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Flutter 中使用 Google fit API 的相关文章

  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 以编程方式将文本颜色设置为主要 Android 文本视图

    如何设置我的文本颜色TextView to android textColorPrimary以编程方式 我已经尝试了下面的代码 但它将 textColorPrimary 和 textColorPrimary Inverse 的文本颜色始终设
  • NoSuchMethodError:尝试调用非函数,例如 null:'dart.global.firebase.auth'

    Flutter 新手 我怀疑在尝试设置 Firebase Auth 时错过了一些非常简单的事情 一直在网上寻找解决方案 大多数人要求您仔细检查 firebase auth js 是否正确包含在 index html 文件中 这样就完成了 下
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android:后台Activity可以执行代码吗?

    后台的活动是否被视为 正在运行 并且可以执行代码 还是处于挂起状态 他们暂停了 活动生命周期 http developer android com reference android app Activity html ActivityLi
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 我的应用程序中的后退按钮出现问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在手机关闭时清除共享首选项值 你

随机推荐

  • WordPress:在显示链接之前检查是否有以前的帖子

    我使用以下代码在我的 WordPress 博客上显示 以前的帖子 链接
  • 单元测试新手

    我想知道如何使用 Visual Studio 2008 net 2 0 在现有 相当大 的应用程序中实现单元测试 我知道为现有 遗留代码开发单元测试是不现实的 但我希望对代码进行测试 我找到了大量关于如何编写代码测试的示例 但没有找到关于如
  • SMTP Indy 组件安全和身份验证属性有什么作用?

    我正在使用 indy 组件在 delphi 应用程序中实现电子邮件 我专门使用 TidSMTP 组件 我需要有效地支持所有主要的电子邮件服务器 我使用 Mozilla Thunderbird 作为我的电子邮件客户端 并将 smtp 属性与
  • Ply Lex 解析问题

    我使用 ply 作为我的 lex 解析器 我的规格如下 t WHILE r while t THEN r then t ID r a zA Z a zA Z0 9 t NUMBER r d t LESSEQUAL r lt t ASSIGN
  • 在 ASP.NET 中实现文件下载时如何处理我的文件流?

    我有课DocumentGenerator其中包含一个MemoryStream 所以我已经实施了IDisposable在课堂上 但我不知道如何 在哪里可以处置它 这是我当前的代码 它在 MVC 中执行文件下载 using DocumentGe
  • 为什么 Console.ReadKey() 会阻止另一个线程中调用的 Console.WriteLine 的输出?

    我有一个非常简单的控制台应用程序 static void Main string args DoAsync Console ReadKey Here DoAsync启动一组任务并返回 不等待任务完成 每个任务都会写入控制台 但在按下按键之前
  • 如何在 Magento 中找到合适的事件?

    有时 当寻找方便的事件来挂钩时 我会进行一些探索性编程 Modify Mage dispatchEvent加上这个额外的行 Mage log name implode array keys data 标记一个我知道我无法更快捕捉到的起点 M
  • 如何将浮点数舍入到给定精度?

    我需要一种方法将浮点数四舍五入到给定的小数位数 但我希望始终向下舍入 例如 代替 gt gt gt round 2 667 2 2 67 我宁愿 gt gt gt round down 2 667 2 2 66 你有一个朋友在quantiz
  • 如何在 Access 中“链接”链接表?

    我的场景 计算机 A 有一个包含链接表的 Access 数据库 这些链接表实际上驻留在计算机 B 上的另一个 Access 数据库中 还没有什么异常 现在我们创建一个 SQL Server 数据库 并与计算机 B 上的 Access 数据库
  • 当我的类具有静态成员时,为什么我的 C++ 程序无法链接?

    我有一个名为 Stuff 的小类 我想在其中存储东西 这些东西是 int 类型的列表 在我使用的任何类中的整个代码中 我希望能够访问 Stuff 类中的这些内容 主要 cpp include Stuff h int main Stuff t
  • SweetAlert 下拉列表动态添加列表中的项目

    我目前正在使用 sweetalert2 从对话框中捕获用户的输入 我想在链接队列对话框中使用下拉菜单 但我似乎找不到在下拉列表中动态添加项目的方法 假设我想从 JSON 格式检索数据并将其放入下拉列表中 有没有办法做到这一点 functio
  • 如何修复 PlotlyRequestError?

    当我执行代码时 我收到 PlotlyRequestError 无消息 import plotly import plotly plotly as py import plotly graph objs as go Filedata pd r
  • 计算两行之间的时间差

    我正在尝试使用计算两行之间的时间差shift 但我收到意外错误 我可能遗漏了一些明显的东西 df Delta df index df index shift 1 该语句产生一个ValueError Cannot shift with no
  • 在 UIView 上使用 CAGradientLayer 绘制渐变不起作用

    我试图在视图控制器的背景视图上绘制渐变 但由于某种原因我无法让它工作 这是我的方法 它是从viewDidLoad void drawGradient CAGradientLayer gradient CAGradientLayer laye
  • 移动应用程序中的 OAuth 机密

    使用 OAuth 协议时 您需要从要委托的服务获取秘密字符串 如果您在网络应用程序中执行此操作 则可以简单地将机密存储在数据库或文件系统中 但在移动应用程序 或桌面应用程序 中处理它的最佳方法是什么 将字符串存储在应用程序中显然不好 因为有
  • 如何获取 Document 目录中目录的 URL 路径?

    如何获取文档目录中特定目录的 url 路径 like Document Art My code NSURL localRoot if localRoot nil return localRoot NSArray paths NSFileMa
  • 带有模板参数的 Lambda 函数,而不是函数参数

    为什么第一次调用不能编译 auto get1
  • 删除“DerivedData”后,Xcode 将不会添加“嵌入式二进制文件”

    辅助搜索的替代标题 在 Xcode 中添加嵌入式二进制文件失败 Xcode 不会从单独的项目链接框架 由于缺少框架 应用程序在设备上崩溃 但在模拟器中运行 Overview 删除 DerivedData 文件夹 或执行 产品 gt 清理 后
  • 忽略 Dapper 中的属性

    In Dapper 有没有办法忽略模型类中的属性 即使用Insert扩展方法 我的模型类有一组computed未保留在关联表中的属性 好吧 Dapper 没有Insert扩展方法 即在 dapper contrib dapper exten
  • 在 Flutter 中使用 Google fit API

    我需要我的应用程序从 Google Fit 读取步数 我正在使用 health 3 05 包 现在我复制了示例代码以查看它是否有效 不幸的是它无效 当然 我执行了这个包自述文件中的每一步 我设置了 OAuth2 客户端 ID 我更改了 gr