Ham verileri okuma

Aşağıdaki örnekte, ortak iş akışının bir parçası olarak ham verilerin nasıl okunacağı gösterilmektedir.

Verileri okuma

Health Connect, uygulamaların ön planda ve arka plandayken veri deposundan veri okumasına olanak tanır:

  • Ön planda okuma: Uygulamanız ön plandayken normalde Health Connect'ten veri okuyabilirsiniz. Bu gibi durumlarda, kullanıcı veya sistem bir okuma işlemi sırasında uygulamanızı arka plana yerleştirirse bu işlemi çalıştırmak için bir ön plan hizmeti kullanmayı düşünebilirsiniz.

  • Arka planda okuma: Kullanıcıdan ek izin isteyerek, kullanıcı veya sistem uygulamanızı arka plana yerleştirdikten sonra verileri okuyabilirsiniz. Arka planda okuma örneğinin tamamını inceleyin.

Health Connect'teki Adım sayısı veri türü, kullanıcının ölçümler arasında attığı adım sayısını yakalar. Adım sayıları, sağlık, fitness ve sağlıklı yaşam platformlarında ortak bir ölçümü temsil eder. Health Connect, adım sayısı verilerini okumayı ve yazmayı kolaylaştırır.

Kayıtları okumak için bir ReadRecordsRequest oluşturun ve readRecords işlevini çağırırken bunu sağlayın.

Aşağıdaki örnekte, belirli bir zamandaki bir kullanıcının adım sayısı verilerinin nasıl okunacağı gösterilmektedir. SensorManager içeren genişletilmiş bir örnek için adım sayısı veri kılavuzuna bakın.

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
    }
}

Arka planda okuma örneği

Arka planda veri okumak için manifest dosyanızda aşağıdaki izni beyan edin:

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

Aşağıdaki örnekte, WorkManager kullanılarak belirli bir süre içinde bir kullanıcının adım sayısı verilerinin arka planda nasıl okunacağı gösterilmektedir:

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

ReadRecordsRequest parametresinin varsayılan pageSize değeri 1.000'dür. Tek bir readResponse içindeki kayıt sayısı, isteğin pageSize değerini aşıyorsa tüm kayıtları almak için pageToken kullanarak yanıtın tüm sayfalarını iterasyonla incelemeniz gerekir. Ancak hız sınırlamasıyla ilgili sorunlardan kaçının.

pageToken okuma örneği

İstenilen dönemdeki mevcut tüm verileri almak için kayıtları okumak üzere pageToken kullanılması önerilir.

Aşağıdaki örnekte, tüm sayfa jetonları tükenene kadar tüm kayıtların nasıl okunacağı gösterilmektedir:

val type = HeartRateRecord::class
val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofDays(7))

try {
    var pageToken: String? = null
    do {
        val readResponse =
            healthConnectClient.readRecords(
                ReadRecordsRequest(
                    recordType = type,
                    timeRangeFilter = TimeRangeFilter.between(
                        startTime,
                        endTime
                    ),
                    pageToken = pageToken
                )
            )
        val records = readResponse.records
        // Do something with records
        pageToken = readResponse.pageToken
    } while (pageToken != null)
} catch (quotaError: IllegalStateException) {
    // Backoff
}

Büyük veri kümelerini okumayla ilgili en iyi uygulamalar hakkında bilgi edinmek için Hız sınırlamasından kaçınmak için planlama başlıklı makaleyi inceleyin.

Daha önce yazılmış verileri okuma

Daha önce Health Connect'e kayıt yazan bir uygulama, geçmiş verileri okuyabilir. Bu, kullanıcı uygulamayı yeniden yükledikten sonra uygulamanın Health Connect ile yeniden senkronize edilmesi gereken senaryolarda geçerlidir.

Bazı okuma kısıtlamaları geçerlidir:

  • Android 14 ve sonraki sürümler için

    • Kendi verilerini okuyan uygulamalar için geçmişe yönelik sınırlama yoktur.
    • Diğer verileri okuyan bir uygulama için 30 günlük sınır.
  • Android 13 ve önceki sürümler için

    • Uygulamanın herhangi bir veri okuması için 30 günlük sınır.

Kısıtlamalar, Okuma izni isteğinde bulunarak kaldırılabilir.

Geçmiş verileri okumak için paket adını, ReadRecordsRequest öğenizin dataOriginFilter parametresinde DataOrigin nesnesi olarak belirtmeniz gerekir.

Aşağıdaki örnekte, adımlar kayıtlarını okurken paket adının nasıl belirtileceği gösterilmektedir:

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
}

30 günden eski verileri okuma

Varsayılan olarak tüm uygulamalar, ilk izin verildiği tarihten önceki 30 güne kadar Health Connect'teki verileri okuyabilir.

Okuma izinlerini varsayılan kısıtlamalardan herhangi birinin ötesine genişletmeniz gerekiyorsa PERMISSION_READ_HEALTH_DATA_HISTORY isteğinde bulunun. Aksi takdirde, bu izin olmadan 30 günden eski kayıtları okuma girişimi hatayla sonuçlanır.

Silinen bir uygulamanın izin geçmişi

Bir kullanıcı uygulamanızı silerse geçmiş izni de dahil olmak üzere tüm izinler iptal edilir. Kullanıcı uygulamanızı yeniden yükleyip tekrar izin verirse aynı varsayılan kısıtlamalar geçerli olur ve uygulamanız, bu yeni tarihten önceki 30 güne kadar Health Connect'teki verileri okuyabilir.

Örneğin, kullanıcının 10 Mayıs 2023'te uygulamanızı silip 15 Mayıs 2023'te yeniden yüklediğini ve okuma izinleri verdiğini varsayalım. Uygulamanızın varsayılan olarak veri okuyabileceği en erken tarih 15 Nisan 2023'tür.