Live SDKノート5-SkyDrive Explorer,Windows Phone 7版

82835 ワード



続けて4つのメモを書き、Live SDKを紹介し、実際に利用者のLive IDを取得したり、SkyDriveを接続したりしたこともある.
Live SDKノート1-プロフィールLive SDKノート2-登録Appと基本用語Live SDKノート3-Live IDを使用してASPに登録する.NETサイトLive SDKノート4-SkyDrive Explorer,ASP.NET版これらを埋めてむせび泣いて、実は背後で私が最もしたいのは、WP 7プログラムからSkyDriveをつなぎます!
携帯電話は、ストレージスペースの制限や、デバイス/プラットフォーム間で共有する必要があるため、ネットワークのストレージスペースを後ろ盾にする必要がありますが、WP 7にはマイクロソフトシステムのSkyDriveが搭載されており、素晴らしい組み合わせだと感じています.
Live SDKは、WP 7専用のライブラリを提供する、Live SDKをダウンロードしてインストールした後、WP 7の案件参照でMicrosoftを見つけることができる.LiveおよびMicrosoft.Live.Controls、学習センターはWP 7統合Live SDK教育があり、とても良い入門です.
Live SDKはSignInButton制御項目を提供し、表面的にはログインボタンであり、裏ではAppに埋め込まれたブラウザでLiveアカウントをロードしてWebページにログインしたり、同意したりするなどの煩雑な詳細を処理してくれ、Live SDKを統合する最も簡単な方法です.Visual Studioツールボックスに表示されない場合は、Microsoftを自分で見つけることができます.Live.Controls.dllはツールボックス(以下図)に追加されます.
ただし、Appが動作する場合、ASPではないので注意してください.NETの例にはCallbackがあります.aspxはAuthorization CodeにアクセスしてAPIを再呼してAccess Tokenを取得する責任を負う.Appの登録の第3点を参照してください.Client IDを申請するときは、Redirect Domainを白紙にして、「Mobile client app」を「Yes」にチェックしてください.このClient IDを使用できます.httqs://oauth.live.com/desktopRedirect PageとしてAccess Tokenを直接取得することで,行動装置上で独立して動作できる.
私が作ってみたいおもちゃはSkyDriveの簡易ブラウザで、機能は1編のASPに続きます.NET版の差は多くなく、利用者対wlを取得する.skydriveの範囲の同意権の後、利用者SkyDriveの下のディレクトリをリストし、ポイントディレクトリはその下のサブプロジェクトを展開することができ、ファイルであれば検視することができるが、WP 7が支援できるファイルフォーマットはPCより少なく、私はまず画像(jpg,png)と映画(wmv,mp 3,mp 4)に対して検視機能を提供することを選択した.
MainPage.xamlはSignInButtonとListBoxを入れます.
レイアウト表示
じゅんもじ
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="Mini SkyDrive Explorer" 
                       Style="{StaticResource PhoneTextNormalStyle}"/>
            <my:SignInButton x:Name="btnSignIn" Branding="Skydrive" 
             SessionChanged="btnSignIn_SessionChanged" CientId="0000000016888888" 
             RedirectUri="https://oauth.live.com/desktop" 
             Scopes="wl.signin wl.basic wl.skydrive"/>
        </StackPanel>
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ListBox x:Name="DirList" FontSize="36" 
                     MouseLeftButtonUp="DirList_MouseLeftButtonUp">
            </ListBox>
        </Grid>
    </Grid>

MainPage.xaml.csはプログラムロジックに参加し、主な原理は使用者がログインと同意を完了した後(btnSignIn_SessionChangedイベント)にLiveConnectClientを確立し、それを使用してREST APIを呼び出して各種の操作を実行することができる.コール結果はclient_GetCompletedイベント解析、関連する注釈説明は私がプログラムに添付したので、Codeを直接見ます.
レイアウト表示
じゅんもじ
using System;
using System.Collections.Generic;
using System.Windows.Input;
using Microsoft.Phone.Controls;
using Microsoft.Live;
using Microsoft.Live.Controls;
 
