SkyDriveとのWindows Phoneアプリケーションの統合

Hi%username%!







正直に言うと、以前の投稿をお気に入りに追加する人はそれほど多くないと思っていました。 実際、これは喜ばしいことです。プラットフォームは積極的に開発および宣伝されており、開発者の注目を集めています。 今日は、アプリケーションからSkyDriveを操作するトピックに焦点を当てたいと思います。 この記事は、前回同様、実際のケースに基づいています。ユーザーにソーシャルネットワークでファイルを共有する機会を与える必要がありました。





スカイドライブ



知らない人のために、SkyDriveはMicrosoftのDropboxの類似物です:25 GBのクラウドストレージ。 SkyDriveはWindows Phoneと非常に緊密に統合されています。多くのマーケティング会社では、「クラウドフラッシュドライブ」などのメモリカードを使用する機能の代わりに配置されています。 たとえば、Twitterで写真を共有する場合、写真はskydriveにアップロードされ、そのリンクはtwitterに投稿されます。 アプリケーションに同じ機能を実装しましょう。



ライブSDK



まず、 リンクからダウンロードできるLive SDKが必要です。 このSDKを使用すると、次のことができます。



次に、アプリケーションのクライアントIDとクライアントシークレットを取得する必要があります。 これは次のリンクでできます。 API Settingsタブで、アプリケーションがモバイルクライアントであることを忘れないでください 。 これで、アプリケーションの開発を開始できます。



ログイン



まず、SkyDriveの使用をアプリケーションに許可する必要があります。 Live SDKをインストールすると、新しいインターフェイス要素SignInButtonを使用できるようになります。







<my:SignInButton Name="signInButton" Height="72" Margin="143,511,153,0" VerticalAlignment="Top" Branding="Skydrive" ClientId="_id" Content="Button" RedirectUri="http://oauth.live.com/desktop" Scopes="wl.basic wl.photos wl.skydrive wl.offline_access wl.signin wl.skydrive_update" SessionChanged="signInButton1_SessionChanged" TextType="SignIn" />
      
      







主なパラメーターを見てみましょう。



ブランディング -ボタンに表示されるアイコン(「Windows」、「Hotmail」、「Messenger」の値を取ることもできます)。

ClientId-上記で取得したアプリケーションのID。

RedirectUri-リダイレクトアドレス。

スコープ -アプリケーションに必要な権限。 ここでは、ログインし、SkyDriveを使用し、ギャラリーなどで作業するためにAPIを使用することを示しました。 さまざまなタイプのスコープの詳細については、 こちらをご覧ください

SessionChanged-承認ハンドラー。

TextType-ボタン上のテキスト。 また、サインイン、ログイン、接続、カスタムなど、いくつかのタイプがあります。



ハンドラーを見てみましょう。

 private void signInButton1_SessionChanged(object sender, Microsoft.Live.Controls.LiveConnectSessionChangedEventArgs e) { if (e.Session != null && e.Status == LiveConnectSessionStatus.Connected) { App.Session = e.Session; } }
      
      







セッションをApp.xaml.csに保存することを好みます。これは、アプリケーションのどの部分のAPIでも機能します。

 private static LiveConnectSession session = null; public static LiveConnectSession Session { get { return session; } set { session = value; } }
      
      







名前空間を指定することを忘れないでください:

 using Microsoft.Live;
      
      







[ サインイン ]ボタンをクリックすると、Live IDを使用してログインし、 Scopesで指定した機能をアプリケーションに許可するように求められます。







フォルダーの作成/確認



フォルダーまたはアルバムに写真を投稿するには、そのIDを知っている必要があります。 したがって、フォルダを作成すると、そのIDを含めて返されます。 アルバムを作成し、IDを取得し、 IsolatedStorageSettingsに書き込み、それを使用して写真をアップロードできます。 ただし、ユーザーがフォルダーを削除した場合、または指定された名前のフォルダーが既に存在する場合、この方法では写真をアップロードできません。 したがって、私は常に最初にフォルダーのリストを取得し、目的のフォルダーの存在を確認することを好みます。 そして、存在する場合-ファイルをアップロードし、存在しない場合-最初にフォルダーを作成してから、ファイルをアップロードします。



ファイルのリストを取得して確認する:

 public class SkyDriveContent { public string Name { get; set; } public string ID { get; set; } } List<SkyDriveContent> ContentList = new List<SkyDriveContent>(); private void CheckAlbum() { if (App.Session == null) { MessageBox.Show("You must sign in first."); Waiting.Visibility = Visibility.Collapsed; } else { txtStatus.Text = "Checking album"; LiveConnectClient client = new LiveConnectClient(App.Session); client.GetCompleted += new EventHandler<LiveOperationCompletedEventArgs>(clientDataFetch_GetCompleted); client.GetAsync("/me/skydrive/files"); } } void clientDataFetch_GetCompleted(object sender, LiveOperationCompletedEventArgs e) { if (e.Error == null) { List<object> data = (List<object>)e.Result["data"]; foreach (IDictionary<string, object> content in data) { SkyDriveContent skyContent = new SkyDriveContent(); skyContent.Name = (string)content["name"]; if (skyContent.Name == "SkyDriveTest") { albumID = (string)content["id"]; } ContentList.Add(skyContent); } if (albumID == "") CreateAlbum(); else UploadPhoto(); } else { MessageBox.Show("Error calling API: " + e.Error.ToString()); Waiting.Visibility = Visibility.Collapsed; } }
      
      







