Ham verileri okuma

Aşağıdaki örnekte, yaygın 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 planda çalışırken veri deposundaki verileri okumasına olanak tanır:

  • Ön planda okuma: Uygulamanız ön plandayken Health Connect'teki verileri normalde okuyabilirsiniz. Bu gibi durumlarda, okuma işlemi sırasında kullanıcı veya sistem uygulamanızı arka plana yerleştirirse bu işlemi çalıştırmak için ö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. Tam arka planda okuma örneğini inceleyin.

Health Connect'teki Adımlar veri türü, bir kullanıcının okumalar arasında attığı adım sayısını yakalar. Adım sayısı, sağlık, fitness ve sağlıklı yaşam platformlarında yaygın olarak kullanılan bir ölçümdür. Health Connect, adım sayısı verilerini okuyup 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 süre içinde bir kullanıcının adım sayısı verilerinin nasıl okunacağı gösterilmektedir. SensorManager ile ilgili daha kapsamlı 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 (record in response.records) {
            // Process each record
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Ayrıca aggregate kullanarak verilerinizi toplu şekilde okuyabilirsiniz.

suspend fun readStepsByTimeRange(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(StepsRecord.COUNT_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        // The result may be null if no data is available in the time range
        val stepCount = response[StepsRecord.COUNT_TOTAL]
    } catch (e: Exception) {
        // Run error handling here
    }
}

Arka planda okuma örneği

Verileri arka planda okumak için manifest dosyanızda aşağıdaki izni bildirin:

<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 arka planda adım sayısı verilerinin 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 1000'dir. Tek bir readResponse içindeki kayıt sayısı, isteğin pageSize değerini aşıyorsa pageToken kullanarak tüm kayıtları almak için yanıtın tüm sayfalarını yinelemeniz gerekir. Ancak sıklık sınırlamasıyla ilgili sorunlardan kaçınmak için dikkatli olun.

pageToken okuma örneği

İstenen dönemdeki 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 okurken yararlanabileceğiniz en iyi uygulamalar hakkında bilgi edinmek için Hız sınırlamasıyla karşılaşmamayı planlama başlıklı makaleyi inceleyin.

Daha önce yazılan verileri okuma

Daha önce Health Connect'e kayıt yazmış olan uygulamalar geçmiş verileri okuyabilir. Bu, kullanıcının uygulamayı yeniden yüklemesinden sonra uygulamanın Health Connect ile yeniden senkronize olması gereken senaryolar için geçerlidir.

Okumayla ilgili bazı kısıtlamalar vardır:

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

    • Bir uygulamanın kendi verilerini okumasıyla ilgili geçmiş sınırlama yoktur.
    • Bir uygulamanın diğer verileri okumasıyla ilgili 30 günlük sınır.
  • Android 13 ve önceki sürümler için

    • Uygulamaların herhangi bir veriyi okumasıyla ilgili 30 günlük sınır.

Kısıtlamalar, okuma izni isteğinde bulunularak kaldırılabilir.

Geçmiş verileri okumak için paket adını ReadRecordsRequest'nizin dataOriginFilter parametresinde DataOrigin nesnesi olarak belirtmeniz gerekir.

Aşağıdaki örnekte, kalp atış hızı kayıtları okunurken paket adının nasıl belirtileceği gösterilmektedir:

try {
    val response =  healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = HeartRateRecord::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 herhangi bir izin ilk kez verilmeden önceki 30 güne kadar olan Health Connect verilerini okuyabilir.

Okuma izinlerini varsayılan kısıtlamaların ö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, Health Connect'teki verileri bu yeni tarihten önceki 30 gün boyunca okuyabilir.

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

İstisnaları işleme

Health Connect, bir sorunla karşılaşıldığında CRUD işlemleri için standart istisnalar oluşturur. Uygulamanız bu istisnaların her birini uygun şekilde yakalayıp işlemelidir.

HealthConnectClient üzerindeki her yöntemde oluşturulabilecek istisnalar listelenir. Genel olarak uygulamanız aşağıdaki istisnaları işlemelidir:

Tablo 1: Health Connect istisnaları ve önerilen en iyi uygulamalar
İstisna Açıklama Önerilen en iyi uygulama
IllegalStateException Aşağıdaki senaryolardan biri gerçekleşti:

  • Health Connect hizmeti kullanılamıyor.
  • İstek geçerli bir yapı değil. Örneğin, Instant nesnesinin timeRangeFilter için kullanıldığı, periyodik gruplar halinde birleştirilmiş istek.

İstek göndermeden önce girişlerle ilgili olası sorunları ele alın. Tercihen, hata işleme stratejileri uygulayabilmek için değişkenlere değer atayın veya bunları isteklerinizde doğrudan kullanmak yerine özel bir işlevde parametre olarak kullanın.
IOException Diskten veri okuma ve diske veri yazma sırasında sorunlar oluşuyor. Bu sorunu önlemek için aşağıdaki önerilerden yararlanabilirsiniz:

  • Kullanıcı girişlerini yedekleyin.
  • Toplu yazma işlemleri sırasında oluşan sorunları çözebilme Örneğin, işlemin sorunu aştığından ve kalan işlemleri gerçekleştirdiğinizden emin olun.
  • İstek sorunlarını gidermek için yeniden deneme ve geri çekilme stratejilerini uygulayın.

RemoteException SDK'nın bağlandığı temel hizmette veya bu hizmetle iletişim kurulurken hatalar oluştu.

Örneğin, uygulamanız belirli bir uid ile kaydı silmeye çalışıyor. Ancak, temel hizmette check-in yapıldıktan sonra kaydın mevcut olmadığı anlaşılınca istisna oluşturulur.
Bu sorunu önlemek için aşağıdaki önerilerden yararlanabilirsiniz:

  • Uygulamanızın veri deposu ile Health Connect arasında düzenli olarak senkronizasyon yapın.
  • İstek sorunlarını gidermek için yeniden deneme ve geri çekilme stratejilerini uygulayın.

SecurityException İstekler, verilmeyen izinler gerektirdiğinde sorunlar oluşur. Bunu önlemek için yayınlanmış uygulamanızda Health Connect veri türlerinin kullanımını beyan ettiğinizden emin olun. Ayrıca, Health Connect izinlerini manifest dosyasında ve etkinliğinizde beyan etmeniz gerekir.