微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

时间:2021-02-22 14:21:56

早在今年的BUILD大会上,诺基亚就宣布了SensorCore以及它的部分演示。今天,它终于面世了,大家可以去Building Apps for Windows 上查看具体介绍,或者也可以去Nokia Developer上查看。SensorCore SDK的下载大家可以去nuget页面:Lumia SensorCore SDK 0.9.1.3

1. SensorCore SDK是什么?

SensorCore SDK是一组API,它可以访问手机上的多种传感器数据(加速度传感器/数字罗盘/陀螺仪)和位置信息。这些信息可以用来追踪用户的身体和运动状态。一般情况下,传感器以较低的功耗在后台运行,并保存最近10天内的数据。目前市场的Health &Fitness应用已经集成了SensorCore SDK,主要使用了其中的计步功能。其界面如下图1所示。

微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

图1:Health &Fitness应用的计步功能页面

进一步的,它还提供了数据的统计和分析,如下图2所示。

微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

图2:Health &Fitness应用的统计分析页面

事实上,Health &Fitness应用只利用了SensorCore SDK中的Step Counter API,它还包括Activity Monitor API、Place Monitor API和Track Point Monitor API,我们在后面的文章中会有进一步的介绍。

2. 如何启用 SensorCore 功能

为了使用SensorCore提供的API,我们需要在手机的功能中做一些设置,具体来说,是将Location和motion data功能打开,如下图3所示。

微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

图3:启用SensorCore需要的设置页面

如果我们不希望透露这些用户信息,可以将这个功能关闭,也可以手动清除motion数据。另外,开发者必须处理“用户禁用Location和motion data”的情况,因为在这两者其中任何一个被禁用的情况下,SensorCore是无法正常工作的。

3. SensorCore API 简介

SensorCore SDK包含的API包括Step Counter API、Activity Monitor API、Place Monitor API和Track Point Monitor API。

3.1 Step Counter API

该API提供了用户步行或者是跑步的步数和距离信息。当然,如果用户将设备放在裤兜里面骑车或者乘坐汽车,那么,该API的计步功能就可能不准。

3.2 Activity Monitor API

该API提供用户身体活动的状态信息,例如,用户何时开始步行,何时停止步行。当然,在用户活动转换的过程中,该API大概会有5-10秒钟的检测延时,主要是为了滤除噪声,降低误报的可能性。如果用户将设备放在裤兜里面骑车或者乘坐汽车,或者只是将设备拿在手里晃悠,就会产生误报。活动可以分为以下几类:

  • Idle:设备被放置于桌子等离开人体的环境中。
  • Stationary:用户随身携带设备,但出于静止状态。
  • Moving:包含Walking或者是Running两种状态。

如果应用程序对用户的某些状态进行监控,那么在用户的状态发生变化时,应用程序会收到这个通知(notification)。

3.3 Place Monitor API

该API提供了用户停留超过一定时间段的地理位置信息,它运行在后台,为了使得功耗尽量低,主要利用手机基站和WiFi接入点信息来定位。因此,它不会主动激活GPS进行地理位置追踪,除非其他应用已经在使用GPS(如导航类应用)。由于该类API是被动工作的,因此它提供的地理位置信息并非是实时的。除了提供相关的地理位置信息以外,它还会尝试推断用户的家和工作单位的地理位置。

用户携带设备在某一个地点停留10分钟以上,该地点才会被认为是一个Known Places,同时加入到Known Places列表。一般来讲,单个Known Place的半径范围是200米。两个Known Place之间的距离一般要求500米以上,因此,即使500米范围内有两个不同的地理位置,该API会将这些位置融合为一个Known Place,这一点也是开发者需要考虑的。

Place Monitor会尝试着将一个地点分类为“Home”,另一个地点分类为“Work”,分类的规则为:

  • 设备在一个Known Place中停留的时间段
  • 设备移动的频率和用户的行为状态
  • 设备被使用的频率
  • 设备被充电的频率

基于以上的规则,分类处理程序一般会在2-3天内给出“Home”和“Work”的推断。如果用户换了工作单位,该API也会在一段时间以后修改“Home”和“Work”的推断。

Place Monitor会动态的更新Known Places列表,如果已知的一个Known Place不再被访问了,那么一段时间以后,该Known Place就会从列表中删除。

所有的Known Place会有如下属性:

  • ID:一个给定地点的唯一标识。
  • Kind:可以有以下三个值,frequent/home/work。
  • Position:地理位置信息。
  • Radius:以Position为中心的半径。

3.4 Track Point Monitor API

