使ってみよう! Windows Live SDK/API

第54回 作ってみようSkyDrive連携PowerPointアドイン(後篇)

この記事を読むのに必要な時間:およそ 9.5 分

写真のダウンロード

SkyDriveから写真をダウンロードして,スライドに追加する処理を行いましょう。まず,AddPictureメソッドを定義します。このメソッドでは,スライドに追加するOfficeに対する操作があるため,MessageFilterの登録を行います。

Private Sub AddPicture(data As Tuple(Of PowerPoint.Slide, PowerPoint.Shape))
    Dim previousMessageFilter As IMessageFilter = Nothing
    CoRegisterMessageFilter(Me, previousMessageFilter)

    Dim slide = data.Item1
    Dim marker = data.Item2
    Try
        ' (ここに写真のダウンロードとスライドに追加する処理を追記する)
    Catch ex As Exception
        ' (例外は無視)
    Finally
        CoRegisterMessageFilter(Nothing, previousMessageFilter)
    End Try
End Sub

さて,SkyDrive APIのおさらいです。サインインユーザーのSkyDrivet直下のフォルダーとファイルの一覧を取得するには次のURLへHTTP GETアクセスします。

  • https://apis.live.net/v5.0/me/skydrive/files?access_token=ACCESS_TOKEN

また,指定したフォルダーの内容を取得するには次のURLへアクセスします。

  • https://apis.live.net/v5.0/FOLDER_ID/files?access_token=ACCESS_TOKEN

指定したフォルダーから写真を取得してもいいのですが,今回のアドインでは,Windows Phoneで撮影した写真が自動でアップロードされる,カメラロール フォルダーから写真をダウンロードしましょう。このフォルダーは,Folder IDを使わず,特別なフォルダーとして次のようにURLのパスを記述できます。

  • https://apis.live.net/v5.0/me/skydrive/camera_roll/files?access_token=ACCESS_TOKEN

さらに,次のようにURLのパラメーターを指定して,取得枚数と,並び順を指定できます。これによって,最新の1枚を選びます。また,filesではなくphotosとパスを指定すると写真ファイルのみ参照できます。

  • https://apis.live.net/v5.0/me/skydrive/camera_roll/photos?access_token=ACCESS_TOKEN&limit=1&sort_by=updated&sort_order=descending

アドインでは上記のURLにアクセスするようにします。サーバーから受け取るデータは次のようなJSON形式のデータになります。この中から写真のダウンロードのためにsourceと,写真の幅(ピクセル)の取得にwidthheightの値のみ使います。

{
   "data": [
      {
         "id": "file.xxxxx", 
         "from": {
            "name": "梓 中野", 
            "id": "xxxxx"
         }, 
         "name": "WP_001111.jpg", 
         "description": null, 
         "parent_id": "folder.xxxxx", 
         "size": 181761, 
         "comments_count": 0, 
         "comments_enabled": false, 
         "tags_count": 0, 
         "tags_enabled": true, 
         "is_embeddable": true, 
         "picture": "http://storage.live.com/xxxxx/WP_001111.jpg:Thumbnail/WP_001111.jpg", 
         "source": "http://storage.live.com/xxxxx/WP_001111.jpg:Default,Largest/WP_001111.jpg", 
         "upload_location": "https://apis.live.net/v5.0/file.xxxxx/content/", 
         "images": [
         ... 省略 ...
         ], 
         "link": "https://skydrive.live.com/redir.aspx?cid\xxxxx", 
         "when_taken": "2012-05-24T12:00:00+0000", 
         "height": 538, 
         "width": 717, 
         "type": "photo", 
         "location": {
            "latitude": 35.2034, 
            "longitude": 136.2326
         }, 
         "shared_with": {
            "access": "Just me"
         }, 
         "created_time": "2012-05-23T13:00:00+0000", 
         "updated_time": "2012-05-23T13:00:00+0000"
      }
   ], 
   "paging": {
      "next": "/me/skydrive/camera_roll/files?xxxxx"
   }
}

写真のダウンロードまでをコードにします。LiveサービスにアクセスするLiveConnectClientクラスを用意していたので,これを使います。またJSONから値の取得にはJson.NETを利用します。

' SkyDrive から最新の写真1枚の情報を取得
Dim result = Me.LiveConnectClient.Get(
    "me/skydrive/camera_roll/files?limit=1&sort_by=updated&sort_order=descending")

Dim o = JObject.Parse(result)
Dim src = o("data")(0)("source").ToString
Dim w = o("data")(0)("width").Value(Of Integer)()
Dim h = o("data")(0)("height").Value(Of Integer)()

' 写真のダウンロード
Dim client = New Net.WebClient
Dim file = System.IO.Path.GetTempFileName ' 一時的なファイル名を生成
client.DownloadFile(src, file)

特別に難しいところはないと思います。続いてダウンロードした写真をスライドに追加します。

' マーカーの範囲内に収まるように大きさを調節
Dim left, top, width, height As Single
If h * (marker.Width / w) <= marker.Height Then
    width = marker.Width
    height = h * (marker.Width / w)
    left = marker.Left
    top = marker.Top + (marker.Height - height) / 2
Else
    width = w * (marker.Height / h)
    height = marker.Height
    left = marker.Left + (marker.Width - width) / 2
    top = marker.Top
End If

' 写真をスライドに追加
Dim pic = slide.Shapes.AddPicture(file, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, left, top, width, height)

pic.Tags.Add(TagName, "InsertedPicture")
pic.Left = left
pic.Top = top
pic.Width = width
pic.Height = height
pic.ZOrder(Microsoft.Office.Core.MsoZOrderCmd.msoBringForward) '最前面に表示

マーカーで示した範囲内に収まるように位置を計算し,slide.Shapes.AddPictureメソッドで写真を追加しています。また,アドインによって追加した写真とわかるように,pic.Tags.Addメソッド部分でタグ情報も付けています。

以上で,AddPictureメソッドの処理を記述できました。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp