Sağlık Hizmetleri, antrenman uygulamaları için ExerciseClient
üzerinden birinci sınıf destek sağlar.
ExerciseClient
ile uygulamanız egzersizin ne zaman devam ettiğini kontrol edebilir, egzersiz hedefleri ekleyebilir, egzersiz durumu, egzersiz etkinlikleri veya istenen diğer metriklerle ilgili güncellemeleri alabilir. Daha fazla bilgi için Sağlık Hizmetleri'nin desteklediği egzersiz türlerinin tam listesine göz atın.
GitHub'daki Alıştırma örneğini inceleyin.
Bağımlılık ekleme
Sağlık Hizmetleri'nde bağımlılık eklemek için projenize Google Maven deposunu eklemeniz gerekir. Daha fazla bilgi için Google'ın Maven deposuna bakı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 etkinlik 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 veri yüklemek için WorkManager'ı kullanın.
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österebilir 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
kullandığınızda OnContinue Activity API'yi kullanarak kol saati yüzeylerinizde bir gösterge görüntüleyebilirsiniz, böylece kullanıcı hemen antrenmana dönebilirsiniz.
Ön plan hizmetinizde konum verilerini uygun şekilde istemeniz önemlidir. Manifest dosyanızda foregroundServiceType="location"
ifadesini ve uygun izinleri belirtin.
prepareExercise()
çağrısını içeren antrenman öncesi aktiviteniz ve antrenman aktiviteniz için AmbientLifecycleObserver
kullanın. Bununla birlikte, ambiyans modundayken antrenman sırasında ekranı güncellemeyin: Bunun nedeni Sağlık Hizmetleri'nin, cihaz ekranı ambiyans modundayken güç tasarrufu sağlamak için antrenman verilerini gruplandırmasıdır. Bu nedenle, gösterilen bilgiler güncel olmayabilir. Antrenmanlar sırasında güncel bilgiler veya boş bir ekranla kullanıcıya mantıklı gelen veriler 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. Bunlar cihaza göre farklılık gösterebilir. 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 zamanla (ör. bir yazılım güncellemesi sonrasında) 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 metrikler 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
isteğinde bulunmamaya dikkat edin.
Aksi halde 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 desteklenip desteklenmediğini kontrol etmeniz 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 için destek 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 izleniyor 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 izlenip izlenmediğini kontrol etmek ve buna göre tepki vermek. Örneğin, önceki bir egzersizi geçersiz kılıp yeni bir egzersizi izlemeye başlamadan önce kullanıcıdan onay isteyin.
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
özelliğini 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 uygun izinleri istemesini ve sürdürmesini sağlayın.
prepareExercise()
veya startExercise()
yöntemini çağırmadan önce tüm veri türleri için 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. Sağlık Hizmetleri, gerekli izinler henüz verilmemişse isteği reddeder.
Konum verileri için aşağıdaki ek adımları uygulayın:
isProviderEnabled(LocationManager.GPS_PROVIDER)
kullanarak cihazda GPS'in etkin olup olmadığını kontrol edin. Gerekirse kullanıcıdan konum ayarlarını açmasını isteyin.- Antrenman boyunca uygun
foregroundServiceType
içeren birForegroundService
değerinin korunduğundan emin olun.
Antrenmana hazırlanma
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ını ve antrenman için zamanlayıcı başlatmadan 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 ayarı 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 çalışma zamanı izinlerini isteyerek yeterli bağlam sağlayın. Kullanıcı belirli bir izin vermezse bu izinle ilişkili veri türlerini
prepareExerciseAsync()
çağrısından kaldırın. Vücut sensörü veya konum izni verilmediyseprepareExerciseAsync()
çağrısı yapmayın. Hazırlık çağrısı, 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()
numaralı telefona yaptığınız aramanın başarılı olabilmesi için aşağıdakileri yapın:
- Hazırlama çağrısını içeren antrenman öncesi aktivite için
AmbientLifecycleObserver
özelliğini kullanın. - Ön plan hizmetinizden
prepareExerciseAsync()
çağrısı yapın. Hizmette yoksa 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()
aracılığıyla yayınlanır.
Daha sonra bu bilgiler antrenmana başlayıp başlamamaya karar verebilmesi için kullanıcıya sunulabilir.
Antrenmana başla
Bir egzersize başlamak istediğinizde, egzersiz türünü, metriklerini almak istediğiniz veri türlerini ve egzersiz hedeflerini veya aşamalarını 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ı belirlenen mesafeyi 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()
}
Turları tüm egzersizler için de işaretleyebilirsiniz. Sağlık Hizmetleri, tur süresi 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 mesafeyi tahmin etmek için adımlar kullanılır. İsteğe bağlı olarak GPS etkinleştirildiğinde, mesafeyi tahmin etmek için bunun yerine konum bilgileri kullanılabilir.
Antrenmanı duraklatma, devam ettirme ve bitirme
Antrenmanları pauseExerciseAsync()
veya endExerciseAsync()
gibi uygun bir yöntemle duraklatabilir, devam ettirebilir ve sonlandırabilirsiniz.
Doğru bilgi kaynağı olarak ExerciseUpdate
durumunu 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. Kullanıcı arayüzü durumları söz konusu olduğunda bu özellikle dikkat edilmesi gerekir. Kullanıcı duraklat düğmesine basarsa duraklat düğmesini devre dışı bırakın ve Sağlık Hizmetleri'nde 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 sunulmasının düğmeye basıldığından daha uzun sürebilmesidir. Bu nedenle, tüm kullanıcı arayüzü değişikliklerini düğmelere bastığınızda bağlarsanız kullanıcı arayüzü, Sağlık Hizmetleri durumuyla senkronize olamayabilir.
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 sorunsuz bir şekilde işlemelidir:
- 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ı belirten bir bildirim gönderin.
Ayrıca, devam eden bir alıştırma sırasında izinlerin iptal edildiği durumlarla da ilgilenin. 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 hakkında 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
Egzersiz sırasında uygulama, antrenmanın aktif süresini görüntüleyebilir. Uygulama, Sağlık Hizmetleri ve egzersiz izlemeden sorumlu düşük güçlü işlemci olan Mikro Denetleyici Unity (MCU) cihazı aynı anda senkronize olmalıdır. Sağlık Hizmetleri, bu durumun yönetilmesine yardımcı olmak için uygulamanın zamanlayıcısını başlatabileceği bir sabitleme noktası sağlayan ActiveDurationCheckpoint
gönderir.
Etkin süre MCU'dan gönderildiğinden ve uygulamaya geçmesi kısa bir zaman alabileceği için ActiveDurationCheckpoint
iki özellik içerir:
activeDuration
: egzersizin ne kadar süredir aktif olduğutime
: etkin süre hesaplandığı zaman
Bu nedenle, uygulamada bir egzersizin aktif süresi aşağıdaki denklem kullanılarak ActiveDurationCheckpoint
değerinden hesaplanabilir:
(now() - checkpoint.time) + checkpoint.activeDuration
Bu, MCU'da hesaplanan aktif süre ile uygulamaya ulaşma arasındaki küçük deltayı dikkate alır. Bu özellik, uygulamada bir kronometre oluşturmak için kullanılabilir ve uygulama zamanlayıcısının, Sağlık Hizmetleri ve MCU'daki zamanla 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 geçene kadar kullanıcı arayüzünde zamanlayıcıyı yeniden başlatmayı bekler.
Bunun nedeni, duraklatma sinyalinin küçük bir gecikmeyle Sağlık Hizmetleri'ne 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 kaydettirildiği veri türlerine ait metrikler ExerciseUpdate
mesajlarda gönderilir.
İşlemci, mesajları yalnızca uyanıkken veya maksimum raporlama süresine (ör. 150 saniyede bir) ulaşıldığında gönderir. activeDuration
ile kronometreyi ilerletmek için ExerciseUpdate
frekansına güvenmeyin. Bağımsız bir kronometrenin nasıl uygulanacağına ilişkin örnek için GitHub'daki Alıştırma örneği bölümüne bakın.
Bir kullanıcı antrenman başlattığında ExerciseUpdate
mesajları sık aralıklarla (ör. saniyede bir) teslim edilebilir. Kullanıcı antrenmana başlarken ekran kapanabilir. Daha sonra Sağlık Hizmetleri, ana işlemciyi uyandırmamak için verileri daha seyrek olarak teslim edebilir ancak yine de aynı sıklıkta örneklenmiş olur. Kullanıcı ekrana baktığında, toplu olarak işlenmekte olan veriler hemen uygulamanıza iletilir.
Toplu işleme 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ına olanak tanır.
Toplu işleme 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 }
Aşağıdaki kod snippet'inde gösterildiği gibi
ExerciseConfig
nesnesinin belirli birBatchingMode
kullanması gerektiğini 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 dinamik olarak
BatchingMode
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 başlatıldıktan sonra 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())
Daha sonra bu değer, her veri noktası için getStartInstant()
veya getEndInstant()
ile kullanılabilir.
Veri doğruluğu
Bazı veri türleri, her veri noktasıyla ilişkilendirilmiş doğruluk bilgilerine sahip olabilir.
Bu değer, accuracy
özelliğinde gösterilir.
HEART_RATE_BPM
ve LOCATION
veri türleri için sırasıyla HrAccuracy
ve LocationAccuracy
sınıfları doldurulabilir. Mevcut olduğunda, 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ı hale getirmek için Oda'yı kullanın. Veri yükleme, alıştırmanın sonunda İş Yöneticisi gibi bir mekanizma kullanılarak gerçekleşir. Bu, ağdan veri yüklemeye yönelik çağrıların egzersiz sona erene kadar ertelenmesini sağlayarak egzersiz sırasında güç tüketimini en aza indirir ve işi basitleştirir.
Entegrasyon kontrol listesi
Sağlık Hizmetleri'nin ExerciseClient
kullanan uygulamanızı yayınlamadan önce, kullanıcı deneyiminizin bazı yaygın sorunlardan kaçındığından emin olmak için aşağıdaki kontrol listesine bakın.
Şunları doğrulayın:
- Uygulamanız her çalıştırıldığında egzersiz türünün özelliklerini kontrol eder ve cihazın özelliklerini kontrol eder. Bu şekilde, belirli bir cihaz veya egzersizin, uygulamanızın ihtiyaç duyduğu veri türlerinden birini desteklemediğini tespit edebilirsiniz.
- Gerekli izinleri ister, sağlar ve bunları manifest dosyanızda belirtirsiniz. Uygulamanız,
prepareExerciseAsync()
çağrılmadan önce çalışma zamanı izinlerinin verildiğini onaylar. - Uygulamanız aşağıdaki durumları ele almak için
getCurrentExerciseInfoAsync()
hizmetini kullanır:- Bir egzersiz zaten takip ediliyor ve uygulamanız önceki egzersizi geçersiz kılıyor.
- Başka bir uygulama egzersizinizi sonlandırdı. Bu durum, kullanıcı uygulamayı tekrar açtığında, başka bir uygulama devraldığı için egzersizin durduğunu açıklayan bir mesajla karşılaşır.
LOCATION
verilerini kullanıyorsanız:- Uygulamanız egzersiz süresince (hazırlık görüşmesi dahil) karşılık gelen
foregroundServiceType
ile birForegroundService
sağlar. isProviderEnabled(LocationManager.GPS_PROVIDER)
ile cihazda GPS'in etkin olduğundan 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 etme ve verilerini ilk konum düzeltmesi olarak kullanmayı düşünün. Sağlık Hizmetleri'nden daha kararlı konum bilgileri sunulduğunda FLP yerine bu bilgileri kullanın.
- Uygulamanız egzersiz süresince (hazırlık görüşmesi dahil) karşılık gelen
- Uygulamanız veri yüklemeyi gerektiriyorsa veri yüklemek için yapılan tüm ağ çağrıları egzersiz 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österilir
- Pasif veri güncellemeleri
- Wear OS'te Sağlık Hizmetleri
- Kartları kullanmaya başlama