expo-pedometer
v1.0.1
Published
Core Motion and Health Connect step count module for Expo
Downloads
444
Maintainers
Readme
expo-pedometer
Expo module for reading today's step count from platform health data.
- iOS reads step count with Core Motion
CMPedometer. - Android reads Health Connect
StepsRecordaggregates. - Web is unavailable and reports denied permissions.
Install
npm install expo-pedometerAdd the config plugin:
{
"expo": {
"plugins": [
[
"expo-pedometer",
{
"iosMotionPermission": "Allow this app to read your step count from Motion & Fitness.",
"androidHealthConnectPrivacyPolicyUrl": "https://example.com/privacy"
}
]
]
}
}The plugin adds:
- iOS
NSMotionUsageDescription. - Android
android.permission.health.READ_STEPS. - Android Health Connect package query and permission rationale manifest entries.
AndroidX Health Connect requires Android minSdkVersion 26 or higher. Configure it in your app, for example with expo-build-properties:
[
"expo-build-properties",
{
"android": {
"minSdkVersion": 26
}
}
]API
enum PermissionStatus {
GRANTED = "granted",
UNDETERMINED = "undetermined",
DENIED = "denied",
}
type PermissionResponse = {
status: PermissionStatus;
canAskAgain: boolean;
};
export const isAvailableAsync: () => Promise<boolean>;
export const getPermissionsAsync: () => Promise<PermissionResponse>;
export const requestPermissionsAsync: () => Promise<PermissionResponse>;
export const getTodayStepCountAsync: () => Promise<number>;
export const usePermissions: () => [
isAvailable: boolean | null,
permission: PermissionResponse | null,
requestPermission: () => Promise<PermissionResponse>,
getPermission: () => Promise<PermissionResponse>,
];Example:
import { PermissionStatus, getTodayStepCountAsync, usePermissions } from "expo-pedometer";
import { Button } from "react-native";
export function StepCount() {
const [isAvailable, permission, requestPermission] = usePermissions();
async function requestAndReadSteps() {
const nextPermission = await requestPermission();
if (nextPermission.status === PermissionStatus.GRANTED) {
const steps = await getTodayStepCountAsync();
console.log(steps);
}
}
if (isAvailable === false) {
return null;
}
return (
<Button
title={permission?.status ?? "loading"}
onPress={requestAndReadSteps}
/>
);
}usePermissions() fetches availability and the current permission when the component mounts. Calling
requestPermission() or getPermission() updates the returned permission state.
Android Rationale Localization
androidHealthConnectRationaleTitle and androidHealthConnectRationaleDescription are optional overrides. They can be literal strings or Android string resource references.
If the overrides are omitted, the Android rationale screen reads these app string resources:
expo_pedometer_health_connect_rationale_titleexpo_pedometer_health_connect_rationale_description
If those resources are not defined, built-in English defaults are used.
[
"expo-pedometer",
{
"androidHealthConnectRationaleTitle": "Step count access",
"androidHealthConnectRationaleDescription": "Step count is read from Health Connect to show today's walking progress.",
"androidHealthConnectPrivacyPolicyUrl": "@string/privacy_policy_url"
}
]Apps using config plugins can provide localized values by generating those resource names in localized Android resource folders.
Platform Notes
getTodayStepCountAsync() should be called after isAvailableAsync() and a granted permission response.
iOS Core Motion step data is device pedometer data, not Apple Health's full aggregate. It may differ from the Health app when Health includes other sources such as Apple Watch.
Android Health Connect availability depends on device, OS version, and Health Connect installation state. If Health Connect is unavailable or needs an update, isAvailableAsync() returns false.
Health data permissions can require store privacy declarations and an app privacy policy before release.
