Skip to content
AF
Health Connect reference

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.”

AccessPermission stringFramework reference
Readandroid.permission.health.READ_PLANNED_EXERCISEAPI 35 · U Ext 13
Writeandroid.permission.health.WRITE_PLANNED_EXERCISEAPI 35 · U Ext 13
AndroidManifest.xml
<uses-permission android:name="android.permission.health.READ_PLANNED_EXERCISE" />
<uses-permission android:name="android.permission.health.WRITE_PLANNED_EXERCISE" />
Kotlin — the same strings from the Jetpack helper
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.

FieldTypeAllowed rangeGoogle’s description
blocksList<PlannedExerciseBlock>—Google gives no description.
completedExerciseSessionIdString?—The exercise session that completed this planned session.
endTimemandatoryInstant—End time of the record.
endZoneOffsetZoneOffset?—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.
exerciseTypemandatoryInt—Type of exercise (e.g. walking, swimming). Required field.
hasExplicitTimemandatoryBoolean—Google gives no description.
metadatamandatoryMetadata—Set of common metadata associated with the written record.
notes= nullString?—Additional notes for the session. Optional field.
startTimeInstant—Start time of the record.
startZoneOffsetZoneOffset?—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= nullString?—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.

readRecords
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

All Activity records →

Sources checked

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.

← All Health Connect records · Every permission string