學習開發 Microsoft Band 的 App

學習開發 Microsoft Band 的 App

在撰寫這一篇內容的時候,心裡有一個疑問,未來 Band 是屬於 Win10 IoT 的 device family,

那是否就可以直接使用 Win10 的 Universal windows platform 架構搭配 IoT extension SDK 來開發呢?

之後又會再推出 Band 2,所以之後怎麼發展要等到 Win10 上市之後還有對應的 device families 發展才會比較清楚。

不過本篇針對一些入門開發 Microsoft Band App 做一些重點筆記的說明。

 

在開發之前有一篇要先讀<Experience design guidelines>先了解設計上的規範與對應的排版。

 

〉設計概念

  • Band 的震動會隨著不同的類型給予強度與次數的不同;
  • 操作範圍只有 Screen、Power Button 與 Action Button,如下圖:

              image

  • UI Layers,如下圖提供預設開啟 Band 時用戶第一個操作的畫面:

              image

  • Open App,這個部分需注意為自行開發 App 時會需要注意的部分:

              image

  • 呈現內容的方式
    • Through UI text (但目前沒有中文)
    • With iconography
    • With haptics
  • 支發第三方用的 Tiles:App Tile、Badged Tiles,如下圖:

             image

  • 文字顯示顏色階層,如下圖:

             image

  •    Tile 設計重點,如下圖:

             image

             Tile 的內容 icon 預設大小 46px x46,而有 badges 到來時變成 24px x 24px;

  • 設計 App 內容需注意可操作的範圍:
    • each app the system maintains a 40px width back bar
    • 35 px of peek content
    • a on screen content page with a width of 245 px. (320 – 40 – 35 = 245,實際可用空間)
    • Common Grid Rules (Open App) 的設計方式:

                           image

    • Common Grid Rules (Notifications ) 的設計方式:

                           image

以上是我覺得在設計上需要注意的部分,不過有更多詳細的訊息可以參考<Experience design guidelines>的說明。

 

在了解了相關的設計,接下來將針對 SDK 的操作加以說明。

 

 

〉相關 SDK 的使用注意重點

  • Multi-platform support 
  • Sensor data subscriptions
    • The SDK exposes data from these sensors as streams, and applications can subscribe to these sensor streams.
      Sensor Details
      Accelerometer Provides X, Y, and Z acceleration in g units. 1 g = 9.81 meters per second squared (m/s2 ).
      Gyroscope Provides X, Y, and Z angular velocity in degrees per second (°/sec) units.
      Distance Provides the total distance in centimeters, current speed in centimeters per second (cm/s), current pace in milliseconds per meter (ms/m), and the current pedometer mode (such as walking or running).
      Heart Rate Provides the number of beats per minute, also indicates if the heart rate sensor is fully locked onto the wearer’s heart rate. The data returned should be used only in resting mode. The Band SDK does not provide access to the heart rate values optimized for any other activity.
      Pedometer Provides the total number of steps the wearer has taken.
      Skin Temperature Provides the current skin temperature of the wearer in degrees Celsius.
      UV Provides the current ultra violet radiation exposure intensity.
      Band Contact Provides the current state of band as being worn/not worn.
      Calories Provides the total number of calories the wearer has burned.

                           image

  • Tile creation and management
    • 允許開發者建立一至多個 tiles 並傳送 notifications 到 Band ,讓用戶知道有一些互動或事件正在發生;
    • Tiles 支援 custom icons 與 color themes;
    • 一個 App 可以建立二種 tile:
      • Messaging tiles:
      • Custom tiles:
  • Tile notifications:
  • Custom layouts:
    • The tiles that you add to the Band can each contain up to 8 “pages” of content
    • When the user taps on the tile, the first page is shown and the user can swipe horizontally to navigate to other pages in the tile
      • image
  • Haptic notifications:
  • Band theme personalization:

 

以上是整理相關 Band 與內容設計的知識與開發上要注意的地方。接下來,藉由程式的範例來說明操作 Band SDK 相關注意事項。

 

建立一個新的專案後,需要先藉由 NuGet 將 Microsoft Band SDK 下載並加入專案參考,以下列出幾個常用的程式範例,如下:

image

 

〉取得連線

private IBandClient bandClient;
 
public async Task<String> RequestGetBandConnection()
{
    // 取得目前可被連線的 Bands
    var bands = await BandClientManager.Instance.GetBandsAsync();
    if (bands == null || bands.Length == 0)
    {
        return "No pairing off Band";
    }
    else
    {
        // 預設請求與第一個 Band 連線
        bandClient = await BandClientManager.Instance.ConnectAsync(bands[0]);
        return "connnected";
    }
}

在任何操作 Band 相關功能前,一定要記得先建立 Band 連線。

〉取得 Band 版本資訊的範例