该API提供用户移动的具体信息,它和Place Monitor API类似,但并不是追踪Home和Work位置,而是追踪用户行动的路径。一般情况下,Track Point Monitor API也是被动追踪,即利用手机基站和WiFi的信息来定位。如果有其他应用在使用GPS,那么Track Point Monitor API就会利用GPS信息来进行定位。

Track Point最多5分钟更新一次,并且两个Track Point之间的距离要求大于500米。如果用户在500米范围内逗留的时间很长,那么该API会认为是同一个Track Point,不进行更新操作。Track Point的精度依赖于位置信息的精度,也就是说,在手机基站和WiFi接入点密集的地方,Track Point精度相对较高。而如果用户在一个偏僻的地方郊游,也没有开启GPS,那么Track Point可能更新的很慢,因为手机一直处于同一个基站的覆盖范围内。

Track Point Monitor API提供如下信息:

  • Heading:Route Point记录的用户行动方向,该参数只有在GPS开启的情况下才有。
  • LengthofStay:设备在一个地点停留的时长。
  • Position:Route Point的地理位置信息。
  • Radius:位置的半径范围,和位置的精度信息有关。
  • Timestamp:用户进入该位置的时间点。

4. SensorCore 开发环境要求

利用SensorCore进行应用开发,需要的开发环境为:Visual Studio 2013 Update 2 with Windows Phone SDK。SensorCore SDK 支持模拟器调试,但是支持的功能很有限。所以,如果实际开发应用的话,建议在解锁的开发设备上进行调试,比如最近发售的Lumia 630就可以。

5. SensorCore 实例Demo

下面就Windows Phone 8.1 项目为例,演示如何使用SensorCore SDK。

5.1 新建项目

首先,在Visual Studio中新建项目,选择

Installed > Templates > Visual C# > Store Apps > Windows Phone Apps > Blank App (Windows Phone) ,同时,将项目名称命名为HelloSensorCore。

5.2 在项目中添加SensorCore SDK

1. 选择Tools > NuGet Package Manager > Manage NuGet Packages for Solution

2. 搜索Lumia SensorCore SDK点击安装。

3. 如果要在模拟器中进行调试,还需要加入Lumia SensorCore SDK Testing Tools。操作步骤和Lumia SensorCore SDK一致。

4. 添加完以后,可以查看项目的References目录,发现里面有Lumia.Sense, Lumia.Sense.Testing 和 Microsoft Visual C++ 2013 Runtime Package。如下图4所示。

微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

图4:项目添加引用页面

5.3 在Package.appxmanifest文件中添加相关内容

为了使得应用程序能够访问SensorCore的API,我们需要在Package.appxmanifest文件中添加相关capabilities。如果是通过添加引用的方式,那么开发环境会自动加入以下声明:

<DeviceCapability Name="location" />
<m2:DeviceCapability Name="humaninterfacedevice">
<m2:Device Id="vidpid:0421 0716">
<m2:Function Type="usage:ffaa 0001" />
<m2:Function Type="usage:ffee 0001" />
<m2:Function Type="usage:ffee 0002" />
<m2:Function Type="usage:ffee 0003" />
<m2:Function Type="usage:ffee 0004" />
</m2:Device>
</m2:DeviceCapability>

另外,为了使得程序能够正确的运行,我们需要对Configuration Manager中的目标平台进行配置。如果我们在实际设备中进行测试,那么必须选择ARM;如果在模拟器中进行测试,那么必须选择x86。如下图5所示。

微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

图5:调试平台配置页面

5.4 在代码中使用SensorCore API

我们这里新建一个非常简单的应用程序,主页面的Grid元素中包含一个ListBox,用于显示SensorCore返回的数据。在MainPage.xaml文件中添加以下代码:

<Grid>
<ListBox x:Name="SensorcoreList"/>
</Grid>

在后台代码文件MainPage.xaml.cs中,先要加入命名空间的引用:

using Windows.UI.Popups;
using Lumia.Sense;
using Lumia.Sense.Testing;
using System.Threading.Tasks;

在MainPage类中添加以下私有变量:

private PlaceMonitor _placeMonitor;
private RouteTracker _routeTracker;
private ActivityMonitor _activityMonitor;
private StepCounter _stepCounter;

下面,在MainPage的构造函数中添加Loaded事件处理代码:

this.Loaded += async (oo, ee) =>
{
await ShowStepCounter();
await ShowActivityMonitor();
await ShowRouteTracker();
await ShowPlacesMonitor();
};

然后,根据应用的visibility来处理SensorCore的activation和deactivation:

Window.Current.VisibilityChanged += async (oo, ee) =>
{
if (!ee.Visible)
{
if (_placeMonitor != null) await CallSenseApiAsync(async () => await _placeMonitor.DeactivateAsync());
if (_routeTracker != null) await CallSenseApiAsync(async () => await _routeTracker.DeactivateAsync());
if (_activityMonitor != null) await CallSenseApiAsync(async () => await _activityMonitor.DeactivateAsync());
if (_stepCounter != null) await CallSenseApiAsync(async () => await _stepCounter.DeactivateAsync());
}
else
{
if (_placeMonitor != null) await CallSenseApiAsync(async () => await _placeMonitor.ActivateAsync());
if (_routeTracker != null) await CallSenseApiAsync(async () => await _routeTracker.ActivateAsync());
if (_activityMonitor != null) await CallSenseApiAsync(async () => await _activityMonitor.ActivateAsync());
if (_stepCounter != null) await CallSenseApiAsync(async () => await _stepCounter.ActivateAsync());
}
};

定义两个方法来检查设备是否支持SensorCore SDK,并且检查Location和motion data是否已经打开。通常来讲,用户默认会关闭这两个选项,所以我们需要为用户提供快速设置的方法,而非去设置里面找这两个选项。

private async Task<bool> CallSenseApiAsync(Func<Task> action)
{
Exception failure = null;
try
{
await action();
}
catch (Exception e)
{
failure = e;
}
if (failure != null)
{
switch (SenseHelper.GetSenseError(failure.HResult))
{
case SenseError.LocationDisabled:
await CreateMessageDialog("Location has been disabled. Do you want to open Location settings now?", "Information", "Yes", async cmd => await SenseHelper.LaunchLocationSettingsAsync(), true);
return false;
case SenseError.SenseDisabled:
await CreateMessageDialog("Motion data has been disabled. Do you want to open Motion data settings now?", "Information", "Yes", async cmd => await SenseHelper.LaunchSenseSettingsAsync(), true);
return false;
default:
await CreateMessageDialog(SenseHelper.GetSenseError(failure.HResult).ToString(), "Failure", "OK", null, false);
return false;
}
}
return true;
}
private static async Task CreateMessageDialog(string message, string title, string label, UICommandInvokedHandler command, bool no)
{
var dialog = new MessageDialog(message, title);
dialog.Commands.Add(new UICommand(label,command));
if (no) dialog.Commands.Add(new UICommand("No"));
await dialog.ShowAsync();
}

然后我们就可以开始使用StepCounter了。CallSenseApiAsync封装了安全访问SensorCore SDK的方法。在这个方法里面,我们先实例化一个StepCounter对象,并且调用StepCounter.IsSupportedAsync()来确认当前设备是否支持StepCounter。然后就可以获取当前StepCounter相关的数据,并且显示在主页面的Listbox中。

private async Task ShowStepCounter()
{
await CallSenseApiAsync(async () =>
{
if (_stepCounter == null)
{
_stepCounter = await StepCounter.GetDefaultAsync();
}
if (await StepCounter.IsSupportedAsync())
{
var reading = await _stepCounter.GetCurrentReadingAsync();
SensorcoreList.Items.Add("Current step counter reading");
if (reading != null)
{
SensorcoreList.Items.Add(reading.Timestamp.ToString());
SensorcoreList.Items.Add("Walk steps = " + reading.WalkingStepCount);
SensorcoreList.Items.Add("Walk time = " + reading.WalkTime.ToString());
SensorcoreList.Items.Add("Run steps = " + reading.RunningStepCount);
SensorcoreList.Items.Add("Run time = " + reading.RunTime.ToString());
}
else
{
SensorcoreList.Items.Add("data not available");
}
}
});
}

接下来,我们添加ActivityMonitor,显示当前的用户状态。处理流程和上面的StepCounter类似,实例化一个ActivityMonitor对象,检查设备是否支持,然后获取当前值,并且显示在Listbox中。下面是RouteTracker和PlacesMonitor部分,处理方式和上面类似,这里不再例举。可以参考附件的源代码工程。演示的主页面如下图6所示。

微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

图6:应用程序调式主页面信息

另外,SDK还提供了几个Demo,包括Steps、Activities、Places和Tracks。演示的效果如下图6所示。大家可以去Nokia Developer上下载:链接

SDK提供的在线文档链接如下:文档链接

接下来Lumia App Labs webinar会提供培训如何使用SensorCore SDK,注册地址为:培训视频注册链接

Enjoy!

参考链接:

1. Building Apps for Windows

2. Lumia SensorCore SDK 0.9.1.3

3. Nokia Developer

4. 在线文档链接

5. 培训视频注册链接

6. 工程源代码