Health Connect, Google'ın Android ekosistemi için tanımladığı merkezi sağlık ve fitness veri deposudur. 2022'de duyurulan ve 2023'te stabil olan platform, 2024'te Android 14 ile işletim sistemine entegre edilmiş, 2026 itibarıyla ise Samsung Health, Fitbit, Garmin ve Apple HealthKit ile cross-platform interoperability altyapısını tamamlamıştır. Google Fit resmi olarak deprecated olmuş; yeni uygulamaların Health Connect'e geçmesi zorunlu hale gelmiştir.
Health Connect'in temel felsefesi "client-side privacy"dir: tüm sağlık verisi kullanıcının cihazında şifreli olarak saklanır, buluta gönderilmez (kullanıcı açıkça izin vermediği sürece). Her uygulama yalnızca kendi yazdığı veya kullanıcının izin verdiği verileri okuyabilir. Bu granular permission sistemi, Google Fit'in gevşek veri paylaşım modeliyle kıyaslandığında ciddi bir gizlilik iyileştirmesi sağlar. Wear OS entegrasyonu ve 50'den fazla data type desteğiyle platform, tıbbi sınıfa yakın veri toplama ve analiz senaryolarını destekler hale gelmiştir.
Bu rehberde Health Connect'i sıfırdan bir Android uygulamasına entegre etmeyi, izin sistemini doğru yönetmeyi, Google Fit migration sürecini, Samsung Health Platform interoperability'yi ve Wear OS entegrasyonunu inceleyeceğiz. Tüm kod örnekleri Kotlin ve health-connect-client 1.1.0-alpha versiyonunu temel almaktadır.
💡 Pro Tip: Health Connect, Android 14+ cihazlarda sistem seviyesinde pre-installed gelir. Android 9–13 için kullanıcının Play Store'dan "Health Connect" uygulamasını indirmesi gerekir. HealthConnectClient.getSdkStatus() ile cihaz uyumluluğunu her zaman runtime'da kontrol edin — kullanıcıyı Play Store'a yönlendirme logic'ini de hazırlayın.İçindekiler
- Health Connect Mimarisi ve Temel Kavramlar
- Kurulum ve SDK Entegrasyonu
- Permission Sistemi: Granular Sağlık İzinleri
- 50+ Data Type: Kapsamlı Veri Modeli
- Veri Yazma: Insert ve Upsert Operasyonları
- Veri Okuma: Query, Filter ve Aggregation
- Differential Sync: Değişim Tabanlı Senkronizasyon
- Google Fit'ten Migration
- Samsung Health Platform Interoperability
- Wear OS Entegrasyonu
Health Connect Mimarisi ve Temel Kavramlar
Health Connect, Android Jetpack'in bir parçası olarak androidx.health.connect namespace'i altında dağıtılır. Mimarinin üç katmanı vardır:
Depolama Katmanı: Şifreli SQLite veritabanı (Android Keystore ile), cihaz üzerinde. Her kayıt HealthRecord tipindedir ve UUID, metadata, timestamp, kullanıcı bölgesi (zone offset) içerir. Veri asla otomatik buluta gönderilmez.
API Katmanı: HealthConnectClient ana entry point'tir. insertRecords(), readRecords(), aggregateRecords(), deleteRecords(), getChanges() gibi suspend fonksiyonlar Coroutine uyumlu çalışır.
Permission Katmanı: Her data type için ayrı READ ve WRITE permission'ı vardır. Örneğin: HealthPermission.getReadPermission(HeartRateRecord::class). İzinler Activity'de PermissionController ile yönetilir; sistem Settings'ten de açılıp kapatılabilir.
Kayıt kategorileri:
- Series records: (time series): `HeartRateRecord`, `SpeedRecord`, `PowerRecord` — timestamp serisi içerir
- Interval records: (süre bazlı): `ExerciseSessionRecord`, `SleepSessionRecord` — başlangıç + bitiş zamanı
- Instantaneous records: (anlık): `WeightRecord`, `BodyTemperatureRecord` — tek timestamp
- Cumulative records: (birikimli): `StepsRecord`, `DistanceRecord` — zaman aralığında toplam
Kurulum ve SDK Entegrasyonu
kotlin
1// build.gradle.kts2dependencies {3 implementation("androidx.health.connect:connect-client:1.1.0-alpha11")4 5 // Wear OS entegrasyonu için (opsiyonel)6 implementation("androidx.health:health-services-client:1.1.0-alpha04")7}AndroidManifest'e gerekli permission'ları ve package visibility ekleyin:
xml
123 4 56 78 9 10 11 12 13 14 15 16 17 1819 20 21 22 23SDK durum kontrolü ve client oluşturma:
kotlin
1class HealthConnectManager(private val context: Context) {2 3 private val healthConnectClient by lazy {4 HealthConnectClient.getOrCreate(context)5 }6 7 companion object {8 fun isHealthConnectAvailable(context: Context): Boolean {9 val status = HealthConnectClient.getSdkStatus(context)10 return status == HealthConnectClient.SDK_AVAILABLE11 }12 13 fun getInstallIntent(context: Context): Intent? {14 val status = HealthConnectClient.getSdkStatus(context)15 return if (status == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {16 // Kullanıcıyı Play Store'a yönlendir17 Intent(Intent.ACTION_VIEW).apply {18 data = Uri.parse("market://details?id=com.google.android.apps.healthdata")19 addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)20 }21 } else null22 }23 }24 25 // Client'a erişim noktası26 suspend fun getClient(): HealthConnectClient {27 return healthConnectClient28 }29}Permission Sistemi: Granular Sağlık İzinleri
Health Connect permission'ları, normal Android runtime permission'larından farklı bir UI ile yönetilir. PermissionController sistemi kullanılır:
kotlin
1class HealthPermissionViewModel(2 private val healthConnectManager: HealthConnectManager,3 application: Application4) : AndroidViewModel(application) {5 6 // İstenen tüm permission'lar7 val requiredPermissions = setOf(8 HealthPermission.getReadPermission(HeartRateRecord::class),9 HealthPermission.getWritePermission(HeartRateRecord::class),10 HealthPermission.getReadPermission(StepsRecord::class),11 HealthPermission.getWritePermission(StepsRecord::class),12 HealthPermission.getReadPermission(SleepSessionRecord::class),13 HealthPermission.getReadPermission(ExerciseSessionRecord::class),14 HealthPermission.getWritePermission(ExerciseSessionRecord::class),15 HealthPermission.getReadPermission(WeightRecord::class),16 HealthPermission.getWritePermission(WeightRecord::class),17 )18 19 // Granted permission'ları kontrol et20 suspend fun checkGrantedPermissions(): Set { 21 return healthConnectManager.getClient()22 .permissionController23 .getGrantedPermissions()24 }25 26 // Eksik permission'ları hesapla27 suspend fun getMissingPermissions(): Set { 28 val granted = checkGrantedPermissions()29 return requiredPermissions - granted30 }31 32 // Permission launch intent'i33 fun getPermissionActivityContract(): ActivityResultContract, Set> { 34 return PermissionController.createRequestPermissionResultContract()35 }36}37 38// Activity/Fragment'ta kullanım39class HealthActivity : ComponentActivity() {40 41 private val viewModel: HealthPermissionViewModel by viewModels()42 43 private val requestPermissions = registerForActivityResult(44 viewModel.getPermissionActivityContract()45 ) { granted ->46 if (granted.containsAll(viewModel.requiredPermissions)) {47 // Tüm izinler verildi48 loadHealthData()49 } else {50 // Eksik izinler var - kullanıcıya bildir51 showPermissionRationale(granted)52 }53 }54 55 override fun onCreate(savedInstanceState: Bundle?) {56 super.onCreate(savedInstanceState)57 58 lifecycleScope.launch {59 val missing = viewModel.getMissingPermissions()60 if (missing.isNotEmpty()) {61 requestPermissions.launch(missing)62 } else {63 loadHealthData()64 }65 }66 }67}İzin ipuçları: Health Connect, kullanıcının izinleri toplu veya bireysel olarak verebileceği zengin bir sistem UI sunar. ACTION_SHOW_PERMISSIONS_RATIONALE intent'ini handle eden bir Activity tanımlamak zorunludur — bu, Health Connect ayarlarında "Neden bu izinler gerekli?" linki olarak görünür. Privacy Policy URL'si de zorunludur; yoksa submission reddedilir.
50+ Data Type: Kapsamlı Veri Modeli
Health Connect, 2026 itibarıyla 50'yi aşkın data type destekler. Kategorilere göre:
Aktivite: StepsRecord, DistanceRecord, ActiveCaloriesBurnedRecord, TotalCaloriesBurnedRecord, FloorsClimbedRecord, ElevationGainedRecord, ExerciseSessionRecord, SpeedRecord, PowerRecord, CyclingPedalingCadenceRecord, WheelchairPushesRecord
Vücut Ölçümleri: WeightRecord, HeightRecord, BodyFatRecord, BoneMassRecord, LeanBodyMassRecord, BodyWaterMassRecord, BasalMetabolicRateRecord
Kalp ve Dolaşım: HeartRateRecord, RestingHeartRateRecord, HeartRateVariabilityRmssdRecord, BloodPressureRecord, Vo2MaxRecord
Beslenme: NutritionRecord (100+ besin değeri: protein, karbonhidrat, yağ, vitamin, mineral...), HydrationRecord
Uyku: SleepSessionRecord (stage desteği: AWAKE, REM, LIGHT, DEEP), SleepStageRecord
Metabolizma: BloodGlucoseRecord, BasalBodyTemperatureRecord, MenstruationFlowRecord, OvulationTestRecord
Solunum: OxygenSaturationRecord, RespiratoryRateRecord, LungFunctionRecord
Mindfulness: MindfulnessSessionRecord (2025'te eklendi)
Veri Yazma: Insert ve Upsert Operasyonları
kotlin
1class HealthDataWriter(private val client: HealthConnectClient) {2 3 // Adım verisi yaz4 suspend fun writeSteps(5 startTime: Instant,6 endTime: Instant,7 count: Long8 ): InsertRecordsResponse {9 val stepsRecord = StepsRecord(10 startTime = startTime,11 endTime = endTime,12 count = count,13 startZoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime),14 endZoneOffset = ZoneOffset.systemDefault().rules.getOffset(endTime),15 metadata = Metadata(16 clientRecordId = "steps_${startTime.epochSecond}", // Idempotent insert17 dataOrigin = DataOrigin(packageName = "com.myapp"),18 recordingMethod = Metadata.RECORDING_METHOD_ACTIVELY_RECORDED19 )20 )21 return client.insertRecords(listOf(stepsRecord))22 }23 24 // Egzersiz seansı yaz (multi-metric)25 suspend fun writeExerciseSession(26 session: ExerciseData27 ): InsertRecordsResponse {28 val exerciseRecord = ExerciseSessionRecord(29 startTime = session.startTime,30 endTime = session.endTime,31 exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,32 title = session.title,33 notes = session.notes,34 startZoneOffset = ZoneOffset.UTC,35 endZoneOffset = ZoneOffset.UTC,36 segments = session.segments.map { segment ->37 ExerciseSegment(38 startTime = segment.startTime,39 endTime = segment.endTime,40 segmentType = ExerciseSegment.EXERCISE_SEGMENT_TYPE_RUNNING41 )42 },43 laps = session.laps.map { lap ->44 ExerciseLap(45 startTime = lap.startTime,46 endTime = lap.endTime,47 length = Length.meters(lap.distanceMeters)48 )49 }50 )51 52 // İlgili kalp atış verilerini de birlikte yaz53 val heartRateRecord = HeartRateRecord(54 startTime = session.startTime,55 endTime = session.endTime,56 startZoneOffset = ZoneOffset.UTC,57 endZoneOffset = ZoneOffset.UTC,58 samples = session.heartRateSamples.map { sample ->59 HeartRateRecord.Sample(60 time = sample.time,61 beatsPerMinute = sample.bpm62 )63 }64 )65 66 return client.insertRecords(listOf(exerciseRecord, heartRateRecord))67 }68 69 // Ağırlık verisi upsert (clientRecordId ile idempotent)70 suspend fun upsertWeight(weightKg: Double, measuredAt: Instant) {71 val weightRecord = WeightRecord(72 weight = Mass.kilograms(weightKg),73 time = measuredAt,74 zoneOffset = ZoneOffset.systemDefault().rules.getOffset(measuredAt),75 metadata = Metadata(76 clientRecordId = "weight_${measuredAt.epochSecond / 3600}", // Saatlik idempotent77 )78 )79 // insertRecords idempotent'tır: aynı clientRecordId'li kayıt varsa günceller80 client.insertRecords(listOf(weightRecord))81 }82}Veri Okuma: Query, Filter ve Aggregation
kotlin
1class HealthDataReader(private val client: HealthConnectClient) {2 3 // Adım sayısını tarih aralığıyla oku4 suspend fun readSteps(5 startTime: Instant,6 endTime: Instant7 ): List { 8 val request = ReadRecordsRequest(9 recordType = StepsRecord::class,10 timeRangeFilter = TimeRangeFilter.between(startTime, endTime),11 pageSize = 10012 )13 val response = client.readRecords(request)14 return response.records15 }16 17 // Kalp atış istatistiklerini toplu hesapla18 suspend fun getHeartRateStats(19 startTime: Instant,20 endTime: Instant21 ): HeartRateStats {22 val response = client.aggregate(23 AggregateRequest(24 metrics = setOf(25 HeartRateRecord.BPM_AVG,26 HeartRateRecord.BPM_MIN,27 HeartRateRecord.BPM_MAX,28 HeartRateRecord.MEASUREMENTS_COUNT29 ),30 timeRangeFilter = TimeRangeFilter.between(startTime, endTime)31 )32 )33 34 return HeartRateStats(35 avgBpm = response[HeartRateRecord.BPM_AVG] ?: 0.0,36 minBpm = response[HeartRateRecord.BPM_MIN]?.toInt() ?: 0,37 maxBpm = response[HeartRateRecord.BPM_MAX]?.toInt() ?: 0,38 measurementCount = response[HeartRateRecord.MEASUREMENTS_COUNT]?.toInt() ?: 039 )40 }41 42 // Uyku analizi43 suspend fun getSleepData(lastNDays: Int = 7): List { 44 val endTime = Instant.now()45 val startTime = endTime.minus(lastNDays.toLong(), ChronoUnit.DAYS)46 47 val request = ReadRecordsRequest(48 recordType = SleepSessionRecord::class,49 timeRangeFilter = TimeRangeFilter.between(startTime, endTime)50 )51 52 return client.readRecords(request).records.map { session ->53 SleepAnalysis(54 date = session.startTime.atZone(ZoneOffset.systemDefault()).toLocalDate(),55 durationMinutes = ChronoUnit.MINUTES.between(session.startTime, session.endTime),56 stages = session.stages.groupBy { it.stage }57 .mapValues { (_, stages) ->58 stages.sumOf {59 ChronoUnit.MINUTES.between(it.startTime, it.endTime)60 }61 },62 deepSleepMinutes = session.stages63 .filter { it.stage == SleepSessionRecord.STAGE_TYPE_DEEP }64 .sumOf { ChronoUnit.MINUTES.between(it.startTime, it.endTime) },65 remSleepMinutes = session.stages66 .filter { it.stage == SleepSessionRecord.STAGE_TYPE_REM }67 .sumOf { ChronoUnit.MINUTES.between(it.startTime, it.endTime) }68 )69 }70 }71 72 // Bucket aggregation: günlük adım trendi73 suspend fun getDailyStepsTrend(lastNDays: Int = 30): List { 74 val endTime = Instant.now()75 val startTime = endTime.minus(lastNDays.toLong(), ChronoUnit.DAYS)76 77 val response = client.aggregateGroupByPeriod(78 AggregateGroupByPeriodRequest(79 metrics = setOf(StepsRecord.COUNT_TOTAL),80 timeRangeFilter = TimeRangeFilter.between(startTime, endTime),81 timeRangeSlicer = Period.ofDays(1)82 )83 )84 85 return response.map { bucket ->86 DailySteps(87 date = bucket.startTime.atZone(ZoneOffset.systemDefault()).toLocalDate(),88 steps = bucket.result[StepsRecord.COUNT_TOTAL]?.toInt() ?: 089 )90 }91 }92}Differential Sync: Değişim Tabanlı Senkronizasyon
Uygulamanızın kendi backend'iyle senkronizasyon yapması için Health Connect'in getChanges() API'sini kullanın:
kotlin
1class HealthSyncManager(2 private val client: HealthConnectClient,3 private val preferences: SharedPreferences4) {5 6 companion object {7 private const val PREF_SYNC_TOKEN = "health_connect_sync_token"8 }9 10 // İlk sync veya token geçersizleştiğinde11 suspend fun getInitialChangesToken(): String {12 val request = ChangesTokenRequest(13 recordTypes = setOf(14 StepsRecord::class,15 HeartRateRecord::class,16 SleepSessionRecord::class,17 ExerciseSessionRecord::class18 )19 )20 return client.getChangesToken(request)21 }22 23 // Diferansiyel sync: sadece değişenleri al24 suspend fun syncChanges(): SyncResult {25 val token = preferences.getString(PREF_SYNC_TOKEN, null)26 ?: getInitialChangesToken().also { saveToken(it) }27 28 var currentToken = token29 val insertedRecords = mutableListOf() 30 val deletedUids = mutableListOf() 31 32 do {33 val changesResponse = client.getChanges(currentToken)34 35 for (change in changesResponse.changes) {36 when (change) {37 is UpsertionChange -> insertedRecords.add(change.record)38 is DeletionChange -> deletedUids.add(change.recordId)39 }40 }41 42 currentToken = changesResponse.nextChangesToken43 44 } while (changesResponse.hasMore)45 46 // Yeni token'ı kaydet47 saveToken(currentToken)48 49 return SyncResult(50 upserted = insertedRecords,51 deleted = deletedUids52 )53 }54 55 private fun saveToken(token: String) {56 preferences.edit()57 .putString(PREF_SYNC_TOKEN, token)58 .apply()59 }60}Token tabanlı sync, tam veri taramasından çok daha verimlidir. Token, uygulamanızın son sync zamanından bu yana yapılan tüm değişiklikleri (insert, update, delete) temsil eder. Token geçersizleşirse (Health Connect 30 gün sonra expire eder) InvalidTokenException fırlatılır; bu durumda yeni token alıp tam sync yapmanız gerekir.
Google Fit'ten Migration
Google Fit, Ekim 2024'ten itibaren yeni API key kabul etmemeye başlamış ve resmi olarak deprecated olmuştur. Migration stratejisi:
Veri okuma farkları: Google Fit, FitnessOptions ile granüler olmayan izinler kullanırken Health Connect her data type için ayrı izin gerektirir. Migration sırasında kullanıcıdan Health Connect izinlerini istemeniz gerekir.
Veri yazma farkları: Google Fit'te DataPoint ve DataSet vardı; Health Connect'te doğrudan typed record'lar kullanılır. DataType.TYPE_STEP_COUNT_DELTA → StepsRecord, DataType.TYPE_HEART_RATE_BPM → HeartRateRecord şeklinde eşleme yapılır.
Historical data: Kullanıcıların eski Google Fit verilerini Health Connect'e taşımak için Google'ın resmi migration aracını veya FitnessClient ile okuyup Health Connect'e yazma yaklaşımını kullanabilirsiniz. Google, Fit'i kapatmadan önce otomatik migration sunacağını açıklamıştır.
Uygulama içi migration flow:
kotlin
1suspend fun migrateFromGoogleFit(2 fitnessClient: HistoryClient,3 healthWriter: HealthDataWriter,4 dateRange: Pair 5) {6 // Google Fit'ten adım verisi oku7 val dataReadRequest = DataReadRequest.Builder()8 .read(DataType.TYPE_STEP_COUNT_DELTA)9 .setTimeRange(10 dateRange.first.toEpochMilli(),11 dateRange.second.toEpochMilli(),12 TimeUnit.MILLISECONDS13 )14 .build()15 16 val dataReadResult = fitnessClient.readData(dataReadRequest).await()17 18 // Health Connect formatına dönüştür19 dataReadResult.getDataSet(DataType.TYPE_STEP_COUNT_DELTA)20 .dataPoints21 .forEach { dataPoint ->22 val startInstant = Instant.ofEpochMilli(23 dataPoint.getStartTime(TimeUnit.MILLISECONDS)24 )25 val endInstant = Instant.ofEpochMilli(26 dataPoint.getEndTime(TimeUnit.MILLISECONDS)27 )28 val steps = dataPoint.getValue(Field.FIELD_STEPS).asInt().toLong()29 30 healthWriter.writeSteps(startInstant, endInstant, steps)31 }32}Samsung Health Platform Interoperability
Samsung Health Platform, Android 14+'ta Health Connect ile bidirectional sync destekler. Samsung cihazlarda Samsung Health tarafından yazılan veriler (Galaxy Watch ölçümleri dahil) Health Connect üzerinden okunabilir:
Okuma: Samsung Health verisi Health Connect'e sync edilir; standart ReadRecordsRequest ile okunur. DataOrigin filtreleyerek Samsung Health'e özgü verileri ayrıştırabilirsiniz:
kotlin
1suspend fun readSamsungHealthData(client: HealthConnectClient): List { 2 val samsungOrigin = DataOrigin("com.samsung.android.shealth")3 4 val request = ReadRecordsRequest(5 recordType = HeartRateRecord::class,6 timeRangeFilter = TimeRangeFilter.between(7 Instant.now().minus(24, ChronoUnit.HOURS),8 Instant.now()9 ),10 dataOriginFilter = setOf(samsungOrigin)11 )12 13 return client.readRecords(request).records14}Samsung Advanced Metrics: Galaxy Watch Ultra ve Watch 7+ modelleri Advanced Sleep Coaching, Metabolic Index, BioActive Sensor verileri üretir. Bu veriler Health Connect'te SleepSessionRecord ve HeartRateVariabilityRmssdRecord olarak görünür.
One UI Health SDK: Samsung'un kendi Health SDK'sı (One UI Health SDK 2.0) daha granüler Samsung-özel metrikler sunar; ancak Samsung cihaz bağımlılığı yaratır. Çoğu uygulama için Health Connect interoperability yeterlidir.
Wear OS Entegrasyonu
Wear OS cihazlardan gelen sağlık verisi Health Services API üzerinden toplanır ve Health Connect'e yazılır:
kotlin
1// Wear OS modülü (wearApp)2class ExerciseService : ExerciseUpdateCallback, LifecycleService() {3 4 private lateinit var exerciseClient: ExerciseClient5 private lateinit var healthServicesClient: HealthServicesClient6 7 override fun onCreate() {8 super.onCreate()9 healthServicesClient = HealthServices.getClient(this)10 exerciseClient = healthServicesClient.exerciseClient11 }12 13 // Egzersiz konfigürasyonu14 suspend fun startRunningSession() {15 val config = ExerciseConfig(16 exerciseType = ExerciseType.RUNNING,17 dataTypes = setOf(18 DataType.HEART_RATE_BPM,19 DataType.DISTANCE_TOTAL,20 DataType.STEPS_TOTAL,21 DataType.CALORIES_TOTAL,22 DataType.PACE,23 DataType.SPEED24 ),25 isAutoPauseAndResumeEnabled = true,26 isGpsEnabled = true,27 exerciseGoals = listOf(28 ExerciseGoal.createOneTimeGoal(29 DataTypeCondition(30 dataType = DataType.DISTANCE_TOTAL,31 threshold = Value.ofDouble(5000.0), // 5km hedef32 comparisonType = ComparisonType.GREATER_THAN_OR_EQUAL33 )34 )35 )36 )37 38 exerciseClient.setUpdateCallback(this, Dispatchers.IO.asExecutor(), this)39 exerciseClient.startExercise(config).await()40 }41 42 override fun onExerciseUpdateReceived(update: ExerciseUpdate) {43 val latestMetrics = update.latestMetrics44 val heartRate = latestMetrics.sample(DataType.HEART_RATE_BPM)45 val distance = latestMetrics.total(DataType.DISTANCE_TOTAL)46 47 // UI güncelle veya notification fırlat48 updateMetrics(heartRate?.value?.asDouble(), distance?.total?.asDouble())49 }50}51 52// Egzersiz tamamlandığında Health Connect'e kaydet (telefon tarafı)53suspend fun syncWearExerciseToHealthConnect(54 wearExerciseData: WearExerciseData,55 healthWriter: HealthDataWriter56) {57 // Wear OS'ta Health Services API otomatik sync yapar Android 13+'ta58 // Manuel sync için:59 healthWriter.writeExerciseSession(60 ExerciseData(61 startTime = wearExerciseData.startTime,62 endTime = wearExerciseData.endTime,63 title = "Koşu - Wear OS",64 heartRateSamples = wearExerciseData.heartRateSamples,65 segments = emptyList(),66 laps = wearExerciseData.laps67 )68 )69}Android 13+ üzerinde Wear OS, Health Connect ile otomatik arka plan sync yapar — manuel data transfer genellikle gerekmez. Ancak legacy Wear OS 3 cihazları için manuel sync kodu hâlâ gerekebilir.
ALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
Okuyucu Ödülü
Health Connect geliştirme için kaynaklar: **Health Connect Toolbox** (Play Store'da mevcut) sağlık verilerini manuel ekleyip silebilen resmi test aracıdır — gerçek sensör olmadan test için vazgeçilmez. **Health Connect Playground** GitHub'da açık kaynaklı örnek uygulama olup tüm data type'ların nasıl kullanılacağını gösterir. **Health Services API Codelab** (codelabs.developers.google.com) Wear OS + Health Connect entegrasyonunu adım adım anlatır. **Privacy Policy Generator** (GitHub: googlesamples/health-samples) Health Connect submission için gerekli privacy policy template'leri içerir.
Sonuç
Health Connect, Android'in sağlık veri ekosistemini Google Fit'in dağınık yapısından kurtararak merkezileştirilmiş, gizlilik odaklı bir platforma taşımıştır. 2026 itibarıyla Samsung Health, Fitbit ve Garmin ekosistemiyle interoperability, Wear OS native integration ve Android 14 sistem entegrasyonu ile platform olgunluk seviyesine ulaşmıştır. 50+ data type ile neredeyse tüm consumer health senaryolarını kapsayan Health Connect, klinik sınıfa yakın uygulamalar için de güçlü bir temel sunmaktadır.
Google Fit'ten migration yapanlar için öneri: Migration'ı kullanıcı isteğine göre yapın, eski verileri silmeyin ve her iki platformu da kısa süre paralel çalıştırın. Health Connect'in granular permission modeli kullanıcıya güven verir; bu güveni yansıtacak şekilde in-app messaging tasarlayın ve her iznin neden gerektiğini net açıklayın.
İlgili derinlemesine içerikler için Android 15 Privacy Sandbox ve Edge-to-Edge, Kotlin 2.1 K2 Compiler ve Context Parameters, Material 3 Expressive Design System ve Gemini Nano ile On-Device AI yazılarına göz atabilirsiniz.
Resmi kaynaklar: Health Connect developer guide, Health Connect API reference, Health Connect sample apps, Migration from Google Fit guide.

