[Flutter] pedometer 라이브러리

박재빈·2024년 12월 16일
1

1. 라이브러리 설치

pedometer
https://pub.dev/packages/pedometer

pedometer 센서를 위해서 권한 체크를 위한 라이브러리도 추가

permission_handler
https://pub.dev/packages/permission_handler

2. 플랫폼 설정 추가

1. 안드로이드

경로 : android/app/src/main/AndroidManifest.xml

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

2. IOS

경로 : ios/Runner/info.plist

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

3. 적용 예제

예제는 pub.dev의 공식예제 사용
https://github.com/cph-cachet/flutter-plugins/blob/master/packages/pedometer/example/lib/main.dart

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

class PedometerTestScreen extends StatefulWidget {
  const PedometerTestScreen({super.key});

  @override
  State<PedometerTestScreen> createState() => _PedometerTestScreenState();
}

class _PedometerTestScreenState extends State<PedometerTestScreen> {

  late Stream<StepCount> _stepCountStream;
  late Stream<PedestrianStatus> _pedestrianStatusStream;
  String _status = '?', _steps = '?';

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

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

  void onPedestrianStatusChanged(PedestrianStatus event) {
    print('onPedestrianStatusChanged $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';
    });
  }

  Future<bool> _checkActivityRecognitionPermission() async {
    bool granted = await Permission.activityRecognition.isGranted;

    if (!granted) {
      granted = await Permission.activityRecognition.request() ==
          PermissionStatus.granted;
    }

    return granted;
  }

  Future<void> initPlatformState() async {
    bool granted = await _checkActivityRecognitionPermission();
    if (!granted) {
      // tell user, the app will not work
    }

    _pedestrianStatusStream = Pedometer.pedestrianStatusStream;
    (await _pedestrianStatusStream.listen(onPedestrianStatusChanged))
        .onError(onPedestrianStatusError);

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

    if (!mounted) return;
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pedometer Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              'Steps Taken',
              style: TextStyle(fontSize: 30),
            ),
            Text(
              _steps,
              style: TextStyle(fontSize: 30),
            ),
            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),
              ),
            )
          ],
        ),
      ),
    );
  }
}
  • Pedometer.pedestrianStatusStream : 사용자의 걸음 상태 스트림
  • Pedometer.stepCountStream : 걸음 수 스트림
    • 부팅 후 부터 총 걸음 수
    • 만약 휴대폰을 껐다 키면 걸음 수 0이 됨

0개의 댓글