Android 16: BODY_SENSORS gives way to android.permission.health
Last verified October 3, 2026 · 3 min read
Covered here:Health Connect
This is a narrow change with a wide blast radius: one permission that heart-rate features relied on since API level 20 is replaced by a family of Health Connect permissions. This page states only what Google's Android 16 behaviour changes, the HealthPermissions reference, the Health Connect get-started guide, the Health Services active data guide and the foreground service types page say, as read on 2026-10-03.
What Google says changed#
"For apps targeting Android 16 (API level 36) or higher, BODY_SENSORS permissions use more granular permissions under android.permissions.health, which Health Connect also uses. As of Android 16, any API previously requiring BODY_SENSORS or BODY_SENSORS_BACKGROUND requires the corresponding android.permissions.health permission instead."
Note the spelling: the behaviour-changes page writes android.permissions.health. The permission strings in the HealthPermissions reference begin android.permission.health., singular. Use the reference's strings in your manifest.
What it affects, per Google#
HEART_RATE_BPMfrom Health Services on Wear OSSensor.TYPE_HEART_RATEfrom Android Sensor ManagerheartRateAccuracyandheartRateBpmfrom ProtoLayout on Wear OSFOREGROUND_SERVICE_TYPE_HEALTH, "where the respective android.permission.health permission is needed in place of BODY_SENSORS"
The replacements#
| Before | From API level 36 | Constant string (HealthPermissions reference) | Added |
|---|---|---|---|
BODY_SENSORS for heart rate | READ_HEART_RATE | android.permission.health.READ_HEART_RATE | API level 34 |
BODY_SENSORS for SpO2 | READ_OXYGEN_SATURATION | android.permission.health.READ_OXYGEN_SATURATION | API level 34 |
BODY_SENSORS for skin temperature | READ_SKIN_TEMPERATURE | android.permission.health.READ_SKIN_TEMPERATURE | API level 35 |
BODY_SENSORS_BACKGROUND | READ_HEALTH_DATA_IN_BACKGROUND | android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND | API level 35 |
Google's guidance in its own words: "For while-in-use monitoring of Heart Rate, SpO2, or Skin Temperature: request the granular permission under android.permissions.health, such as READ_HEART_RATE instead of BODY_SENSORS," and "For background sensor access: request READ_HEALTH_DATA_IN_BACKGROUND instead of BODY_SENSORS_BACKGROUND." The reference marks each of these as protection level dangerous, so they are runtime grants.
The privacy policy requirement on phones#
"Mobile apps migrating to use the READ_HEART_RATE and other granular permissions must also declare an activity to display the app's privacy policy. This is the same requirement as Health Connect." Then: "Failure to provide the rationale for mobile apps will result in the permission being revoked."
Health Connect's get-started guide shows the shape: an activity handling androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE for Android 13 and lower, plus, from Android 14, an activity-alias guarded by android.permission.START_VIEW_PERMISSION_USAGE that handles android.intent.action.VIEW_PERMISSION_USAGE with the category android.intent.category.HEALTH_PERMISSIONS. The guide adds: "The activity must display the same privacy policy you provide for your app in the Google Play Console." Wiring Health Connect itself is covered in the Health Connect integration guide.
Choosing the permission at runtime#
The foreground service types page now lists the prerequisite as "BODY_SENSORS on API 35 and lower", and the Health Services guide tells Wear OS apps to confirm "runtime permissions for body sensors (API level 35 or lower) or heart rate (API level 36+)". A sketch of that split:
val heartRatePermission =
if (Build.VERSION.SDK_INT >= 36) HealthPermissions.READ_HEART_RATE // android.permission.health.READ_HEART_RATE
else Manifest.permission.BODY_SENSORS
// request heartRatePermission at runtime with your existing permission flow
Google's behaviour-changes page frames the change by target SDK and the guides frame it by API level. Test both an Android 16 device and an older one before shipping, with your real target.
What is not on Google's list#
Step sensors. Sensor.TYPE_STEP_COUNTER and TYPE_STEP_DETECTOR were documented under ACTIVITY_RECOGNITION, not BODY_SENSORS, and Google's Android 16 list names neither; see the step counter page. The Manifest.permission reference entry for BODY_SENSORS, as we read it, still describes the permission without mentioning Android 16.
Pitfalls#
- Copying the behaviour-changes spelling. Use
android.permission.health.*from the reference. - Migrating the permission and not the privacy policy activity. Google says the permission is revoked.
- Dropping BODY_SENSORS for older devices. The prerequisite lists still name it for API 35 and lower.
- Forgetting background access.
READ_HEART_RATEdoes not cover background reads;READ_HEALTH_DATA_IN_BACKGROUNDis the replacement forBODY_SENSORS_BACKGROUND. - Leaving a health foreground service on the old permission.
FOREGROUND_SERVICE_TYPE_HEALTHis on Google's affected list; see foregroundServiceType="health".
Watch apps feel this first; the Wear OS side is on Wear OS Health Services and Wear OS exercise tracking.
Frequently asked questions
- What replaces BODY_SENSORS_BACKGROUND on Android 16?
- READ_HEALTH_DATA_IN_BACKGROUND, whose constant string is android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND. Google's Android 16 behaviour-changes page tells apps that need background sensor access to request it instead of BODY_SENSORS_BACKGROUND, and the HealthPermissions reference describes it as allowing an application to read health data of any type in the background, with protection level dangerous. Older API levels still use the old pair.
- Does the Android 16 health permission change affect the step counter sensor?
- Google's list does not name it. The Android 16 behaviour-changes page lists Health Services HEART_RATE_BPM, Sensor.TYPE_HEART_RATE, two ProtoLayout heart-rate sources and FOREGROUND_SERVICE_TYPE_HEALTH as affected. The step counter and step detector sensors are documented as requiring android.permission.ACTIVITY_RECOGNITION, not BODY_SENSORS, so the replacement of BODY_SENSORS does not touch the permission they were documented under.
- Why was my app's READ_HEART_RATE permission revoked on Android 16?
- The documented cause is a missing privacy policy activity. Google's Android 16 page says mobile apps migrating to READ_HEART_RATE and the other granular permissions must declare an activity that displays the app's privacy policy, the same requirement as Health Connect, and that failure to provide the rationale will result in the permission being revoked. Health Connect's get-started guide shows the intent filters to declare and says the activity must show the same policy you give Google Play.
- Which permission does Sensor.TYPE_HEART_RATE need on Android 16?
- For apps targeting Android 16 (API level 36) or higher, Google lists Sensor.TYPE_HEART_RATE among the APIs that now require the corresponding health permission instead of BODY_SENSORS. For while-in-use heart rate that is READ_HEART_RATE, android.permission.health.READ_HEART_RATE; for background access, READ_HEALTH_DATA_IN_BACKGROUND. On API 35 and lower, Google's foreground service guidance still names BODY_SENSORS.
Keep reading
Elsewhere on the site
Pages that share this one’s concepts and sources, from other sections.
Next steps
Was this page useful?
Independent comparison, last reviewed October 3, 2026. Pricing, rate limits, and feature availability change often — confirm current details in each provider’s official documentation before you commit. Product and company names are trademarks of their respective owners; AIFitnessAPI is not affiliated with, endorsed by, or sponsored by any product listed here.
← All phone sensors · by AIFitnessAPI