public async Task<String> GetBandVersion()
{
    string fwVersion;
    string hwVersion;
    try
    {
        fwVersion = await bandClient.GetFirmwareVersionAsync();
        hwVersion = await bandClient.GetHardwareVersionAsync();
        // do work with firmware & hardware versions
        return String.Format("version: {0},{1}", fwVersion, hwVersion);
    }
    catch (BandException ex)
    {
        // handle any BandExceptions
        return ex.Message;
    }
}

 

〉建立 BandTile

private IBandClient bandClient;
 
private Guid BandTileId;
 
private BandTile MainTile;
 
public BandManager()
{
    bandClient = null;
    BandTileId = new Guid("8b6172b3-a23b-4655-a67a-609b61d8512d");
}
 
public async Task<Boolean> CreateBandTile()
{
    MainTile = null;
    // 取得目前已建立的 Band Tiles
    var tiles = await this.bandClient.TileManager.GetTilesAsync();
    foreach (var item in tiles)
    {
        // 找到與該 App 所建立相同的 Band Tile Id
        if (BandTileId == item.TileId)
        {
            MainTile = item;
            break;
        }
    }
    if (MainTile == null)
    {
        // 如果沒有,則重新建立一個新的
        MainTile = new BandTile(BandTileId)
        {
            TileIcon = await this.LoadIcon("ms-appx:///Assets/Band/Logo_46x46.png"),
            SmallIcon = await this.LoadIcon("ms-appx:///Assets/Band/Logo_24x24.png"),
            Name = "My badn tile"
        };
        return await bandClient.TileManager.AddTileAsync(MainTile);
    }
    else
    {
        return true;
    }
}

在建立前要記得先建立與 Band 的連線,取得 IBandClient 的物件。需要準備二張 TileIcon:46x46 與 24x24,並給予一個 GUID。

 

〉發送 message 與 dialog 的 notification

public async void SendDialog()
{
    try
    {
        // 傳送 dialog 至 Band 中指定的 Band Tile
        await bandClient.NotificationManager.ShowDialogAsync(BandTileId, "Dialog title", "Dialog body");
    }
    catch (BandException ex)
    {
        // handle a Band connection exception
    }
}
 
public async void SendMessage()
{
    try
    {
        // 傳送 a message 至 Band 中指定的 Band Tile,並且指定它顯示成像 Dialog 的樣式
        await bandClient.NotificationManager.SendMessageAsync(BandTileId, 
                "Message title", "Message body", DateTimeOffset.Now, MessageFlags.ShowDialog);
    }
    catch (BandException ex)
    {
        // handle a Band connection exception
    }
}

如果想要傳送震動也可以喔,如下:

public async void SendVibrate()
{
    try
    {
        // send a vibration request of type alert alarm to the Band
        await bandClient.NotificationManager.VibrateAsync(VibrationType.NotificationAlarm);
    }
    catch (BandException ex)
    {
        // handle a Band connection exception
    }
}

 

〉訂閱 Band Sensors 的動態資訊

     藉由 Band Sensor Manager 來訂閱與管理相關的動態資訊,包括:加速器、卡路里、心跳、UV、計步數、皮膚溫度、陀螺儀…等。

訂閱的方式讓開發者可以設定對應值的差距來觸發事件讓 App 可以收到值的改變。另外,由於每一個 Sensor 對電力需求不一樣,要注意 Band 電池的使用。

在 Windows / iOS 需要保持連線才能維護訂閱,如果連線斷掉的話訂閱將會被停止,而且它不會自動連線。」

Sensor 的訂閱需要用戶的同意(App 需要將用戶同意的結果記錄下來不需重覆詢問),訂閱模式模型如下:

  • Permission is granted on a per sensor basis.
  • Applications can request the permission status of a particular sensor. The status can be “Granted”,“Declined” or “Not Specified”. 
    If permission is “Granted”, applications can simply start the subscription.
  • Applications can request to show the permission dialog to ask the user for permission if the permission is “Not Specified” or “Declined”.
  • If the permission is “Not Specified” or “Declined” and the application requests to enable the subscription, the request to enable the subscription will fail.

注意: At this time, only heart rate sensor subscription requires an explicit user consent before it can be started.

範例如下:

public async void SubscriptHeartRateSensor()
{
    // 檢查是否有取得用戶同意存取 心跳的資訊,其他的 Sensor 在使用前要記得加上這段
    if (this.bandClient.SensorManager.HeartRate.GetCurrentUserConsent() != UserConsent.Granted)
    {
        // 如果用戶沒有同意,則請求他同意。
        await bandClient.SensorManager.HeartRate.RequestUserConsentAsync();
    }
 
    // get a list of available reporting intervals
    IEnumerable<TimeSpan> supportedHeartBeatReportingIntervals = bandClient.SensorManager.HeartRate.SupportedReportingIntervals;
    foreach (var ri in supportedHeartBeatReportingIntervals)
    {
        // do work with each reporting interval (i.e. add them to a list in the UI)
    }
 
    // set the reporting interval
    bandClient.SensorManager.HeartRate.ReportingInterval = supportedHeartBeatReportingIntervals.GetEnumerator().Current;
    
    // hook up to the Heartrate sensor ReadingChanged event
    bandClient.SensorManager.HeartRate.ReadingChanged += (sender, args) =>
    {
        // do work when the reading changes (i.e. update a UI element)
    };
 
    // start the Heartrate sensor
    try
    {
        await bandClient.SensorManager.HeartRate.StartReadingsAsync();
    }
    catch (BandException ex)
    {
        // handle a Band connection exception
        throw ex;
    }
 
    // stop the Heartrate sensor
    try
    {
        await bandClient.SensorManager.HeartRate.StopReadingsAsync();
    }
    catch (BandException ex)
    {
        // handle a Band connection exception
        throw ex;
    }         }

