微軟移動 Nokia Lumia SensorCore SDK 介紹及上手體驗


    早在今年的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所示。

clip_image002image

圖1:Health &Fitness應用的計步功能頁面

    進一步的,它還提供了數據的統計和分析,如下圖2所示。

clip_image002 clip_image004

圖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所示。

clip_image002[5] clip_image004[5]

圖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所示。

12

圖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所示。

3

圖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所示。

wp_ss_20140623_0001

圖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. 工程源代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM