Flutter步数统计插件daily_pedometer2的使用

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

Flutter步数统计插件daily_pedometer2的使用

daily_pedometer2 是一个用于Flutter应用中进行步数统计的插件。它支持连续步数统计、每日步数统计以及行人的状态(如行走或停止)。此插件利用了iOS和Android设备内置的计步传感器API。

权限设置

Android

对于Android 10及以上版本,需要在AndroidManifest.xml文件中添加以下权限:

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

iOS

对于iOS,需要在Xcode项目的Info.plist文件中添加以下条目:

<key>NSMotionUsageDescription</key>
<string>This application tracks your steps</string>
<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
</array>

功能介绍

  • 每日步数:表示当天走过的步数。
  • 步数统计:自系统上次启动以来所走的步数。
  • 行人状态:包括“行走”、“停止”,若发生错误则为“未知”。

示例Demo

下面是一个完整的示例代码,展示了如何使用daily_pedometer2插件来获取步数信息和行人状态,并将其显示在界面上。

import 'dart:developer';

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:daily_pedometer2/daily_pedometer2.dart';
import 'package:permission_handler/permission_handler.dart';

String formatDate(DateTime d) {
  return d.toString().substring(0, 19);
}

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

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

class _MyAppState extends State<MyApp> {
  late Stream<StepCount> _dailyStepCountStream;
  late Stream<StepCount> _stepCountStream;
  late Stream<PedestrianStatus> _pedestrianStatusStream;
  String _status = '?', _steps = '?', _dailySteps = '?';

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

  void onDailyStepCount(StepCount event) {
    print(event);
    setState(() {
      _dailySteps = event.steps.toString();
    });
  }

  void onStepCount(StepCount event) {
    print(event);
    setState(() {
      _steps = event.steps.toString();
    });
  }

  void onPedestrianStatusChanged(PedestrianStatus event) {
    print(event);
    setState(() {
      _status = event.status;
    });
  }

  void onPedestrianStatusError(error) {
    print('onPedestrianStatusError: $error');
    setState(() {
      _status = 'Pedestrian Status not available';
    });
    print(_status);
  }

  void onStepCountError(error) {
    print('onStepCountError: $error');
    setState(() {
      _steps = 'Step Count not available';
    });
  }

  void onDailyStepCountError(error) {
    print('onDailyStepCountError: $error');
    setState(() {
      _dailySteps = 'Daily Step Count not available';
    });
  }

  void initPlatformState() async {
    log('INITIALIZING THE STREAMS');

    if (await Permission.activityRecognition.isDenied) {
      await Permission.activityRecognition.request();
    }
    if (!await Permission.activityRecognition.isGranted) return;

    _pedestrianStatusStream = DailyPedometer2.pedestrianStatusStream;
    _pedestrianStatusStream
        .listen(onPedestrianStatusChanged)
        .onError(onPedestrianStatusError);

    _stepCountStream = DailyPedometer2.stepCountStream;
    _stepCountStream.listen(onStepCount).onError(onStepCountError);

    _dailyStepCountStream = DailyPedometer2.dailyStepCountStream;
    _dailyStepCountStream
        .listen(onDailyStepCount)
        .onError(onDailyStepCountError);

    if (!mounted) return;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Pedometer Example'),
        ),
        body: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Steps Taken',
                style: TextStyle(fontSize: 30),
              ),
              Text(
                _steps,
                style: TextStyle(fontSize: 60),
              ),
              Divider(
                height: 100,
                thickness: 0,
                color: Colors.white,
              ),
              Text(
                'Daily Steps',
                style: TextStyle(fontSize: 30),
              ),
              Text(
                _dailySteps,
                style: TextStyle(fontSize: 60),
              ),
              Divider(
                height: 100,
                thickness: 0,
                color: Colors.white,
              ),
              Text(
                'Pedestrian Status',
                style: TextStyle(fontSize: 30),
              ),
              Icon(
                _status == 'walking'
                    ? Icons.directions_walk
                    : _status == 'stopped'
                        ? Icons.accessibility_new
                        : Icons.error,
                size: 100,
              ),
              Center(
                child: Text(
                  _status,
                  style: _status == 'walking' || _status == 'stopped'
                      ? TextStyle(fontSize: 30)
                      : TextStyle(fontSize: 20, color: Colors.red),
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何初始化步数和行人状态的流,并通过监听这些流来更新UI。确保在运行此应用之前已正确设置了所需的权限。


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

1 回复

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


当然,以下是如何在Flutter项目中使用daily_pedometer2插件来统计步数的示例代码。daily_pedometer2是一个用于获取每日步数统计的Flutter插件。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加daily_pedometer2依赖:

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

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

2. 导入插件

在你的Dart文件中导入插件:

import 'package:daily_pedometer2/daily_pedometer2.dart';

3. 请求权限并获取步数

你需要请求必要的权限(如活动识别权限)来获取步数数据。以下是一个完整的示例,展示了如何请求权限并获取步数:

import 'package:flutter/material.dart';
import 'package:daily_pedometer2/daily_pedometer2.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Daily Pedometer Example'),
        ),
        body: PedometerScreen(),
      ),
    );
  }
}

class PedometerScreen extends StatefulWidget {
  @override
  _PedometerScreenState createState() => _PedometerScreenState();
}

class _PedometerScreenState extends State<PedometerScreen> {
  int? steps = 0;

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

  Future<void> _requestPermissions() async {
    var status = await Permission.activityRecognition.status;
    if (!status.isGranted) {
      var result = await Permission.activityRecognition.request();
      if (result.isGranted) {
        // 权限被授予
      } else if (result.isDeniedForever) {
        // 权限被永久拒绝
        // 可以引导用户到系统设置手动开启权限
        openAppSettings();
      } else {
        // 权限被拒绝
      }
    }
  }

  Future<void> _getSteps() async {
    try {
      var pedometer = DailyPedometer2();
      var stepCount = await pedometer.getSteps();
      setState(() {
        steps = stepCount;
      });
    } catch (e) {
      print("Error getting steps: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            'Steps:',
            style: TextStyle(fontSize: 24),
          ),
          Text(
            steps?.toString() ?? 'Loading...',
            style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
          ),
        ],
      ),
    );
  }
}

4. 注意事项

  • 在Android上,你需要在AndroidManifest.xml中声明活动识别权限:
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
  • 在iOS上,你需要在Info.plist中添加NSMotionUsageDescription权限描述。

5. 运行应用

完成以上步骤后,运行你的Flutter应用,你应该能够看到每日步数的统计结果。

这个示例代码展示了如何使用daily_pedometer2插件来获取步数,并处理了权限请求。你可以根据需求进一步扩展功能,如定期更新步数、图表展示等。

回到顶部