通用应用程序崩溃的异步 Pedometer.GetSystemHistoryAsync API

async Pedometer.GetSystemHistoryAsync API for Universal apps crashes

我正在尝试构建一个简单的应用程序,该应用程序使用 Windows 10 phone 上的计步器数据。我通常生活在内核领域,这是我第一次使用大部分 c# 异步的东西,所以我想知道我是否在这里遗漏了一个核心概念。

我第一次尝试获取数据是简单地将过去一小时内记录的步数报告到我的 XAML 应用程序中的文本框。我刚刚创建了一个基本的 XAML 应用程序,放入了一个文本框,并添加了这个事件处理程序:

private async void Page_Loaded(object sender, RoutedEventArgs e)
{
    var history = await Pedometer.GetSystemHistoryAsync(DateTimeOffset.Now.AddHours(-1), TimeSpan.FromHours(1));
    int count = history.Sum(entry => entry.CumulativeSteps);
    textSteps.Text = count.ToString();
}

第一行的断点触发,但在到达下一行之前我得到一个未处理的异常。错误代码 -2147467259,消息 "Error HRESULT E_FAIL has been returned from a call to a COM component."

堆栈的顶部框架在我的代码中,但它只是 App.g.i.cs 中的样板代码行,它触发了未处理异常的中断。下面是 mscorlib 和 WinRT 调用程序。

我查看了清单中的应用程序功能列表,没有发现任何看起来适用于计步器的功能。我正在 Lumia 950 上对此进行测试。

更新:我刚刚尝试调用 API 来获取默认的计步器传感器:

Pedometer p = await Pedometer.GetDefaultAsync();

事实证明,这会触发具有相同无价值堆栈的拒绝访问异常。我目前正在做更多研究,看看是否有需要在清单中指定的内容。

在进一步试验后出现访问被拒绝错误后,我进一步查看了清单。计步器的清单 Microsoft 示例项目声明了一个设备 属性,我找不到通过设计器视图添加的方法。将它添加到代码中效果很好。它说我在过去一小时内走了 300,000 步,但我相信一些简单的调试会在那里找到答案。 (属性 称为 CumulativeSteps,这是一个很好的提示...)

<Capabilities>
    <DeviceCapability Name="activity" />
</Capabilities>
var currentReadings = await Pedometer.GetSystemHistoryAsync(DateTime.Today);
                var walklist = new List<PedometerReading>();
                var runlist = new List<PedometerReading>();
                foreach (var cuurentreading in currentReadings)
                {
                    if (cuurentreading.StepKind == PedometerStepKind.Walking)
                    {
                        walklist.Add(cuurentreading);
                    }
                    if (cuurentreading.StepKind == PedometerStepKind.Running)
                    {
                        runlist.Add(cuurentreading);
                    }
                }
                var item = walklist.Last();
                var item1 = walklist.First();
                var item2 = runlist.Last();
                var item3 = runlist.First();
                Steps1.Value += (item.CumulativeSteps - item1.CumulativeSteps);
                Steps1.Value += (item2.CumulativeSteps - item3.CumulativeSteps);