ExerciseClient ile egzersiz kaydetme

Sağlık Hizmetleri, antrenman uygulamaları için birinci sınıf destek ExerciseClient. Uygulamanız, ExerciseClient ile egzersiz devam ediyorsa, egzersiz hedefleri ekleyin ve egzersizle ilgili güncellemeleri alın durum, egzersiz etkinlikleri, veya istenen diğer metriklerdir. Daha fazla bilgi için egzersiz türleri destekler.

Bkz. Egzersiz örneği bulabilirsiniz.

Bağımlılıkları ekleme

Sağlık Hizmetleri'ne bağımlılık eklemek için Google Maven deposunu eklemeniz gerekir projenize ekleyin. Daha fazla bilgi için bkz. Google'ın Maven deposu.

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ı

Aşağıdaki uygulama yapısını kullanarak bir egzersiz uygulaması geliştirirken Sağlık Hizmetleri:

Antrenmana hazırlanırken ve antrenman sırasında aktiviteleriniz çeşitli nedenlerle durdurulabilir. Kullanıcı başka bir uygulamaya geçebilir veya saat yüzüne dönün. Sistem, kontrol panelinizin üstünde bir şey görüntüleyebilir. yoksa bir süre işlem yapılmadığında ekran kapanabilir. Sürekli çalışan bir ForegroundService kullanın ile birlikte ExerciseClient ile birlikte çalışarak, sistemlerin tamamında doğru çalışmasını

ForegroundService kullanmak, aşağıdaki etkinlikleri göstermek için Oncontinue Activity API'yi kullanmanıza olanak tanır Kol saatinizdeki yüzeylerde bir gösterge bulunur. Bu şekilde, kullanıcının hızlıca

Ön planda konum verilerini uygun şekilde istemeniz önemlidir geliştirmenizi sağlar. Manifest dosyanızda gerekli ön plan hizmetini belirtin. türler ve izinler:

<manifest ...>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <application ...>
    
      <!-- If your app is designed only for devices that run Wear OS 4
           or lower, use android:foregroundServiceType="location" instead. -->
      <service
          android:name=".MyExerciseSessionRecorder"
          android:foregroundServiceType="health|location">
      </service>
      
    </application>
</manifest>
.

Tekliflerinizi otomatikleştirmek ve optimize etmek için AmbientLifecycleObserver prepareExercise() görüşmesini içeren antrenman öncesi aktiviteniz için tercih etmelisiniz. Bununla birlikte, antrenman sırasında ekranı güncellemeyin ambiyans modunda: Bunun nedeni Sağlık Hizmetleri'nin, antrenman verilerini ambiyans modundayken bilginin güç tasarrufu yapmasını sağlayarak görüntülenen yeni olmayabilir. Antrenmanlar sırasında, güncel bilgileri veya boş ekran görüntüler.

Özellikleri kontrol edin

Her ExerciseType, metrikler ve egzersiz hedefleridir. Bağlı olarak değişebilecekleri için başlangıçta bu özellikleri kontrol edin cihaz üzerinde. Cihaz belirli bir egzersiz türünü desteklemiyor veya desteklemiyor olabilir otomatik duraklatma gibi belirli bir işlevi desteklemelidir. Buna ek olarak, cihazın özellikleri zamanla değişebilir. Örneğin bir yazılım güncellemesinden sonra.

Uygulama başlatılırken cihaz özelliklerini sorgulayın ve takip etmek için:

  • Platformun desteklediği alıştırmalar.
  • Her alıştırmada desteklenen özellikler.
  • Her alıştırma için desteklenen veri türleri.
  • Bu veri türlerinin her biri için gerekli izinler.

ExerciseCapabilities.getExerciseTypeCapabilities() uygulamasını şununla kullanın: ne tür metrikler isteyebileceğinizi, ne tür metrikler isteyebileceğinizi yapılandırabileceğiniz egzersiz hedefleri ve başka hangi özelliklerin kullanılabilir işleyeceğiz. Bu, aşağıdaki örnekte gösterilmektedir:

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 istenebileceğiniz veri türlerini listeler. Bu, cihaza göre değişir. desteklenmeyen bir DataType istememeye özen gösterin. Aksi takdirde başarısız olur.

Şunu kullanın: supportedGoals ve supportedMilestones bir egzersiz hedefini destekleyip desteklemediğini, ne kadarının açıklayacağım.

Uygulamanız, kullanıcının otomatik duraklatma özelliğini kullanmasına izin veriyorsa Bu işlevin cihaz tarafından desteklendiğinden emin olmak için supportsAutoPauseAndResume. ExerciseClient, olanak tanır.

Aşağıdaki örnekte, HEART_RATE_BPM veri türünün desteği kontrol edilir. STEPS_TOTAL hedef özelliği ve otomatik duraklatma işlevi:

// 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 kaydol

Egzersiz güncellemeleri bir dinleyiciye iletilir. Uygulamanız yalnızca bir dinleyicileri bekleyebilirsiniz. Antrenmana başlamadan önce dinleyicinizi ayarlayın aşağıda gösterildiği gibidir. 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)

Egzersiz ömrünü yönetin

Sağlık Hizmetleri, şu cihazdaki tüm uygulamalarda aynı anda en fazla bir egzersizi destekler: için geçerlidir. Bir egzersiz takip ediliyorsa ve farklı bir uygulama takip etmeye başlarsa varsa ilk alıştırma sona erer.

Egzersizinize başlamadan önce aşağıdakileri yapın:

  • Bir egzersizin zaten izlenip izlenmediğini, tepkiler verin. Örneğin, kullanıcıdan onay isteyin ve yeni bir alıştırmayı izlemeden önce kullanmanız gerekir.

Aşağıdaki örnekte mevcut bir alıştırma olup olmadığını kontrol etmek için getCurrentExerciseInfoAsync:

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, şu bilgileri istediğinden ve koruduğundan emin olun: gerekli izinleri. Uygulamanız LOCATION verileri kullanıyorsa uygulamanızın şu bilgileri istediğinden ve koruduğundan emin olun: gerekli izinleri de ekleyebilirsiniz.

Tüm veri türlerinde prepareExercise() veya startExercise() çağrılmadan önce şunları 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 bkz. Uygulama izinleri isteyin. Sağlık Hizmetleri gerekli izinler henüz sağlanmamışsa isteği reddeder verildi.

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 ya da kullanıcı antrenmanlarına başlamadan önce verilerini görmek isteyebilir. İsteğe bağlı prepareExerciseAsync() yöntemi, bu sensörlerin ısınmasını ve başlatılmadan veri alınmasını sağlar zamanlayıcıyı ayarladım. activeDuration bu durumdan etkilenmez hazırlık süresi.

prepareExerciseAsync() numaralı telefonu aramadan önce aşağıdakileri kontrol edin:

  • Platform genelindeki konum ayarını kontrol edin. Kullanıcı bu ayarı şurada kontrol eder: ana Ayarlar menüsü; uygulama düzeyindeki izinlerden farklıdır onay kutusunu işaretleyin.

    Bu ayar kapalıysa kullanıcıya erişimi reddettiği konusunda bilgi verin konum eklemeniz ve uygulamanız konum gerektiriyorsa bunu etkinleştirmelerini istemeniz gerekir.

  • Uygulamanızın vücut sensörleri ve aktivite için çalışma zamanında istenen izinlere sahip olduğunu onaylayın. ve hassas konum. Eksik izinler için kullanıcıdan şunları yapmasını isteyin: çalışma zamanında istenen izinleri vermede geçerlidir. Kullanıcı bir söz konusu izinle ilişkili veri türlerini kaldırın. prepareExerciseAsync() adlı kişiye yapılan arama. Vücut sensörü de konum izni de sağlanıyorsa prepareExerciseAsync() işlevini çağırmayın. Çünkü bu çağrı özel olarak egzersize başlamadan önce nabzın stabil bir şekilde veya GPS sinyalinin alınması. Uygulama adım tabanlı mesafe, tempo, hız ve diğer metrikleri almaya devam edebilir. bu izinleri gerektirir.