解析には、中間クラスのSkyDriveContentを使用します。このクラスには、フォルダーの名前とそのIDが格納されています。 SkyDriveのルートにあるすべてのフォルダーの名前を確認します。 フォルダーの名前がSkyDriveTestである場合、そのIDを取得します;そのようなフォルダーが見つからない場合、POSTリクエストを使用して作成します:

 private void CreateAlbum() { txtStatus.Text = "Creating album"; Dictionary<string, object> fileData = new Dictionary<string, object>(); fileData.Add("name", "SkyDriveTest"); LiveConnectClient client = new LiveConnectClient(App.Session); client.PostCompleted += new EventHandler<LiveOperationCompletedEventArgs>(CreateAlbum_Completed); client.PostAsync("me/albums", fileData); } void CreateAlbum_Completed(object sender, LiveOperationCompletedEventArgs e) { if (e.Error == null) { JObject jObject = JObject.Parse(e.RawResult); albumID = (string)jObject["id"]; UploadPhoto(); } else { MessageBox.Show("Error calling API: " + e.Error.ToString()); Waiting.Visibility = Visibility.Collapsed; } }
      
      







フォルダーを作成すると、応答としてサーバーはIDを含むJSON形式でそのプロパティを送信します。 逆シリアル化には、NuGetで利用可能なJson.NETを使用します。



写真をアップロードして共有する



フォルダーIDを取得したので、写真をアップロードできます。 カメラから取得した例の写真:

 void cameraCapture_Completed(object sender, PhotoResult e) { if (e.TaskResult == TaskResult.OK) { bitImage.SetSource(e.ChosenPhoto); image1.Source = bitImage; stream = new IsolatedStorageFileStream("/image.jpg", System.IO.FileMode.OpenOrCreate, iso); WriteableBitmap wb = new WriteableBitmap(bitImage); System.Windows.Media.Imaging.Extensions.SaveJpeg(wb, stream, wb.PixelWidth, wb.PixelHeight, 0, 80); stream.Close(); } }
      
      







直接読み込み:

 public void UploadPhoto() { txtStatus.Text = "Uploading photo"; LiveConnectClient uploadClient = new LiveConnectClient(App.Session); uploadClient.UploadCompleted += new EventHandler<LiveOperationCompletedEventArgs>(uploadClient_UploadCompleted); stream = iso.OpenFile("/image.jpg", System.IO.FileMode.Open, System.IO.FileAccess.Read); uploadClient.UploadAsync(albumID, "Image " + DateTime.Now.Millisecond + ".jpg", stream); } void uploadClient_UploadCompleted(object sender, LiveOperationCompletedEventArgs e) { stream.Close(); if (e.Error == null) { txtStatus.Text = "Sharing photo"; JObject jObject = JObject.Parse(e.RawResult); string name = (string)jObject["id"]; Share(name); } else { MessageBox.Show("Error calling API: " + e.Error.ToString()); Waiting.Visibility = Visibility.Collapsed; } }
      
      







ご覧のように、写真をアップロードすることは実質的に違いはありません。 前のケースと同様に、ダウンロードしたイメージのIDを取得します。これを共有する必要があります。 デフォルトでは、非共有フォルダーにアップロードされたすべてのファイルにはプライベートアクセス修飾子があります。 次に、画像を共有しましょう。 これは、パラメータ/ shared_read_linkを画像のIDに追加することにより行われます。

 private void Share(string filename) { LiveConnectClient client = new LiveConnectClient(App.Session); client.GetCompleted += new EventHandler<LiveOperationCompletedEventArgs>(GetSharedLink_Completed); client.GetAsync(filename + "/shared_read_link"); } void GetSharedLink_Completed(object sender, LiveOperationCompletedEventArgs e) { if (e.Error == null) { ShareLinkTask shareLinkTask = new ShareLinkTask(); shareLinkTask.Title = "Holiday Photo"; shareLinkTask.LinkUri = new Uri(e.Result["link"].ToString(), UriKind.Absolute); shareLinkTask.Message = "My super holiday photo via #HolidayPhoto!"; shareLinkTask.Show(); txtStatus.Text = "Done!"; Waiting.Visibility = Visibility.Collapsed; } else { MessageBox.Show("Error calling API: " + e.Error.ToString()); Waiting.Visibility = Visibility.Collapsed; } }
      
      











ここで、サーバーからファイルへのリンクを取得し、 ShareLinkTaskに転送します。 それだけです!仕事は終わりました!



おわりに



もちろん、SkyDriveのREST APIとLive SDKの両方の一般的な機能は、私が説明したものに限定されません。 次のソースから追​​加情報を入手できます。





記事から例をダウンロードしてください

この例では、カメラの画像が取得され、SkyDriveにアップロードされます。 ロード中に、ステータスがアプリケーションページに表示されます。 MainPage.xamlファイルでClientIDを指定することを忘れないでください! これがないと、アプリケーションは動作しません!



すべての創造的な悪用と成功した認証! 知らない人のために、先日、Windows Phone アプリケーションの新しい競争が始まりました。



UPD: Habrastorageに問題はほとんどありません。写真はすぐに元の場所に戻ります。



All Articles