namespace MiniSkyDriveExplorer
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }
 
        private LiveConnectClient client = null;
        private void btnSignIn_SessionChanged(object sender, 
            LiveConnectSessionChangedEventArgs e)
        {
            if (e.Status == LiveConnectSessionStatus.Connected)
            {
                DirItem.LiveSession = e.Session;
                client = new LiveConnectClient(e.Session);
                client.GetCompleted += 
                    new EventHandler<LiveOperationCompletedEventArgs>(
                        client_GetCompleted);
                //  me/skydrive,     folderId
                client.GetAsync("me/skydrive", 
                    new MyUserState(ApiMethod.SkyDriveProp));
            }
        }
        private const string goUpperSymbol = "\t";
        //   REST API       ,            
        //          ,             ,        
        void client_GetCompleted(object 
                                 sender, LiveOperationCompletedEventArgs e)
        {
            MyUserState state = e.UserState as MyUserState;
            if (state == null) return;
            switch (state.Method)
            {
                //  SkyDrive     folderId
                case ApiMethod.SkyDriveProp:
                    //  id,         
                    ListFiles(e.Result["id"].ToString());
                    break;
                //      
                case ApiMethod.SkyDriveDir:
                    // data    
                    List<object> items =
                        e.Result["data"] as List<object>;
                    if (items != null)
                    {
                        DirList.Items.Clear();
                        DirList.DisplayMemberPath = "DisplayName";
                        //        
                        if (folderIdStack.Count > 1)
                        {
                            DirItem di = new DirItem(goUpperSymbol, "[..]");
                            DirList.Items.Add(di);
                        }
 
                        foreach (Dictionary<string, object> item in items)
                        {
                            DirItem di  = new DirItem(
                                item["id"].ToString(),
                                item["name"].ToString()
                            );
                            //            
                            if (di.IsFolder)
                                di.Count = int.Parse(item["count"].ToString());
                            else //         
                                di.SrcUrl = item["source"].ToString();
                            //    
                            DirList.Items.Add(di);
                        }
                    }
                    break;
            }
        }
        //         folderId
        private Stack<string> folderIdStack = new Stack<string>();
        private void ListFiles(string folderId)
        {
            if (client == null) return;
            if (folderId == goUpperSymbol)
            {
                folderIdStack.Pop();
                folderId = folderIdStack.Peek();
            }
            else folderIdStack.Push(folderId);
            client.GetAsync(folderId + "/files", 
                            new MyUserState(ApiMethod.SkyDriveDir));
        }
        private void DirList_MouseLeftButtonUp(object sender, 
                                               MouseButtonEventArgs e)
        {
            DirItem di = DirList.SelectedItem as DirItem;
            //     ,    
            if (di.IsFolder || di.Id == goUpperSymbol) ListFiles(di.Id);
            //          
            else
            {
                DirItem.Current = di; //  DirItem  Current
                NavigationService.Navigate(
                    new Uri("/Viewer.xaml", UriKind.Relative));
            }
        }
    }
}

プログラムをより構造化するために、簡単なSkyDriveプロジェクトのアイテムモデルを宣言しました.(上のMainPage.xaml.csに登場するDirItem、MyUserStateアイテムの由来です)
レイアウト表示
じゅんもじ
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Live;
 
namespace MiniSkyDriveExplorer
{
    #region     REST API         
    public enum ApiMethod
    {
        SkyDriveProp, // me/skydrive
        SkyDriveDir,  // folderId/files
        SkyDriveGetImage,
        SkyDriveGetMedia
    }
    public class MyUserState
    {
        public ApiMethod Method;
        public string FileName;
        public MyUserState(ApiMethod method)
        {
            Method = method;
        }
    }
    #endregion
 
    #region        
    public class DirItem
    {
        //      
        public bool IsFolder
        {
            get { return Id.StartsWith("folder"); }
        }
        //    
        public string Name;
        //foderId fileId
        public string Id;
        //      folderId
        public string ParentId;
        //      ,       
        public int Count;
        //    URL
        public string SrcUrl;
        //    ,    [folderName](count),    fileName
        public string DisplayName
        {
            get
            {
                return IsFolder && !Name.Equals("..") ?
                    string.Format("[{0}]({1})", Name, Count) : Name;
            }
        }
        public DirItem(string id, string name)
        {
            Id = id;
            Name = name;
        }
        //                
        public static DirItem Current = null;
        //      LiveConnectSession
        public static LiveConnectSession LiveSession = null;
    }
    #endregion
}

