Sağlık Hizmetleri, antrenman uygulamaları için ExerciseClient
üzerinden birinci sınıf destek sağlar.
ExerciseClient
ile uygulamanız bir egzersizin ne zaman devam ettiğini kontrol edebilir, egzersiz hedefleri ekleyebilir, egzersiz durumu, egzersiz etkinlikleri veya istenen diğer metriklerle ilgili güncellemeler alabilir. Daha fazla bilgi için Sağlık Hizmetleri'nin desteklediği egzersiz türlerinin tam listesine göz atın.
GitHub'daki Egzersiz örneğine göz atın.
Bağımlılık ekleme
Sağlık Hizmetleri'ne bağımlılık eklemek için projenize Google Maven deposunu eklemeniz gerekir. Daha fazla bilgi için Google'ın Maven deposuna göz atın.
Ardından, modül düzeyindeki build.gradle
dosyanıza aşağıdaki bağımlılığı ekleyin:
Modern
dependencies { implementation "androidx.health:health-services-client:1.1.0-alpha03" }
Kotlin
dependencies { implementation("androidx.health:health-services-client:1.1.0-alpha03") }
Uygulama yapısı
Sağlık Hizmetleri ile bir egzersiz uygulaması oluştururken aşağıdaki uygulama yapısını kullanın:
- Ekranlarınızı ve gezinme şeklinizi ana aktivitenin içinde tutun.
- Antrenman durumunu, sensör verilerini, devam eden aktiviteyi ve verileri ön plan hizmeti ile yönetin.
- Verileri Room'da depolayın ve WorkManager'ı kullanarak veri yükleyin.
Antrenmana hazırlanırken ve antrenman sırasında aktiviteniz çeşitli nedenlerle durdurulabilir. Kullanıcı başka bir uygulamaya geçebilir
veya kadrana dönebilir. Sistem, etkinliğinizin üzerine bir şeyler görüntüleyebilir veya
bir süre işlem yapılmadığında ekran kapanabilir.
Antrenmanın tamamında doğru çalışmayı sağlamak için ExerciseClient
ile birlikte sürekli çalışan bir ForegroundService
kullanın.
ForegroundService
kullanmak, OnContinue Activity API'yi kullanarak saat yüzeylerinizde bir gösterge görüntülenmesini sağlayarak kullanıcının hemen antrenmana dönmesini sağlar.
Ön plan hizmetinizde konum verilerini uygun şekilde istemeniz önemlidir. Manifest dosyanızda foregroundServiceType="location"
değerini belirtin ve uygun izinleri belirtin.
prepareExercise()
çağrısını içeren antrenman öncesi aktiviteniz ve antrenman aktiviteniz için AmbientLifecycleObserver
kullanın. Ancak, antrenman sırasında ambiyans modunda ekranı güncellemeyin. Bunun nedeni, Sağlık Hizmetleri'nin cihaz ekranı güç tasarrufu yapmak için ambiyans modundayken antrenman verilerini gruplandırmasıdır. Bu yüzden, gösterilen bilgiler güncel olmayabilir. Antrenmanlar sırasında güncel bilgileri ya da boş bir ekran görüntüleyerek kullanıcıya mantıklı gelen verileri gösterin.
Özellikleri kontrol edin
Her ExerciseType
, metrikler ve egzersiz hedefleri için belirli veri türlerini destekler. Bu özellikleri başlangıçta kontrol edin, çünkü cihaza bağlı olarak farklılık gösterebilirler. Bir cihaz belirli bir egzersiz türünü desteklemiyor olabilir veya otomatik duraklatma gibi belirli bir işlevi desteklemiyor olabilir. Ayrıca, bir cihazın özellikleri zaman içinde, örneğin bir yazılım güncellemesinden sonra değişebilir.
Uygulama başlatılırken cihaz özelliklerini sorgulayın ve aşağıdakileri saklayıp işleyin:
- Platformun desteklediği alıştırmalar.
- Her egzersiz için desteklenen özellikler.
- Her alıştırma için desteklenen veri türleri.
- Bu veri türlerinin her biri için gereken izinler.
Ne tür metrikleri isteyebileceğinizi, hangi egzersiz hedeflerini yapılandırabileceğinizi ve bu tür için başka hangi özelliklerin kullanılabildiğini görmek için istediğiniz egzersiz türüyle ExerciseCapabilities.getExerciseTypeCapabilities()
kullanın. Bu, aşağıdaki örnekte gösterilmiştir:
val healthClient = HealthServices.getClient(this /*context*/)
val exerciseClient = healthClient.exerciseClient
lifecycleScope.launch {
val capabilities = exerciseClient.getCapabilitiesAsync().await()
if (ExerciseType.RUNNING in capabilities.supportedExerciseTypes) {
runningCapabilities =
capabilities.getExerciseTypeCapabilities(ExerciseType.RUNNING)
}
}
Döndürülen ExerciseTypeCapabilities
içinde supportedDataTypes
, veri isteyebileceğiniz veri türlerini listeler. Bu, cihaza göre değişir. Bu nedenle, desteklenmeyen bir DataType
istememeye dikkat edin. Aksi takdirde isteğiniz başarısız olabilir.
Egzersizin, oluşturmak istediğiniz bir egzersiz hedefini destekleyip destekleyemeyeceğini belirlemek için supportedGoals
ve supportedMilestones
alanlarını kullanın.
Uygulamanız, kullanıcının otomatik duraklatma özelliğini kullanmasına izin veriyorsa supportsAutoPauseAndResume
kullanan cihaz tarafından bu işlevin desteklendiğinden emin olmanız gerekir.
ExerciseClient
, cihazda desteklenmeyen istekleri reddeder.
Aşağıdaki örnekte HEART_RATE_BPM
veri türü, STEPS_TOTAL
hedef özelliği ve otomatik duraklatma işlevi desteği kontrol edilmektedir:
// Whether we can request heart rate metrics.
supportsHeartRate = DataType.HEART_RATE_BPM in runningCapabilities.supportedDataTypes
// Whether we can make a one-time goal for aggregate steps.
val stepGoals = runningCapabilities.supportedGoals[DataType.STEPS_TOTAL]
supportsStepGoals =
(stepGoals != null && ComparisonType.GREATER_THAN_OR_EQUAL in stepGoals)
// Whether auto-pause is supported.
val supportsAutoPause = runningCapabilities.supportsAutoPauseAndResume
Egzersiz durumu güncellemelerine kaydolun
Egzersiz güncellemeleri bir dinleyiciye iletilir. Uygulamanız aynı anda yalnızca tek bir dinleyici kaydedebilir. Aşağıdaki örnekte gösterildiği gibi, antrenmana başlamadan önce dinleyicinizi ayarlayın. Dinleyiciniz yalnızca uygulamanızın sahip olduğu egzersizlerle ilgili güncellemeleri alır.
val callback = object : ExerciseUpdateCallback {
override fun onExerciseUpdateReceived(update: ExerciseUpdate) {
val exerciseStateInfo = update.exerciseStateInfo
val activeDuration = update.activeDurationCheckpoint
val latestMetrics = update.latestMetrics
val latestGoals = update.latestAchievedGoals
}
override fun onLapSummaryReceived(lapSummary: ExerciseLapSummary) {
// For ExerciseTypes that support laps, this is called when a lap is marked.
}
override fun onAvailabilityChanged(
dataType: DataType<*, *>,
availability: Availability
) {
// Called when the availability of a particular DataType changes.
when {
availability is LocationAvailability -> // Relates to Location/GPS.
availability is DataTypeAvailability -> // Relates to another DataType.
}
}
}
exerciseClient.setUpdateCallback(callback)
Egzersizin ömrünü yönetme
Sağlık Hizmetleri, cihazdaki tüm uygulamalarda aynı anda en fazla bir egzersizi destekler. Bir egzersiz izleniyorsa ve farklı bir uygulama yeni bir egzersizi izlemeye başlarsa ilk egzersiz sonlandırılır.
Egzersizinize başlamadan önce aşağıdakileri yapın:
- Bir egzersizin zaten takip edilip edilmediğini kontrol edin ve buna göre tepki verin. Örneğin, önceki alıştırmayı geçersiz kılıp yenisini izlemeye başlamadan önce kullanıcıdan onay isteyebilirsiniz.
Aşağıdaki örnekte, getCurrentExerciseInfoAsync
ile mevcut bir egzersizin nasıl kontrol edileceği gösterilmektedir:
lifecycleScope.launch {
val exerciseInfo = exerciseClient.getCurrentExerciseInfoAsync().await()
when (exerciseInfo.exerciseTrackedStatus) {
OTHER_APP_IN_PROGRESS -> // Warn user before continuing, will stop the existing workout.
OWNED_EXERCISE_IN_PROGRESS -> // This app has an existing workout.
NO_EXERCISE_IN_PROGRESS -> // Start a fresh workout.
}
}
İzinler
ExerciseClient
kullanırken uygulamanızın gerekli izinleri istediğinden ve koruduğundan emin olun.
Uygulamanız LOCATION
verilerini kullanıyorsa uygulamanızın bu veriler için de istekte bulunduğundan ve gerekli izinleri sağladığından emin olun.
Tüm veri türleri için prepareExercise()
veya startExercise()
yöntemini çağırmadan önce aşağıdakileri yapın:
AndroidManifest.xml
dosyanızda istenen veri türleri için uygun izinleri belirtin.- Kullanıcının gerekli izinleri verdiğini doğrulayın. Daha fazla bilgi için Uygulama izinleri isteme bölümüne bakın. Health Services, gerekli izinler henüz verilmediyse isteği reddeder.
Konum verileri için aşağıdaki ek adımları uygulayın:
isProviderEnabled(LocationManager.GPS_PROVIDER)
kullanarak cihazda GPS'nin etkin olup olmadığını kontrol edin. Gerekirse kullanıcıdan konum ayarlarını açmasını isteyin.- Antrenman boyunca uygun
foregroundServiceType
içeren birForegroundService
bulunduğundan emin olun.
Antrenmana hazırlanın
GPS veya nabız gibi bazı sensörlerin ısınması kısa sürebilir veya kullanıcı antrenmana başlamadan önce verilerini görmek isteyebilir. İsteğe bağlı prepareExerciseAsync()
yöntemi, bu sensörlerin ısınmasına ve antrenman için zamanlayıcı başlatılmadan verilerin alınmasını sağlar. activeDuration
, bu hazırlık süresinden etkilenmez.
prepareExerciseAsync()
numaralı telefonu aramadan önce aşağıdakileri kontrol edin:
Platform genelinde konum ayarını kontrol edin. Kullanıcı, bu ayarı ana Ayarlar menüsünden kontrol eder. Bu ayar, uygulama düzeyindeki izin kontrolünden farklıdır.
Bu ayar kapalıysa kullanıcıya konuma erişimi reddettiğini bildirin ve uygulamanız konum bilgisi gerektiriyorsa kullanıcıdan bu özelliği etkinleştirmesini isteyin.
Uygulamanızın vücut sensörleri, aktivite tanıma ve hassas konum için çalışma zamanında istenen izinlere sahip olduğunu onaylayın. Eksik izinler için kullanıcıdan yeterli bağlam sağlayarak çalışma zamanı izinlerini isteyin. Kullanıcı belirli bir izni vermezse bu izinle ilişkili veri türlerini
prepareExerciseAsync()
çağrısından kaldırın. Vücut sensörü veya konum izinleri verilmediyseprepareExerciseAsync()
çağrısı yapmayın. Hazırlık çağrısı özellikle bir egzersize başlamadan önce stabil bir nabız veya GPS sabitlemesi almak için yapılır. Uygulama, bu izinleri gerektirmeyen adıma dayalı mesafe, hız, hız ve diğer metrikleri almaya devam edebilir.
prepareExerciseAsync()
aramanızın başarılı olabilmesi için aşağıdakileri yapın:
- Hazırlama çağrısını içeren antrenman öncesi etkinliği için
AmbientLifecycleObserver
kullanın. - Ön plan hizmetinizden
prepareExerciseAsync()
numaralı telefonu arayın. Hizmette değilse ve etkinlik yaşam döngüsüne bağlıysa sensör hazırlığı gereksiz yere sonlandırılabilir. - Kullanıcı antrenman öncesi aktiviteden ayrılırsa sensörleri kapatmak ve güç kullanımını azaltmak için
endExercise()
numaralı telefonu arayın.
Aşağıdaki örnekte, prepareExerciseAsync()
hizmetinin nasıl çağrılacağı gösterilmektedir:
val warmUpConfig = WarmUpConfig(
ExerciseType.RUNNING,
setOf(
DataType.HEART_RATE_BPM,
DataType.LOCATION
)
)
// Only necessary to call prepareExerciseAsync if body sensor or location
//permissions are given
exerciseClient.prepareExerciseAsync(warmUpConfig).await()
// Data and availability updates are delivered to the registered listener.
Uygulama PREPARING
durumuna geçtikten sonra sensör kullanılabilirliği güncellemeleri ExerciseUpdateCallback
ile onAvailabilityChanged()
arasında yayınlanır.
Daha sonra bu bilgiler kullanıcıya sunulur. Böylece kullanıcı antrenmana başlayıp başlamayacağına karar verebilir.
Antrenmanı başlat
Bir egzersize başlamak istediğinizde; egzersiz türünü, metriklerini almak istediğiniz veri türlerini ve tüm egzersiz hedeflerini veya ara hedeflerini yapılandırmak için bir ExerciseConfig
oluşturun.
Egzersiz hedefleri bir DataType
ve bir koşuldan oluşur. Egzersiz hedefleri, bir koşul karşılandığında (ör. kullanıcı belirli bir mesafe koştuğunda) tetiklenen tek seferlik bir hedeftir. Bir egzersiz ara hedefi de
belirlenebilir. Egzersiz ara hedefleri birden çok kez tetiklenebilir. Örneğin, kullanıcının belirlediği mesafeyi belirli bir noktayı her aştığında tetiklenebilir.
Aşağıdaki örnekte, her türde bir hedefin nasıl oluşturulacağı gösterilmektedir:
const val CALORIES_THRESHOLD = 250.0
const val DISTANCE_THRESHOLD = 1_000.0 // meters
suspend fun startExercise() {
// Types for which we want to receive metrics.
val dataTypes = setOf(
DataType.HEART_RATE_BPM,
DataType.CALORIES_TOTAL,
DataType.DISTANCE
)
// Create a one-time goal.
val calorieGoal = ExerciseGoal.createOneTimeGoal(
DataTypeCondition(
dataType = DataType.CALORIES_TOTAL,
threshold = CALORIES_THRESHOLD,
comparisonType = ComparisonType.GREATER_THAN_OR_EQUAL
)
)
// Create a milestone goal. To make a milestone for every kilometer, set the initial
// threshold to 1km and the period to 1km.
val distanceGoal = ExerciseGoal.createMilestone(
condition = DataTypeCondition(
dataType = DataType.DISTANCE_TOTAL,
threshold = DISTANCE_THRESHOLD,
comparisonType = ComparisonType.GREATER_THAN_OR_EQUAL
),
period = DISTANCE_THRESHOLD
)
val config = ExerciseConfig(
exerciseType = ExerciseType.RUNNING,
dataTypes = dataTypes,
isAutoPauseAndResumeEnabled = false,
isGpsEnabled = true,
exerciseGoals = mutableListOf<ExerciseGoal<Double>>(calorieGoal, distanceGoal)
)
exerciseClient.startExerciseAsync(config).await()
}
Ayrıca tüm egzersizler için turları işaretleyebilirsiniz. Sağlık Hizmetleri, tur dönemi boyunca toplanan metrikleri içeren bir ExerciseLapSummary
sağlar.
Önceki örnekte, konum verileri istenirken doğru olması gereken isGpsEnabled
kullanımı gösterilmektedir. Ancak, GPS kullanmak diğer ölçümlerde de yardımcı olabilir.
ExerciseConfig
, mesafeyi DataType
olarak belirtirse varsayılan olarak mesafe tahmini için adımlar kullanılır. İsteğe bağlı olarak GPS'i etkinleştirdiğinizde, bunun yerine mesafeyi tahmin etmek için konum bilgileri kullanılabilir.
Antrenmanı duraklatma, devam ettirme ve sonlandırma
Antrenmanları pauseExerciseAsync()
veya endExerciseAsync()
gibi uygun bir yöntemle duraklatabilir, devam ettirebilir ve sonlandırabilirsiniz.
Doğru veri kaynağı olarak ExerciseUpdate
eyaletini kullanın. Antrenman, pauseExerciseAsync()
çağrısı geri döndüğünde değil, ExerciseUpdate
mesajına yansıtıldığında duraklatılmış olarak kabul edilir. Bu, özellikle kullanıcı arayüzü durumları söz konusu olduğunda dikkate alınması gereken önemli bir noktadır. Kullanıcı duraklatma düğmesine basarsa duraklatma düğmesini devre dışı bırakın ve Sağlık Hizmetlerinde pauseExerciseAsync()
numarasını arayın. Sağlık Hizmetleri'nin ExerciseUpdate.exerciseStateInfo.state
kullanarak duraklatılmış duruma ulaşmasını bekleyin ve devam ettirmek için düğmeyi değiştirin. Bunun nedeni, Sağlık Hizmetleri durum güncellemelerinin teslim edilmesinin düğmeye basmaya kıyasla daha uzun zaman almasıdır. Bu nedenle, tüm kullanıcı arayüzü değişikliklerini düğmelere basarsanız kullanıcı arayüzü, Sağlık Hizmetleri durumuyla senkronize olmayabilir.
Aşağıdaki durumlarda bunu göz önünde bulundurun:
- Otomatik duraklatma etkin: Antrenman, kullanıcı etkileşimi olmadan duraklatılabilir veya başlatılabilir.
- Başka bir uygulama antrenman başlatıyorsa: Antrenmanınız kullanıcı etkileşimi olmadan sonlandırılabilir.
Uygulamanızın antrenmanı başka bir uygulama tarafından sonlandırılırsa uygulamanız bu sonlandırma işlemini düzgün bir şekilde gerçekleştirmelidir:
- Kullanıcının ilerleme durumunun silinmemesi için kısmi antrenman durumunu kaydedin.
- Devam Eden Etkinlik simgesini kaldırın ve kullanıcıya antrenmanının başka bir uygulama tarafından sonlandırıldığını bildiren bir bildirim gönderin.
Ayrıca, devam eden bir alıştırma sırasında izinlerin iptal edildiği bir durumu da ele alın. Bu, AUTO_END_PERMISSION_LOST
ExerciseEndReason
ile isEnded
durumu kullanılarak gönderilir. Bu durumu sonlandırma durumuna benzer bir şekilde ele alın: kısmi durumu kaydedin, Devam Eden Etkinlik simgesini kaldırın ve kullanıcıya ne olduğu konusunda bir bildirim gönderin.
Aşağıdaki örnekte, fesih işleminin doğru bir şekilde nasıl kontrol edileceği gösterilmektedir:
val callback = object : ExerciseUpdateCallback {
override fun onExerciseUpdateReceived(update: ExerciseUpdate) {
if (update.exerciseStateInfo.state.isEnded) {
// Workout has either been ended by the user, or otherwise terminated
}
...
}
...
}
Etkin süreyi yönet
Uygulama, egzersiz sırasında antrenmanın aktif süresini görüntüleyebilir. Uygulama, Sağlık Hizmetleri ve egzersiz takibinden sorumlu düşük güçlü işlemci olan Mikro Denetleyici Birimi (MCU) ve tüm cihazların aynı aktif süre ile senkronize olması gerekir. Sağlık Hizmetleri, bunun yönetimine yardımcı olmak için uygulamanın zamanlayıcıyı başlatabileceği bir sabitleme noktası sağlayan bir ActiveDurationCheckpoint
gönderir.
Etkin süre MCU'dan gönderildiğinden ve uygulamaya ulaşması kısa bir zaman alabileceği için ActiveDurationCheckpoint
iki özellik içerir:
activeDuration
: egzersizin ne kadar süredir aktif olduğutime
: etkin sürenin hesaplandığı zaman
Bu nedenle, uygulamada bir egzersizin aktif süresi aşağıdaki denklem kullanılarak ActiveDurationCheckpoint
ile hesaplanabilir:
(now() - checkpoint.time) + checkpoint.activeDuration
Bu, MCU'da hesaplanan etkin süre ile uygulamaya ulaşma arasındaki küçük farkı hesaba katar. Bu, uygulamada bir kronometre oluşturmak için kullanılabilir ve uygulamanın zamanlayıcısının Sağlık Hizmetleri ve MCU'daki süreyle mükemmel bir şekilde uyumlu olmasına yardımcı olur.
Egzersiz duraklatılırsa uygulama, hesaplanan süre kullanıcı arayüzünde gösterilen süre bitene kadar kullanıcı arayüzünde zamanlayıcıyı yeniden başlatmayı bekler.
Bunun nedeni, duraklatma sinyalinin kısa bir gecikmeyle Sağlık Hizmetlerine ve MCU'ya ulaşmasıdır. Örneğin, uygulama t=10. saniyede duraklatılırsa Sağlık Hizmetleri, PAUSED
güncellemesini t=10.2 saniyeye kadar uygulamaya yayınlamayabilir.
ExerciseClient verileriyle çalışma
Uygulamanızın kaydedildiği veri türlerine ait metrikler ExerciseUpdate
mesajlarında yayınlanır.
İşlemci, mesajları yalnızca uyanıkken veya maksimum raporlama süresine (ör. 150 saniyede bir) ulaşıldığında gönderir. activeDuration
ile kronometrede ilerlemek için ExerciseUpdate
sıklığına güvenmeyin. Bağımsız bir kronometrenin nasıl uygulanacağına ilişkin örnek için GitHub'daki Alıştırma örneğine bakın.
Bir kullanıcı antrenman başlattığında ExerciseUpdate
mesajları sık sık teslim edilebilir. Örneğin, saniyede bir. Kullanıcı antrenmana başladığında ekran kapanabilir. Bu durumda Sağlık Hizmetleri, ana işlemciyi uyandırmamak için verileri daha seyrek olarak gönderebilir, ancak yine de aynı sıklıkta örneklenmiş olabilir. Kullanıcı ekrana baktığında toplu olarak işlenme sürecinde olan tüm veriler hemen uygulamanıza iletilir.
Gruplama hızını kontrol etme
Bazı senaryolarda, ekran kapalıyken uygulamanızın belirli veri türlerini alma sıklığını kontrol etmek isteyebilirsiniz. BatchingMode
nesnesi, uygulamanızın veri gönderimlerini daha sık almak için varsayılan toplu işleme davranışını geçersiz kılmasını sağlar.
Gruplama hızını yapılandırmak için aşağıdaki adımları tamamlayın:
Belirli bir
BatchingMode
tanımının cihaz tarafından desteklenip desteklenmediğini kontrol edin:// Confirm BatchingMode support to control heart rate stream to phone. suspend fun supportsHrWorkoutCompanionMode(): Boolean { val capabilities = exerciseClient.getCapabilities() return BatchingMode.HEART_RATE_5_SECONDS in capabilities.supportedBatchingModeOverrides }
ExerciseConfig
nesnesinin belirli birBatchingMode
öğesini kullanması gerektiğini aşağıdaki kod snippet'inde gösterildiği gibi belirtin.val config = ExerciseConfig( exerciseType = ExerciseType.WORKOUT, dataTypes = setOf( DataType.HEART_RATE_BPM, DataType.TOTAL_CALORIES ), // ... batchingModeOverrides = setOf(BatchingMode.HEART_RATE_5_SECONDS) )
İsteğe bağlı olarak, belirli bir toplu işleme davranışının antrenman süresince devam etmesi yerine antrenman sırasında
BatchingMode
öğesini dinamik olarak yapılandırabilirsiniz:val desiredModes = setOf(BatchingMode.HEART_RATE_5_SECONDS) exerciseClient.overrideBatchingModesForActiveExercise(desiredModes)
Özelleştirilmiş
BatchingMode
öğesini temizleyip varsayılan davranışa dönmek içinexerciseClient.overrideBatchingModesForActiveExercise()
öğesine boş bir grup iletin.
Zaman damgaları
Her bir veri noktasının zaman noktası, cihazın önyüklenmesinden bu yana geçen süreyi temsil eder. Bunu zaman damgasına dönüştürmek için aşağıdakileri yapın:
val bootInstant =
Instant.ofEpochMilli(System.currentTimeMillis() - SystemClock.elapsedRealtime())
Bu değer daha sonra her veri noktası için getStartInstant()
veya getEndInstant()
ile kullanılabilir.
Veri doğruluğu
Bazı veri türleri, her bir veri noktasıyla ilişkilendirilmiş doğruluk bilgilerine sahip olabilir.
accuracy
özelliğinde gösterilir.
HrAccuracy
ve LocationAccuracy
sınıfları sırasıyla HEART_RATE_BPM
ve LOCATION
veri türleri için doldurulabilir. Mevcut olduğu durumlarda, her bir veri noktasının uygulamanız için yeterli doğrulukta olup olmadığını belirlemek amacıyla accuracy
özelliğini kullanın.
Verileri depolayın ve yükleyin
Sağlık Hizmetleri'nden gönderilen verileri kalıcı olarak saklamak için Room'u kullanın. Veri yükleme, alıştırmanın sonunda İş Yöneticisi gibi bir mekanizma kullanılarak gerçekleştirilir. Bu, ağdan veri yükleme çağrılarının egzersiz sona erene kadar ertelenmesini sağlayarak egzersiz sırasında güç tüketimini en aza indirir ve çalışmayı basitleştirir.
Entegrasyon kontrol listesi
Sağlık Hizmetleri'nin ExerciseClient
özelliğini kullanan uygulamanızı yayınlamadan önce, kullanıcı deneyiminizin bazı yaygın sorunlardan kaçınmasını sağlamak için aşağıdaki yapılacaklar listesine bakın.
Şunları doğrulayın:
- Uygulamanız, uygulama her çalıştırıldığında egzersiz türünün özelliklerini ve cihazın özelliklerini kontrol eder. Bu şekilde, belirli bir cihazın veya egzersizin, uygulamanızın ihtiyaç duyduğu veri türlerinden birini desteklemediğini tespit edebilirsiniz.
- Gerekli izinleri ister, bu izinleri korur ve manifest dosyanızda belirtirsiniz. Uygulamanız,
prepareExerciseAsync()
çağrısı yapmadan önce çalışma zamanında istenen izinlerin verildiğini onaylar. - Uygulamanız, aşağıdaki durumları ele almak için
getCurrentExerciseInfoAsync()
aracını kullanır:- Bir egzersiz zaten izlenmekte ve uygulamanız önceki egzersizi geçersiz kılıyor.
- Başka bir uygulama egzersizinizi sonlandırdı. Bu durum, kullanıcı uygulamayı yeniden açtığında, başka bir uygulama devraldığı için egzersizin durdurulduğunu açıklayan bir mesajla karşılandığında ortaya çıkabilir.
LOCATION
verilerini kullanıyorsanız:- Uygulamanız, egzersiz boyunca (hazırlık çağrısı dahil) karşılık gelen
foregroundServiceType
ile birForegroundService
sağlar. isProviderEnabled(LocationManager.GPS_PROVIDER)
ile cihazda GPS'in etkinleştirildiğinden emin olun ve gerekirse kullanıcıdan konum ayarlarını açmasını isteyin.- Düşük gecikmeyle konum verisi almanın büyük önem taşıdığı zorlu kullanım alanları için Çok Kaynaklı Konum Sağlayıcı'yı (FLP) entegre edip verilerini bir ilk konum düzeltmesi olarak kullanmayı düşünün. Sağlık Hizmetleri'nden daha kararlı konum bilgileri sunulduğunda FLP yerine bu bilgiyi kullanın.
- Uygulamanız, egzersiz boyunca (hazırlık çağrısı dahil) karşılık gelen
- Uygulamanız veri yüklemeyi gerektiriyorsa veri yüklemek için yapılan tüm ağ çağrıları, alıştırma sona erene kadar ertelenir. Aksi takdirde, egzersiz boyunca uygulamanız gerekli ağ çağrılarını tutumlu bir şekilde yapar.
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken görüntülenir
- Pasif veri güncellemeleri
- Wear OS'te Sağlık Hizmetleri
- Kartları kullanmaya başlama