さて今回は、Windows LiveのSDKを利用して仮想フォトフレームを作りたいと思います。仮想フォトフレームという言葉は一般的ではないようで筆者が勝手に定義したものですが、PC上で動作するデジタルフォトフレーム アプリケーションです。ハードウェアとして実体はありません。スライドショー機能のある画像ビューワーと違いがなさそうですが、今回作るアプリケーションはWindows Live FrameItというデジタルフォトフレーム用のWebサービスと連携し、サービスに対し実際のデジタルフォトフレームのように振る舞うところが画像ビューワーとの違いです。
開発環境および言語はVisual Studio 2008とVisual Basicを使用します。無償のVisual Basic Express Edition SP1でも開発可能ですので是非お試しください。またVB.NETを使用していますが、Live FrameItの利用は.NET Frameworkに依存した内容ではありません。HTTP接続およびXML処理さえできればどの言語でも利用可能です。
Windows Live FrameIt
Windows Live FrameIt(図1)はデジタルフォトフレーム向けのWebサービスで、日本では2009年4月からベータ版として開始しています。簡単に説明するとWebサイト上でユーザーがデジタルフォトフレームに表示したい写真を選択し、デジタルフォトフレームへ配信できるというサービスです。
図1 Windows Live FrameIt
Live FrameItの特徴のひとつは、配信する写真を多様なソースから選択・組み合わせできることです。ソースにはオンラインストレージのWindows Live SkyDriveにアップロードした写真、検索サービスのBingによる画像検索結果、各種写真共有サービスなどがあります(図2)。
Windows Live FrameIt SDKは、Live FrameItを利用したデジタルフォトフレーム製造のための機器メーカー向けのSDKです。ただし、SDKの入手や利用は個人でも可能ですので、今回はこれを利用してLive FrameItに対応したアプリケーションを作ります。SDKの内容にはブランドロゴのライセンシングの手続きなども含まれていますが、本連載では扱いません。本連載では、Liveサービスに興味のある個人の方を対象とした内容とします。
Live FrameIt SDKはhttp://frameit.live.com/Partnersからダウンロードしてください。SDK内には各種文書およびサンプルプログラムなどが含まれています。Live FrameItはデジタルフォトフレーム用のWeb APIを用意しています。APIはSOAPと呼ばれる通信プロトコルを使用しています。これから作成する仮想フォトフレームは、このAPIを利用して各種ユーザー情報を取得して動作することになります。
' (注: まだ不完全な例です)Dim client = New DeviceSvcSoapClient
Dim result = client.DeviceBindUser("Virtual Photo Frame", Now.Ticks.ToString)
Dim deviceId = result.DeviceId
DeviceSvcSoapClientクラスはWindows Communication Foundation(WCF)という通信に関する統一的なプログラミングモデルに基づいてWebサービスを呼び出しています。本連載では説明しませんが、ヘッダーに情報を付け加えるには以下のコードのようにOperationContextScopeクラスを使用します。OperationContextScopeオブジェクトにより指定した区間で行う通信にはAuthorizationヘッダーフィールドを付加するよう記述しています。
' 次の Import 宣言をしているものとします' Imports VirtualPhotoFrame.ServiceReference (VirtualPhotoFrame は アプリケーションのルート名前空間)' Imports System.ServiceModel' Imports System.ServiceModel.ChannelsDim result As DeviceBindResults
Using client = New DeviceSvcSoapClient
Using scope = New OperationContextScope(client.InnerChannel)
' HTTP ヘッダーフィールドの追加Dim prop = New HttpRequestMessageProperty
prop.Headers.Add(Net.HttpRequestHeader.Authorization, "WLID1.0 " & ticket)
OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, prop)
' デバイスの登録
result = client.DeviceBindUser("Virtual Photo Frame", Now.Ticks.ToString)
EndUsingEndUsing' デバイスIDDim deviceId = result.DeviceId