SkyDriveリストの展示を除いて、私は別のViewerを作りました.xamlは、SkyDriveのピクチャ(png,jpg)およびメディアファイル(wmv,mp 3,mp 4)を表示するために使用される.注:Windows Phoneシミュレータは一部のメディアフォーマットをサポートしていません.テスト前にMSDNファイルを見てください.その中にはThis codec is unsupported in Windows Phone Emulatorのフォーマットが明記されています.テスト前に、シミュレータで無駄な時間をかけないように認識してください.△謎の声:この注釈にはどうして強い恨みが隠されているのか.
SkyDriveからファイルをダウンロードするには、LiveConnectClient.DownloadAsyncはclient_で簡単に達成しましたDownloadCompletedイベントでbyte[]を直接取得できるので便利です.メディアファイルの部分は、私はまだストリーミング再生ができる方法を試していないので、まず採行する方法は、ダウンロード結果をIsolatedStorageFileに保存し、MediaPlayerLauncherを呼び出して再生することです.プログラムの例は次のとおりです.
レイアウト表示
じゅんもじ
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Phone.Controls;
using Microsoft.Live;
using System.Windows.Media.Imaging;
using System.IO.IsolatedStorage;
using Microsoft.Phone.Tasks;
 
namespace MiniSkyDriveExplorer
{
    public partial class Viewer : PhoneApplicationPage
    {
        public Viewer()
        {
            InitializeComponent();
        }
 
        private string[] imgExts = "png,jpg".Split(',');
        private string[] mediaExts = "wmv,mp3,mp4".Split(',');
        private LiveConnectClient client = null;
 
        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            if (DirItem.LiveSession == null || DirItem.Current == null)
                return;
            //  LiveConnectClient
            client = new LiveConnectClient(DirItem.LiveSession);
            client.DownloadCompleted += 
                new EventHandler<LiveDownloadCompletedEventArgs>(
                client_DownloadCompleted);
            //    
            ContentPanel.Children.Clear();
            //        
            DirItem di = DirItem.Current;
            ApplicationTitle.Text = di.Name;
            //          
            string ext = System.IO.Path.GetExtension(di.Name).ToLower().TrimStart('.');
            if (imgExts.Contains(ext))
                client.DownloadAsync(di.SrcUrl, new MyUserState(ApiMethod.SkyDriveGetImage));
            else if (mediaExts.Contains(ext))
            //     ,          Streaming    
            //                   
                client.DownloadAsync(di.SrcUrl,
                    new MyUserState(ApiMethod.SkyDriveGetMedia) { FileName = di.Name });
            else
                ContentPanel.Children.Add(new TextBox() { Text = "Unsupported File Type" });
        }
 
        void client_DownloadCompleted(object sender, LiveDownloadCompletedEventArgs e)
        {
            MyUserState state = e.UserState as MyUserState;
            if (state == null) return;
            switch (state.Method)
            {
                case ApiMethod.SkyDriveGetImage:
                    BitmapImage bmp = new BitmapImage();
                    bmp.SetSource(e.Result);
                    Image img = new Image();
                    img.Source = bmp;
                    ContentPanel.Children.Add(img);
                    break;
                case ApiMethod.SkyDriveGetMedia:
                    //                  
                    IsolatedStorageFileStream fs =
                        IsolatedStorageFile.GetUserStoreForApplication()
                        .CreateFile(state.FileName);
                    e.Result.CopyTo(fs);
                    fs.Close();
                    MediaPlayerLauncher mpl = new MediaPlayerLauncher()
                    {
                        Location = MediaLocationType.Data,
                        Media = new Uri(state.FileName, UriKind.Relative)
                    };
                    mpl.Show();
                    break;
            }
        }
    }
}

プログラムの実際の実行結果は、SignInButtonを押すと、画面がWindows Liveのログイン画面となり、利用者がWindows Liveアカウントを入力して承認した後:
 
プログラムはme/skydrive REST APIを介して利用者SkyDriveルートディレクトリのIdを取得し、folderId/filesを用いてそのディレクトリの下のすべてのサブプロジェクトの情報を取り戻すことができ、ListBoxで展示される.
  
画像と映画の例をチェックします.
  
简単でしょ!?みんなでWP 7 AppにSkyDriveに参加して応援しましょう!