PlannedExerciseSessionRecord: Health Connect planned exercise data
Read from Google’s documentation on 2026-10-03 · Google’s reference page last updated 2026-06-24
PlannedExerciseSessionRecord is Health Connect's planned exercise record — an Interval record in Google's Activity category. Its read permission is android.permission.health.READ_PLANNED_EXERCISE; its write permission is android.permission.health.WRITE_PLANNED_EXERCISE. Google's reference defines no aggregate metrics on it, so it is read with readRecords rather than aggregate. Mandatory fields per Google's table: block, endTime, exerciseType, hasExplicitTime and metadata.
What Google says PlannedExerciseSessionRecord is
Captures a planned exercise session, also commonly referred to as a training plan.
Each record contains a start time, end time, an exercise type and a list of [PlannedExerciseBlock] which describe the details of the planned session. The start and end times may be in the future. Requires androidx.health.connect.client.HealthConnectFeatures.FEATURE_PLANNED_EXERCISE.
Quoted from Google’s PlannedExerciseSessionRecord Jetpack reference, last updated 2026-06-24, read 2026-10-03.
- Class
androidx.health.connect.client.records.PlannedExerciseSessionRecord- Google's category
- Activity
- Record type
- Interval
- Unit class
- none named in Google's table
- Mandatory fields
blockendTimeexerciseTypehasExplicitTimemetadata- Added in (Jetpack)
1.1.0- Feature flag
FEATURE_PLANNED_EXERCISE
Permissions
The exact strings Google’s data-types table declares for PlannedExerciseSessionRecord. Google’s page: “Before requesting any permissions, your app must declare them in the manifest.”
| Access | Permission string | Framework reference |
|---|---|---|
| Read | android.permission.health.READ_PLANNED_EXERCISE | API 35 · U Ext 13 |
| Write | android.permission.health.WRITE_PLANNED_EXERCISE | API 35 · U Ext 13 |
<uses-permission android:name="android.permission.health.READ_PLANNED_EXERCISE" />
<uses-permission android:name="android.permission.health.WRITE_PLANNED_EXERCISE" />import androidx.health.connect.client.permission.HealthPermission
import androidx.health.connect.client.records.PlannedExerciseSessionRecord
val permissions = setOf(
HealthPermission.getReadPermission(PlannedExerciseSessionRecord::class),
HealthPermission.getWritePermission(PlannedExerciseSessionRecord::class),
)The 11 fields of PlannedExerciseSessionRecord
Types and descriptions as Google’s reference prints them. The range column quotes Google’s own range annotation or sentence; a dash means Google states none, which is not the same as no validation.
| Field | Type | Allowed range | Google’s description |
|---|---|---|---|
blocks | List<PlannedExerciseBlock> | — | Google gives no description. |
completedExerciseSessionId | String? | — | The exercise session that completed this planned session. |
endTimemandatory | Instant | — | End time of the record. |
endZoneOffset | ZoneOffset? | — | User experienced zone offset at endTime, or null if unknown. Providing these will help history aggregations results stay consistent should user travel. Queries with user experienced time filters will assume system current zone offset if the information is absent. |
exerciseTypemandatory | Int | — | Type of exercise (e.g. walking, swimming). Required field. |
hasExplicitTimemandatory | Boolean | — | Google gives no description. |
metadatamandatory | Metadata | — | Set of common metadata associated with the written record. |
notes= null | String? | — | Additional notes for the session. Optional field. |
startTime | Instant | — | Start time of the record. |
startZoneOffset | ZoneOffset? | — | User experienced zone offset at startTime, or null if unknown. Providing these will help history aggregations results stay consistent should user travel. Queries with user experienced time filters will assume system current zone offset if the information is absent. |
title= null | String? | — | Title of the session. Optional field. |
Read PlannedExerciseSessionRecord in Kotlin
The shape of Google’s own read example, with PlannedExerciseSessionRecord and its names filled in. Get the client with HealthConnectClient.getOrCreate(context) after checking getSdkStatus.
import androidx.health.connect.client.HealthConnectClient
import androidx.health.connect.client.records.PlannedExerciseSessionRecord
import androidx.health.connect.client.request.ReadRecordsRequest
import androidx.health.connect.client.time.TimeRangeFilter
import java.time.Instant
suspend fun readPlannedExerciseSession(
client: HealthConnectClient,
startTime: Instant,
endTime: Instant,
): List<PlannedExerciseSessionRecord> {
val response = client.readRecords(
ReadRecordsRequest(
PlannedExerciseSessionRecord::class,
timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
)
)
// One page of up to pageSize records (default 1000); follow
// response.pageToken for the rest.
return response.records
}Setting up the client, the permission flow and Play Console declaration: integrating Health Connect step by step.
HealthKit counterpart
PlannedExerciseSessionRecord sits in the verified cross-platform matrix’s Workouts row, which groups HKWorkout (HKWorkoutBuilder) on Apple with ExerciseSessionRecord, PlannedExerciseSessionRecord on Android. The row groups the metric; it does not pair each Android record with one Apple type.
Watch out: Activity-type taxonomies differ between platforms — map them explicitly rather than by name.
Questions
- What permission does PlannedExerciseSessionRecord need?
- Google's Health Connect data-types table (read 2026-10-03) declares android.permission.health.READ_PLANNED_EXERCISE for reading PlannedExerciseSessionRecord and android.permission.health.WRITE_PLANNED_EXERCISE for writing it, and says apps must declare permissions in the manifest before requesting them.
- Can you aggregate PlannedExerciseSessionRecord with AggregateRequest?
- Not directly. As read on 2026-10-03, Google's Jetpack reference defines no AggregateMetric constants on PlannedExerciseSessionRecord, so there is no metric to put in an AggregateRequest. Read the records with readRecords and a ReadRecordsRequest, and compute any summary yourself.
- Is PlannedExerciseSessionRecord an interval, instantaneous or series record?
- Google's data-types table lists PlannedExerciseSessionRecord as Interval, and defines that column as indicating "whether the data is recorded at an instant in time or over an interval". Its mandatory fields are block, endTime, exerciseType, hasExplicitTime and metadata.
Other Activity records
Sources checked
- Google — PlannedExerciseSessionRecord (Jetpack reference) — last updated 2026-06-24 · read 2026-10-03
- Google — Health Connect data types · read 2026-10-03
- Google — HealthPermissions (framework reference) · read 2026-10-03
- Google — Read raw data (Health Connect guide) · read 2026-10-03
Google’s descriptions are quoted for identification; the page layout, the capsule and the cross-platform pairing are AIFitnessAPI’s. Generated from Google’s pages by a script, not typed by hand — the same data is behind every page in the Health Connect reference.