# pedometer
[![pub package](https://img.shields.io/pub/v/pedometer.svg)](https://pub.dartlang.org/packages/pedometer)
This plugin allows for continuous step counting and pedestrian status using the built-in pedometer sensor API of iOS and Android devices.
![](https://raw.githubusercontent.com/cph-cachet/flutter-plugins/master/packages/pedometer/imgs/screenshots.png)
## Permissions for Android
For Android 10 and above add the following permission to the Android manifest:
```dart
```
## Permissions for iOS
Add the following entries to your Info.plist file in the Runner xcode project:
```xml
NSMotionUsageDescription
This application tracks your steps
UIBackgroundModes
processing
```
## Step Count
The step count represents the number of steps taken since the last system boot.
On Android, any steps taken before installing the application will not be counted.
## Pedestrian Status
The Pedestrian status is either `walking` or `stopped`. In the case that of an error,
the status will be `unknown`.
## Availability of Sensors
Both Step Count and Pedestrian Status may not be available on some phones:
* It was found that some Samsung phones did not support Step Count or Pedestrian Status
* Older iPhones did not support Pedestrian Status in particular
There is nothing we can do to solve this problem, unfortunately.
In the case that a sensor is not available, an error will be thrown. It is important that **you** handle this error **yourself**.
## Example Usage
See the [example app](https://github.com/cph-cachet/flutter-plugins/blob/master/packages/pedometer/example/lib/main.dart) for a fully-fledged example.
Below is shown a more generalized example. Remember to set the required permissions, as described above.
``` dart
Stream _stepCountStream;
Stream _pedestrianStatusStream;
void onStepCount(StepCount event) {
/// Handle step count changed
int steps = event.steps;
DateTime timeStamp = event.timeStamp;
}
void onPedestrianStatusChanged(PedestrianStatus event) {
/// Handle status changed
String status = event.status;
DateTime timeStamp = event.timeStamp;
}
void onPedestrianStatusError(error) {
/// Handle the error
}
void onStepCountError(error) {
/// Handle the error
}
Future initPlatformState() async {
/// Init streams
_pedestrianStatusStream = await Pedometer.pedestrianStatusStream;
_stepCountStream = await Pedometer.stepCountStream;
/// Listen to streams and handle errors
_stepCountStream.listen(onStepCount).onError(onStepCountError);
_pedestrianStatusStream
.listen(onPedestrianStatusChanged)
.onError(onPedestrianStatusError);
...
}
```