早在今年的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所示。
圖1:Health &Fitness應用的計步功能頁面
進一步的,它還提供了數據的統計和分析,如下圖2所示。
圖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所示。
圖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所示。
圖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所示。
圖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所示。
圖6:應用程序調式主頁面信息
另外,SDK還提供了幾個Demo,包括Steps、Activities、Places和Tracks。演示的效果如下圖6所示。大家可以去Nokia Developer上下載:鏈接。
SDK提供的在線文檔鏈接如下:文檔鏈接
接下來Lumia App Labs webinar會提供培訓如何使用SensorCore SDK,注冊地址為:培訓視頻注冊鏈接
Enjoy!
參考鏈接:
2. Lumia SensorCore SDK 0.9.1.3
4. 在線文檔鏈接
5. 培訓視頻注冊鏈接
6. 工程源代碼





![clip_image002[5] clip_image002[5]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNDEwNzIvMjAxNDA2LzI0MDk0MzQzNDM5NjQ1MS5wbmc=.png)
![clip_image004[5] clip_image004[5]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNDEwNzIvMjAxNDA2LzI0MDk0MzQzOTcxMjc4MS5wbmc=.png)



