Rohdaten lesen

Das folgende Beispiel zeigt, wie Sie Rohdaten im Rahmen des gängigen Workflows lesen.

Daten lesen

Mit Health Connect können Apps Daten aus dem Datenspeicher lesen, wenn die App im Vordergrund und im Hintergrund aktiv ist:

  • Lesen im Vordergrund: Normalerweise können Sie Daten aus Health Connect lesen, wenn sich Ihre App im Vordergrund befindet. In diesen Fällen können Sie einen Dienst im Vordergrund verwenden, um diesen Vorgang auszuführen, falls der Nutzer oder das System Ihre App während eines Lesevorgangs in den Hintergrund verschiebt.

  • Lesen im Hintergrund: Wenn Sie vom Nutzer eine zusätzliche Berechtigung anfordern, können Sie Daten lesen, nachdem der Nutzer oder das System Ihre App im Hintergrund gestartet hat. Vollständiges Beispiel für die Hintergrundlesefunktion

Mit dem Datentyp „Schritte“ in Health Connect wird die Anzahl der Schritte erfasst, die ein Nutzer zwischen den Messungen zurückgelegt hat. Die Schrittzahl ist eine gängige Messgröße auf Gesundheits-, Fitness- und Wellnessplattformen. Mit Health Connect können Daten zur Schrittzahl ganz einfach gelesen und geschrieben werden.

Wenn Sie Einträge lesen möchten, erstellen Sie eine ReadRecordsRequest und geben Sie sie beim Aufrufen von readRecords an.

Das folgende Beispiel zeigt, wie du die Schrittzahldaten für einen Nutzer innerhalb eines bestimmten Zeitraums abrufen kannst. Ein erweitertes Beispiel mit SensorManager finden Sie im Datenleitfaden für die Schrittzahl.

suspend fun readStepsByTimeRange(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.readRecords(
            ReadRecordsRequest(
                StepsRecord::class,
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        for (stepRecord in response.records) {
            // Process each step record
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Beispiel für die Hintergrundlesefunktion

Wenn Sie Daten im Hintergrund lesen möchten, müssen Sie in Ihrer Manifestdatei die folgende Berechtigung angeben:

<application>
  <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
...
</application>

Im folgenden Beispiel wird gezeigt, wie Sie mit WorkManager Daten zur Schrittzahl für einen Nutzer innerhalb eines bestimmten Zeitraums im Hintergrund lesen:

class ScheduleWorker(private val appContext: Context, workerParams: WorkerParameters):
    CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        // Read data and process it.
        ...

        // Return success indicating successful data retrieval
        return Result.success()
    }
}

if (healthConnectClient
    .features
    .getFeatureStatus(
    HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
    ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

    // Check if necessary permission is granted
    val grantedPermissions = healthConnectClient.permissionController.getGrantedPermissions()

    if (PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND !in grantedPermissions) {
        // Perform read in foreground
        ...
    } else {
        // Schedule the periodic work request in background
        val periodicWorkRequest = PeriodicWorkRequestBuilder<ScheduleWorker>(1, TimeUnit.HOURS)
            .build()

        WorkManager.getInstance(context).enqueueUniquePeriodicWork(
            "read_health_connect",
            ExistingPeriodicWorkPolicy.KEEP,
            periodicWorkRequest
        )
    }
} else {
  // Background reading is not available, perform read in foreground
  ...
}

Zuvor geschriebene Daten lesen

Wenn eine App bereits Daten in Health Connect geschrieben hat, kann sie diese zurücklesen, ohne dass eine Leseberechtigung für diese Daten erforderlich ist. Dies gilt für Szenarien, in denen die App nach der Neuinstallation des Nutzers mit Health Connect synchronisiert werden muss.

Wenn Sie in diesem Szenario Daten lesen möchten, müssen Sie den Paketnamen als DataOrigin-Objekt im dataOriginFilter-Parameter Ihrer ReadRecordsRequest angeben.

Im folgenden Beispiel wird gezeigt, wie beim Lesen von Schritten ein Paketname angegeben wird:

try {
    val response =  healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = StepsRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
            dataOriginFilter = setOf(DataOrigin("com.my.package.name"))
        )
    )
    for (record in response.records) {
        // Process each record
    }
} catch (e: Exception) {
    // Run error handling here
}

Leseeinschränkungen

Standardmäßig kann Ihre App mit allen erteilten Berechtigungen Daten bis zu 30 Tage lang lesen. Mit der Berechtigung PERMISSION_READ_HEALTH_DATA_HISTORY kann Ihre App Daten lesen, die älter als 30 Tage sind.

30-tägige Einschränkung

Apps können Daten aus Health Connect bis zu 30 Tage vor der ersten Erteilung einer Berechtigung lesen.

Wenn ein Nutzer Ihre App jedoch löscht, geht der Berechtigungsverlauf verloren. Wenn der Nutzer Ihre App neu installiert und die Berechtigung noch einmal erteilt, kann Ihre App bis zu 30 Tage vor diesem neuen Datum Daten aus Health Connect lesen.

Beispiel für 30 Tage

Wenn ein Nutzer Ihrer App am 30. März 2023 die Leseberechtigung erteilt hat, können die frühesten Daten, die Ihre App abrufen kann, ab dem 28. Februar 2023 stammen.

Der Nutzer löscht Ihre App dann am 10. Mai 2023. Der Nutzer entscheidet sich, die App am 15. Mai 2023 neu zu installieren und die Leseberechtigung zu gewähren. Das früheste Datum, ab dem Ihre App Daten lesen kann, ist der 15. April 2023.

Daten lesen, die älter als 30 Tage sind

Wenn Sie Daten lesen möchten, die älter als 30 Tage sind, müssen Sie die Berechtigung PERMISSION_READ_HEALTH_DATA_HISTORY verwenden. Ohne diese Berechtigung führt ein Versuch, einen einzelnen Datensatz zu lesen, der älter als 30 Tage ist, zu einem Fehler. Außerdem können Sie mithilfe von Anfragen für Zeiträume keine Daten lesen, die älter als 30 Tage sind.