prepareExerciseAsync() çağrınızın başarılı olabilmesi için aşağıdakileri yapın:

  • AmbientLifecycleObserver kullanın ile başlar.
  • Ön plan hizmetinizden prepareExerciseAsync() çağırın. Bu dil ve etkinlik yaşam döngüsüne bağlıysa sensör hazırlığı gereksiz yere öldürülür.
  • Kullanıcı aşağıdaki durumlarda sensörleri kapatmak ve güç kullanımını azaltmak için endExercise() numaralı telefonu arayın ve egzersiz öncesi aktiviteden ayrılır.

Aşağıdaki örnekte prepareExerciseAsync() yönteminin 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 - onAvailabilityChanged() arasında teslim edilir. Bu bilgiler daha sonra kullanıcıya sunulup sunulmayacağına karar vermesi için başlayabilir.

Antrenmanı başlat

Bir alıştırma başlatmak istediğinizde, ExerciseConfig oluşturun. egzersiz türünü, metriklerini almak istediğiniz veri türlerini ve egzersiz hedefleri ya da ara hedeflerdir.

Egzersiz hedefleri bir DataType ve bir koşul. Egzersiz hedefleri, bir egzersiz egzersizi yapıldığında tetiklenen tek seferlik bir hedeftir. karşılandığında (ör. kullanıcı belirli bir mesafe koştuğunda) Bir egzersiz bir ara hedef de ayarlanabilir. Egzersiz ara hedefleri birden fazla kez tetiklenebilir. örneğin kullanıcı her belirlenen mesafenin üzerinde belirli bir nokta koşuyor.

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 metriklerle ExerciseLapSummary.

Yukarıdaki örnekte, doğru olması gereken isGpsEnabled kullanımı gösterilmektedir konum verileri istenir. Ancak, GPS kullanılması diğer ölçümler için de yardımcı olabilir. ExerciseConfig, mesafeyi bir DataType olarak belirtiyorsa bu varsayılan değer adımları nasıl uygulayabileceğinizi öğreneceksiniz. İsteğe bağlı olarak GPS'i, konum bilgisini etkinleştirerek uzaklığı tahmin etmek için kullanılabilir.

Antrenmanı duraklatma, devam ettirme ve sonlandırma

Aşağıdaki gibi uygun yöntemleri kullanarak antrenmanları duraklatabilir, devam ettirebilir ve sonlandırabilirsiniz. pauseExerciseAsync() veya endExerciseAsync().

Bilgi kaynağı olarak ExerciseUpdate durumunu kullanın. Antrenman şu değil: pauseExerciseAsync() öğesine yapılan arama döndüğünde duraklatılmış olarak kabul edilir, ancak bunun yerine ExerciseUpdate mesajına yansıtıldığında bu işlemi yapabilirsiniz. Bu, özellikle özellikle dikkat edilmesi gerekir. Kullanıcı duraklatma tuşuna basarsa duraklat düğmesini devre dışı bırakın ve şurada pauseExerciseAsync() öğesini çağırın: Sağlık Hizmetleri. Sağlık Hizmetleri'nin duraklatılanlara ulaşmasını bekleyin ExerciseUpdate.exerciseStateInfo.state kullanın ve ardından düğmeyi değiştirin tuşuna basın. Bunun nedeni, Sağlık Hizmetleri durum güncellemelerinin düğmeye basmadan daha hızlı teslim edilir. Dolayısıyla, tüm kullanıcı arayüzü değişikliklerini basıldığında, 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 duraklatılmadan duraklatılabilir veya başlatılabilir. kullanıcı etkileşimi.
  • Başka bir uygulamanın antrenman başlatması: Antrenmanınız, antrenman yapmadan sonlandırılabilir kullanıcı etkileşimi.

Uygulamanızın antrenmanı başka bir uygulama tarafından sonlandırılırsa uygulamanız sorunsuz bir şekilde aşağıdaki işlemleri yapabilirsiniz:

  • Kullanıcının ilerlemesinin silinmemesi için kısmi antrenman durumunu kaydedin.
  • Devam Eden Etkinlik simgesini kaldırın ve kullanıcıya bir bildirim , antrenmanını başka bir uygulama tarafından sonlandırıldığını bilir.

Ayrıca, izinlerin sürekli egzersiz yapmaktır. Bu, isEnded durumu kullanılarak gönderilir ve ExerciseEndReason / AUTO_END_PERMISSION_LOST. Bu destek kaydını aşağıdaki şekilde ele alın: sonlandırma durumu: kısmi durumu kaydedin, Devam Eden Etkinliği kaldırın simgesine dokunun ve kullanıcıya ne olduğuyla ilgili bir bildirim gönderin.

Aşağıdaki örnekte, fesih işleminin doğru ş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

Bir uygulama, egzersiz sırasında aktivitenin aktif süresini gösterebilir. gerekir. Uygulama, Sağlık Hizmetleri ve cihaz Mikro Denetleyici Birimi (MCU): Düşük güçlü Egzersiz takibinden sorumlu işleyici. Tüm bunlar, aynı geçerli etkin süreye sahip olmalıdır. Sağlık Hizmetleri, bunu yönetmeye yardımcı olmak için Uygulamanın çalışabileceği bir sabitleme noktası sağlayan ActiveDurationCheckpoint zamanlayıcıyı başlatabilir.

Çünkü etkin süre MCU'dan gönderilir ve uygulamaya varış süresi, ActiveDurationCheckpoint iki mülk içeriyor:

  • activeDuration: Egzersizin ne kadar süredir aktif olduğu
  • time: etkin süre hesaplandığında

Bu nedenle, uygulamada bir egzersizin aktif süresi şu denklem kullanılarak ActiveDurationCheckpoint değerinden hesaplanmıştır:

(now() - checkpoint.time) + checkpoint.activeDuration

Bu, hesaplanan etkin süre arasındaki küçük deltayı hesaba katar ve uygulamaya ulaşması gerekir. Bu özellik, bir kronometreyi ve uygulamanın zamanlayıcısının zamana mükemmel bir şekilde uymasını sağlar RACI matrisinde.

Egzersiz duraklatılırsa uygulama, kullanıcı arayüzünde zamanlayıcıyı yeniden başlatmak için bekler hesaplanan süre, kullanıcı arayüzünde şu anda görüntülenen süreyi geçene kadar. Bunun nedeni, duraklatma sinyalinin sağlık hizmetlerine ve MCU'ya hafif bir gecikme olabilir. Örneğin, uygulama t=10. saniyede duraklatıldıysa Sağlık Hizmetler, 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 şurada yayınlanır: ExerciseUpdate mesaj.

İşleyen, iletileri yalnızca uyanık olduğunda veya maksimum raporlama düzeyi olduğunda teslim eder her 150 saniyede bir ulaşılır. Şuna güvenmeyin: kronometrede ilerlemek için ExerciseUpdate frekansı activeDuration. Bkz. Egzersiz örneği , bağımsız bir kronometrenin nasıl uygulanacağına dair örnek için GitHub'ı ziyaret edin.

Bir kullanıcı antrenman başlattığında ExerciseUpdate mesaj gönderilebilir örneğin her saniye. Kullanıcı antrenmana başlarken ekranda özelliği devre dışı bırakabilirsiniz. Ardından Sağlık Hizmetleri, verileri daha seyrek yayınlayabilir ancak aynı oranda örneklemeye devam edebilir. ana işlemciyi uyandırmaması için aynı frekansı kullanın. Kullanıcı veya toplu olarak işlenme sürecindeki tüm veriler hemen en iyi sonucu verir.

Toplu işleme hızını kontrol etme

Bazı durumlarda, uygulamanızın Ekran kapalıyken belirli veri türlerini alır. CEVAP BatchingMode nesne, uygulamanızın verileri almak için varsayılan toplu işleme davranışını geçersiz kılmasına olanak tanır daha sık teslimat yapıyor.

Toplu işlem 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 gibi, aşağıdaki kod snippet'inde gösterildiği gibidir.

    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, antrenman sırasında BatchingMode öğesini dinamik olarak yapılandırabilirsiniz. belirli bir toplu işleme davranışının süre boyunca devam etmesi yerine, bir sonraki sefere:

    val desiredModes = setOf(BatchingMode.HEART_RATE_5_SECONDS)
    exerciseClient.overrideBatchingModesForActiveExercise(desiredModes)
    
  4. Özelleştirilmiş BatchingMode davranışını temizlemek ve varsayılan davranışa geri dönmek için boş bir kümeyi exerciseClient.overrideBatchingModesForActiveExercise().

Zaman damgaları

Her veri noktasının belirli bir zaman dilimi, cihazdan bu yana geçen süreyi başlatıldı. 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 getStartInstant() ile kullanılabilir. veya getEndInstant() tıklayın.

Veri doğruluğu

Bazı veri türleri, her bir veri noktasıyla ilişkili doğruluk bilgilerine sahip olabilir. Bu, accuracy özelliğinde temsil edilir.

HrAccuracy ve LocationAccuracy sınıfları için doldurulabilir Sırasıyla HEART_RATE_BPM ve LOCATION veri türleri. Mevcut olduğunda Her bir veri noktasının yeterli olup olmadığını belirlemek için accuracy özelliğini emin olmanız gerekir.

Verileri depolayın ve yükleyin

Sağlık uygulamasından gönderilen verileri kalıcı hale getirmek için Oda'yı kullanın Hizmetler. Veri yükleme, alıştırmanın sonunda bir mekanizma kullanılarak yapılır örneğin İş Yöneticisi. Bu sayede veri yükleme için yapılan ağ çağrılarının alıştırma bitene kadar ertelendiğini, Egzersiz sırasında güç tüketimini en aza indirir ve işi basitleştirir.

Entegrasyon kontrol listesi

Sağlık Hizmetleri'ni kullanan uygulamanızı yayınlamadan önce ExerciseClient, danışın aşağıdaki kontrol listesine göz atın. Şunları doğrulayın:

  • Uygulamanız özellikleri kontrol ediyor ve cihaz her çalıştığında cihazın özellikleri hakkında bilgi edindiniz. Bu şekilde, belirli bir cihazın veya egzersizin desteklemediğini tespit edebilirsiniz en iyi uygulamalar bunlar.
  • Gerekli izinleri ister, sağlar ve bunları manifest dosyanız. prepareExerciseAsync() numaralı telefonu aramadan önce uygulamanız çalışma zamanında istenen izinlerin verildiğini onaylar.
  • Uygulamanız şu durumların ele alınması için getCurrentExerciseInfoAsync() kullanıyor:
    • Bir egzersiz zaten izleniyor ve uygulamanız önceki egzersizi geçersiz kılıyor bir egzersizdir.
    • Başka bir uygulama, egzersizinizi sonlandırdı. Bunun nedeni, kullanıcının yeniden açtığı zaman bu egzersizin başka bir uygulama devraldığı için durduruldu.
  • LOCATION verilerini kullanıyorsanız:
    • Uygulamanızda, ilişkili olduğu ForegroundService Egzersiz boyunca foregroundServiceType ( biri).
    • Cihazda GPS'in etkinleştirildiğinden emin olmak için isProviderEnabled(LocationManager.GPS_PROVIDER) ve kullanıcıdan şunları yapmasını ister: Konum ayarlarını açabilirsiniz.
    • Düşük performansla konum verilerinin alındığı zorlu kullanım alanları için büyük önem taşıdığını görmek için, bağlı Fused Konum Sağlayıcı (FLP) oluşturmak ve verilerini ilk konum düzeltmesi olarak kullanmak. Daha kararlı olduğunda Sağlık Hizmetleri'ndeki konum bilgisi, bunun yerine onu kullan yardımcı olur.
  • Uygulamanız veri yüklemesi gerektiriyorsa veri yüklemek için yapılan tüm ağ çağrıları egzersiz sona erene kadar ertelenir. Aksi takdirde, alıştırma boyunca uygulamasının gerekli ağ çağrılarını aşırıya kaçmaması gerekir.