ExerciseClient ile egzersiz kaydetme

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:

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:

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 verilmediyse prepareExerciseAsync() ç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ğu
  • time: 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:

  1. 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
    }
    
  2. ExerciseConfig nesnesinin belirli bir BatchingMode öğ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)
    )
    
  3. İ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)
    
  4. Özelleştirilmiş BatchingMode öğesini temizleyip varsayılan davranışa dönmek için exerciseClient.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 bir ForegroundService 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 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.