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 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-alpha02"
}

Kotlin

dependencies {
    implementation("androidx.health:health-services-client:1.1.0-alpha02")
}

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ö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:

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

  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. Aşağıdaki kod snippet'inde gösterildiği gibi ExerciseConfig nesnesinin belirli bir BatchingMode 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)
    )
    
  3. İ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)
    
  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 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 bir ForegroundService 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 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.