學習開發 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,如下圖:
- UI Layers,如下圖提供預設開啟 Band 時用戶第一個操作的畫面:
- Open App,這個部分需注意為自行開發 App 時會需要注意的部分:
- 呈現內容的方式
- Through UI text (但目前沒有中文)
- With iconography
- With haptics
- 支發第三方用的 Tiles:App Tile、Badged Tiles,如下圖:
- 文字顯示顏色階層,如下圖:
- Tile 設計重點,如下圖:
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) 的設計方式:
- Common Grid Rules (Notifications ) 的設計方式:
以上是我覺得在設計上需要注意的部分,不過有更多詳細的訊息可以參考<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.
- The SDK exposes data from these sensors as streams, and applications can subscribe to these sensor streams.
- Tile creation and management:
- 允許開發者建立一至多個 tiles 並傳送 notifications 到 Band ,讓用戶知道有一些互動或事件正在發生;
- Tiles 支援 custom icons 與 color themes;
- 一個 App 可以建立二種 tile:
- Messaging tiles:
- Custom tiles:
- Messaging tiles:
- Tile notifications:
- Custom layouts:
- Haptic notifications:
- Band theme personalization:
以上是整理相關 Band 與內容設計的知識與開發上要注意的地方。接下來,藉由程式的範例來說明操作 Band SDK 相關注意事項。
建立一個新的專案後,需要先藉由 NuGet 將 Microsoft Band SDK 下載並加入專案參考,以下列出幾個常用的程式範例,如下:
〉取得連線:
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 的控制元件。
重點方法如下:
|
||||||||||||||||||||||||||||||||||||
PersonalizationManager | IBandPersonalizationManager,提供管理與操作個人化的設定。
重點方法如下:
|
|||||||||||||||||||||||||||||||||||||
SensorManager | IBandSensorManager,負責監控與回報目前 Band Sensor 的資訊。
重點屬性如下:
|
|||||||||||||||||||||||||||||||||||||
TileManager | IBandTileManager,負責操作 Band Tile ,註冊 Band Tile 被開啟/閉關/點擊事件…等功能的重要元件。
主要方法與事件如下:
|
|||||||||||||||||||||||||||||||||||||
Method | GetFirmwareVersionAsync | 取得 Band 的 firmware version。 | ||||||||||||||||||||||||||||||||||||
GetHardwareVersionAsync | 取得 Band 的 hardware version。 |
[補充]
1. 相關 Personalization 的介紹可以參考 sample code 的部分。
======
以上是分享如何開發 Microsoft Band 上的 App,雖然目前能做的事情算少,如果想開發的不是相關到 Sensor 的應用,
那其實應該會更困難會去使用到。但還是幫忙把我學習的筆記分享給大家,希望對大家有所幫助,謝謝。
References:
〉Get started with the Microsoft Band SDK.
〉Microsoft Band SDK Documentation