- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这与其说是编程语法问题,不如说是数据结构问题。 Health 应用程序的数据结构有点像黑盒子。
我想查询 HKHealthStore 并创建包括 ActiveEnergyBurned 在内的项目的每日摘要,以及包括 totalEnergyBurned 在内的锻炼摘要。
我有成功检索此信息的代码(如下)。然而,每天的总数通常比当天的锻炼少!我确信我的代码没有问题,因为 Apple Health 应用程序中显示的数字完全相同。例如:
昨天的训练:我的应用workout.totalEnergyBurned = 905 大卡昨天 ActiveEnergyBurned 的总和 655 kcal健康应用显示两者的数字完全相同。
如果 ActiveEnergyBurned 不包括锻炼,它包括什么?我没有另外 655 的 ActiveEnergyBurned。在我看来,ActiveEnergyBurned 不可能不包括锻炼!
//to get sum of day's activeCaloriesBurned:
func getActiveCalories(startDate:NSDate, endDate:NSDate){
let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)
let hkUnit = HKUnit.kilocalorieUnit()
getSumStatsFor(sampleType, hkUnit: hkUnit, startDate: startDate, endDate: endDate) { (hdObject, result) -> Void in
hdObject.activeCalories = result
}
}
func getTotalsForDataType(quantitiyType:HKQuantityType, startDate:NSDate, endDate:NSDate, completion:(HKStatisticsCollection!, NSError!) -> Void){
println("getTotalsForDataType start: \(startDate) end: \(endDate)")
let dayStart = NSCalendar.currentCalendar().startOfDayForDate(startDate)
let addDay = NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitDay, value: 1, toDate: endDate, options:nil)
let dayEnd = NSCalendar.currentCalendar().startOfDayForDate(addDay!) //add one day
let interval = NSDateComponents()
interval.day = 1
let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: HKQueryOptions.None)
let newQuery = HKStatisticsCollectionQuery(quantityType: quantitiyType,
quantitySamplePredicate: predicate,
options: HKStatisticsOptions.CumulativeSum,
anchorDate: dayStart,
intervalComponents: interval)
newQuery.initialResultsHandler = {
query, results, error in
if error != nil {
println("*** An error occurred while calculating the statistics: \(error.localizedDescription) ***")
completion(nil, error)
}else{
completion(results,error)
}
}
self.healthKitStore.executeQuery(newQuery)
}
//to get workout totalCalories burned
func readWorkouts(completion: (([AnyObject]!, NSError!) ->Void)!){
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
let sampleQuery = HKSampleQuery(sampleType: HKWorkoutType.workoutType(), predicate: nil, limit: 0, sortDescriptors: [sortDescriptor]) { (sampleQuery, results, error) -> Void in
if let queryError = error {
println( "There was an error while reading the samples: \(queryError.localizedDescription)")
}
completion(results,error)
}
healthKitStore.executeQuery(sampleQuery)
}
最佳答案
这是由于 HealthKit 锻炼 API 的设计方式存在错误。使用当前 API,第 3 方应用程序可以创建 HKWorkout
,其中 totalEnergyBurned
大于 0,但没有 的关联
类型被创建以总结为 HKSamples
>HKQuantityTypeIdentifierActiveEnergyBurnedtotalEnergyBurned
。例如,将锻炼数据输入 HealthKit 的第 3 方应用程序可以这样做:
HKHealthStore *healthStore = [HKHealthStore new];
HKWorkout *workout = [HKWorkout workoutWithActivityType:HKWorkoutActivityTypePlay
startDate:[NSDate date]
endDate:[NSDate date]
duration:100.0
totalEnergyBurned:[HKQuantity quantityWithUnit:[HKUnit kilocalorieUnit] doubleValue:445]
totalDistance:[HKQuantity quantityWithUnit:[HKUnit meterUnit] doubleValue:1000]
metadata:nil];
[healthStore saveObject:workout withCompletion:nil];
请注意,在任何地方都没有创建类型为 HKQuantityTypeIdentifierActiveEnergyBurned
的任何 HKSamples
。然后,当您总结当天消耗的 active 能量并将其与锻炼消耗的总能量进行比较时,您将得到 0 kcal 与 445 kcal。一个好的第 3 方应用程序在创建锻炼后会做的是:
NSArray *workoutSamples = @[[HKQuantitySample quantitySampleWithType:HKQuantityTypeIdentifierActiveEnergyBurned
quantity:[HKQuantity quantityWithUnit:[HKUnit kilocalorieUnit] doubleValue:workout.totalEnergyBurned]
startDate:workout.startDate
endDate:workout.endDate]];
[healthStore addSamples:workoutSamples toWorkout:workout completion:nil];
这样至少只有 active 能量燃烧样本。现在您将获得 445 kcal 与 445 kcal。
在我对第 3 方应用程序的测试中,我发现大多数应用程序确实添加了燃烧的 active 能量样本,但有些应用程序(如 Nike Running)没有添加。
解决这个问题的一个棘手的解决方法是提取锻炼的所有活跃能量样本(您必须使用 startDate
和 endDate
因为 predicateForObjectsFromWorkout
有与上述类似的问题),然后如果没有任何样本,则假设源没有为该锻炼创建 active 能量样本并将锻炼的 totalEnergyBurned
添加到 active 一天的能量消耗总量。
关于ios - hkworkout totalenergyburned 与 HKQuantityTypeIdentifierActiveEnergyBurned 不相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31391065/
我用 AppleWatch 跟踪的一些锻炼确实包含有关海拔增益的信息。有些人还向我展示了锻炼的最大和最小高度。 我还有一个跟踪锻炼的应用程序,想知道如何添加这些信息。我正在经历HKQuantityTy
我可以读出 HKworkout 并向其中添加自己的元数据,然后重新保存吗?如果是这样怎么办?或者我可以只在保存锻炼时传递元数据吗? 最佳答案 所有 HKObjects 都是不可变的(一旦保存就无法编辑
是否可以在现有 HKWorkout(具有元数据属性的 HKObject 子类)上添加元数据? 如果不知道如何将我的应用程序中的数据添加到 healthkitstore 中的现有锻炼记录中。 最佳答案
使用 Swift 4.0,我试图在内置的 HealhKit 类 HKWorkout 和我自己的自定义类之间进行向下转换。我的类(class)继承自 HKWorkout。 HKWorkout 继承自 H
我在查询 HKWorkout 时遇到问题。 下面是我用来保存 HKWorkout 和 HKQuantitySample 的代码。 func workout(#distance:Double, star
编辑以添加我基于 WWDC 2016 的“充分利用 Healthkit”演讲的更新代码,但除非我打开应用程序,否则我仍然无法获取新锻炼的打印声明? 在 Apple Watch 上保存新锻炼后,我正在尝
有没有办法向 UserDefaults 添加一个 HKWorkouts 数组,或者我是否必须将该数组保存在核心数据中? 最佳答案 HKObject 及其子类符合 NSSecureCoding,因此您可
这与其说是编程语法问题,不如说是数据结构问题。 Health 应用程序的数据结构有点像黑盒子。 我想查询 HKHealthStore 并创建包括 ActiveEnergyBurned 在内的项目的每日
我是一名优秀的程序员,十分优秀!