要注意得到用戶同意後,可藉由 SupportedReportingIntervals() 取得該 Sensor 提供訂閱週期的區間,而 ReadingChanged 事件可收到每次改變的數值,

最後藉由 StartReadingsAsync 與 StopReadingsAsync 負責開啟或關閉訂閱的處理。

 

 

藉由上述的範例了解了一些需要注意的重要類別、屬性與事件,往下便加以說明:

〉IBandClient

    主要操作 Band SDK 的重要元素,裡面包括了四個重要的 Manager,分別管理:Notification、Sensor、Personalization 與 Tile。

Type Name Description
Property NotificationManager IBandNotificationManager,負責發送 Message、Dialog 或 Vibrate 的控制元件。
重點方法如下:
Name Description
SendMessageAsync

發送 Message,可指定 MessageFlags 為何種類型,其值有:

  • None
  • Dialog
ShowDialogAsync 發送 Dialog。
VibrateAsync

發送震動,可指定震動類型(VibrationType),其值有:

  • NotificationOneTone
  • NotificationTwoTone
  • NotificationAlarm
  • NotificationTimer
  • OneToneHigh
  • TwoToneHigh
  • ThreeToneHigh
  • RampUp
  • RampDown

  PersonalizationManager IBandPersonalizationManager,提供管理與操作個人化的設定。
重點方法如下:
Name Description
GetMeTileImageAsync 取得 MeTile 的圖示。
GetThemeAsync 取得目前使用的主題。
SetMeTileImageAsync 設定 MeTile 的圖示。
SetThemeAsync 設定目前使用的主題。
  SensorManager IBandSensorManager,負責監控與回報目前 Band Sensor 的資訊。
重點屬性如下:
Name Description
Accelerometer 取得加速度計。
Calories 取得消費的卡路里。
Contact 藉由 GetCurrentStateAsync 取得目前的資訊。
Distance 取得距離。
Gyroscope 取得陀螺儀。
HeartRate 取得心跳數。
Pedometer 取得計步器。
SkinTemperature 取得皮膚溫度。
UV 取得 UV 指數。
以上這些類型都是 interface 提供了統一介面:IBandSensorManager 與 IBandSensorReading 讓開發者可以直接加入訂閱與讀取/開關 Sensor 的使用。
  TileManager IBandTileManager,負責操作 Band Tile ,註冊 Band Tile 被開啟/閉關/點擊事件…等功能的重要元件。
主要方法與事件如下:
Type Name Description
Event TileButtonPressed 註冊當 Band Tile 被按下時的事件。
  TileClosed 註冊當 Band Tile 被關閉時的事件。
  TileOpened 註冊當 Band Tile 被開啟時的事件。
Method AddTileAsync 負責加入新的 Band Tile。
  GetRemainingTileCapacityAsync 取得 BandTiles 可被操作與維護的特性。
  GetTilesAsync 取得目前該 App 所加入的所有 BandTile。
  RemovePagesAsync 移除指定 BandTile 中的 PageLayouts。
  RemoveTileAsync 移除指定 BandTile。
  SetPagesAsync 設定指定 BandTile 中 的 PageDatas。
  StartReadingsAsync 開始讀取 BandTile 的事件。
  StopReadingsAsync 關閉讀取 BandTile 的事件。
StartReadingsAsync 與 StopReadingsAsync 是一組使用,針對讀取當 BandTile 被開啟之後中間在 PageLayout 裡所有 Button 元件的事件,直到當 TileClose 事件被觸發後則呼叫 StopReadingsAsync。
Method GetFirmwareVersionAsync 取得 Band 的 firmware version。
  GetHardwareVersionAsync 取得 Band 的 hardware version。

 

 

[補充]

1. 相關 Personalization 的介紹可以參考 sample code 的部分。

======

以上是分享如何開發 Microsoft Band 上的 App,雖然目前能做的事情算少,如果想開發的不是相關到 Sensor 的應用,

那其實應該會更困難會去使用到。但還是幫忙把我學習的筆記分享給大家,希望對大家有所幫助,謝謝。

 

References

Experience design guidelines

Get started with the Microsoft Band SDK.

Microsoft Band SDK Documentation

 

 

Dotblogs Tags: