The plugin uses Google Health Connect on Android. Health Connect may not be preinstalled. At runtime, check availability and guide the user if needed:
final status = await health.getHealthConnectSdkStatus();
final available = await health.isHealthConnectAvailable();
if (!available) {
  await health.installHealthConnect();
}

Permissions in AndroidManifest

Add required permissions based on the types you read/write. Start from this baseline (from the example app) and trim to your needs:
<!-- android/app/src/main/AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

  <!-- Health Connect permissions (add those you need) -->
  <uses-permission android:name="android.permission.health.READ_STEPS"/>
  <uses-permission android:name="android.permission.health.WRITE_STEPS"/>
  <uses-permission android:name="android.permission.health.READ_WEIGHT"/>
  <uses-permission android:name="android.permission.health.WRITE_WEIGHT"/>
  <uses-permission android:name="android.permission.health.READ_HEIGHT"/>
  <uses-permission android:name="android.permission.health.WRITE_HEIGHT"/>
  <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
  <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
  <uses-permission android:name="android.permission.health.READ_EXERCISE"/>
  <uses-permission android:name="android.permission.health.WRITE_EXERCISE"/>
  <uses-permission android:name="android.permission.health.READ_SLEEP"/>
  <uses-permission android:name="android.permission.health.WRITE_SLEEP"/>
  <uses-permission android:name="android.permission.health.READ_SPEED"/>
  <uses-permission android:name="android.permission.health.WRITE_SPEED"/>
  <uses-permission android:name="android.permission.health.READ_DISTANCE"/>
  <uses-permission android:name="android.permission.health.WRITE_DISTANCE"/>
  <uses-permission android:name="android.permission.health.READ_TOTAL_CALORIES_BURNED"/>
  <uses-permission android:name="android.permission.health.WRITE_TOTAL_CALORIES_BURNED"/>
  <uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>
  <uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
  <uses-permission android:name="android.permission.health.READ_BLOOD_GLUCOSE"/>
  <uses-permission android:name="android.permission.health.WRITE_BLOOD_GLUCOSE"/>
  <uses-permission android:name="android.permission.health.READ_BLOOD_PRESSURE"/>
  <uses-permission android:name="android.permission.health.WRITE_BLOOD_PRESSURE"/>
  <uses-permission android:name="android.permission.health.READ_BODY_FAT"/>
  <uses-permission android:name="android.permission.health.WRITE_BODY_FAT"/>
  <uses-permission android:name="android.permission.health.READ_BODY_TEMPERATURE"/>
  <uses-permission android:name="android.permission.health.WRITE_BODY_TEMPERATURE"/>
  <uses-permission android:name="android.permission.health.READ_OXYGEN_SATURATION"/>
  <uses-permission android:name="android.permission.health.WRITE_OXYGEN_SATURATION"/>
  <uses-permission android:name="android.permission.health.READ_HYDRATION"/>
  <uses-permission android:name="android.permission.health.WRITE_HYDRATION"/>
  <uses-permission android:name="android.permission.health.READ_RESTING_HEART_RATE"/>
  <uses-permission android:name="android.permission.health.WRITE_RESTING_HEART_RATE"/>
  <uses-permission android:name="android.permission.health.READ_FLOORS_CLIMBED"/>
  <uses-permission android:name="android.permission.health.WRITE_FLOORS_CLIMBED"/>
  <uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE"/>
  <uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE"/>
  <uses-permission android:name="android.permission.health.READ_RESPIRATORY_RATE"/>
  <uses-permission android:name="android.permission.health.WRITE_RESPIRATORY_RATE"/>
  <uses-permission android:name="android.permission.health.READ_NUTRITION"/>
  <uses-permission android:name="android.permission.health.WRITE_NUTRITION"/>
  <uses-permission android:name="android.permission.health.READ_HEART_RATE_VARIABILITY"/>
  <uses-permission android:name="android.permission.health.WRITE_HEART_RATE_VARIABILITY"/>
  <uses-permission android:name="android.permission.health.BODY_SENSORS"/>
  <uses-permission android:name="android.permission.health.READ_MENSTRUATION"/>
  <uses-permission android:name="android.permission.health.WRITE_MENSTRUATION"/>
  <uses-permission android:name="android.permission.health.READ_LEAN_BODY_MASS"/>
  <uses-permission android:name="android.permission.health.WRITE_LEAN_BODY_MASS"/>

  <!-- Historic and background reading (optional) -->
  <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_HISTORY"/>
  <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND"/>
</manifest>
Also include the intent-filters from the example to enable the Health Connect permission UI.

Runtime permissions

When using activity-related data (steps, workouts), request ACTIVITY_RECOGNITION and optionally ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION for distance in workouts.
import 'package:permission_handler/permission_handler.dart';

await Permission.activityRecognition.request();
await Permission.location.request();

History & background

  • isHealthDataHistoryAvailable() / requestHealthDataHistoryAuthorization()
  • isHealthDataInBackgroundAvailable() / requestHealthDataInBackgroundAuthorization()
Use these to detect and request capabilities on devices that support them.