如何使用Live Connect SDK编写Windows 8.1程序

标签: windows SkyDrive C#
发布时间: 2014/1/24 16:32:03

简介

Windows应用程序商店已经有超过五万个应用出售,并且就在我们聊天的时候,它的数量依旧在增长。同时,支持数据远程接入到多种设备的云存储技术也正在成为一项开发Win8应用程序的必备技术。在这篇文档中,我们将讨论如何从Windows Store App接入SkyDrive云。
我将带领大家走过五个步骤

1. 创建一个应用程序

2. 使用该应用登录Sky Drive

3. 在Sky Drive上创建一个文件  

4. 向Sky Drive上传文件

5. 从Sky Drive下载文件  

创建一个SkyDrive应用程序  

- 获取Windows应用商店的开发许可请点击这里

- 在Windows 8.1的电脑上配置Visual Studio 2013 

- 点击这里安装Live Connect SDK    

- 用c#语言在Visual Studio 2013上创建一个新Windows应用商店工程 

- 添加Live Connect API的引用 

 

- 把应用绑定到商店  

 

 

- 在MainPage.xaml.cs中加入live connect SDK   

//live connect SDK
using Microsoft.Live;

现在你的应用已经可以使用SkyDrive的Live Connect SDK了。 

- 向MainPage.xaml添加一个按钮 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
  <TextBox Name="infoTextBlock" HorizontalAlignment="Left" Height="29" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="1346"/>
  <Button Content="Sign In" HorizontalAlignment="Left" Margin="7,58,0,0" VerticalAlignment="Top" Width="138" Height="50" Click="Button_SignIn_Click"/>
  <Button Content="Create Folder" HorizontalAlignment="Left" Margin="7,126,0,0" VerticalAlignment="Top" Height="50" Width="138" Click="Button_CreateFolder_Click"/>
  <Button Content="Upload File" HorizontalAlignment="Left" Margin="7,197,0,0" VerticalAlignment="Top" Height="50" Width="138" Click="Button_UploadFile_Click"/>
  <Button Content="Upload Cancel" HorizontalAlignment="Left" Margin="170,197,0,0" VerticalAlignment="Top" Height="50" Width="165" Click="Button_UploadFileCancel_Click"/>
  <Button Content="Download File" HorizontalAlignment="Left" Margin="7,264,0,0" VerticalAlignment="Top" Height="50" Width="138" Click="Button_DownloadFile_Click"/>
  <Button Content="Download Cancel" HorizontalAlignment="Left" Margin="170,264,0,0" VerticalAlignment="Top" Height="50" Width="165" Click="Button_DownloadFileCancel_Click"/>
</Grid>

使用示例应用登录SkyDrive 

点击"登录"按钮来登录云
如果用户已经使用连接账号登录过了,那么,这个应用将使用当前微软账号来登录SkyDrive。当应用首次运行时,用户将获得一个允许窗体来接入SkyDrive资源。

 

 

在本实例中。我们需要"wl.signin", "wl.basic", "wl.skydrive", "wl.skydrive_update".  

//LiveConnectClient object will be used for all future transactions
private LiveConnectClient liveClient;

本应用的第一个操作应当是点击“登录”按钮来创建一个LiveConnectClient对象。这个对象将创建一个支持其他文件/文件夹接入的内置的Button_SignIn_Click方法。

private async void Button_SignIn_Click(object sender, RoutedEventArgs e)
{
    try
    {
        LiveAuthClient auth = new LiveAuthClient();
        loginResult = await auth.LoginAsync(new string[] { "wl.signin", "wl.basic", "wl.skydrive", "wl.skydrive_update"});
        liveClient = new LiveConnectClient(loginResult.Session);
        if (loginResult.Status == LiveConnectSessionStatus.Connected)
        {
            this.infoTextBlock.Text = "Signed in.";
        }
    }
    catch (LiveAuthException exception)
    {
        this.infoTextBlock.Text = "Error signing in: "
            + exception.Message;
    }
}

如果你注意到我们没有任何用户接口来接受用户名和密码,非常感谢Windows连接的账户管理了集成认证UI.

操作SkyDrive文件夹  

笼统说来,我们操作SkyDrive基于Windows Store来将用户文件/数据存储到云上。所以我们可以在云上保存这些用户数据,也可以用任何设备接入数据。这里的代码专注于在SkyDrive上创建文件。LiveConnectClient::PostAsync方法实现新建文件夹。 

private async void Button_CreateFolder_Click(object sender, RoutedEventArgs e)
{
    try
    {
        var folderData = new Dictionary<string, object>();
        folderData.Add("name", "testfolderLevel1");
        LiveOperationResult operationResult =
            await liveClient.PostAsync("me/skydrive", folderData);
        dynamic result = operationResult.Result;
        this.infoTextBlock.Text = string.Join(" ", "Created folder: ", result.name, "ID: ", result.id);
    }
    catch (LiveConnectException exception)
    {
        this.infoTextBlock.Text = "Error creating folder: " + exception.Message;
    }
}

非常感谢Live Connect SDK,它让我们只用了几行代码就创建了一个文件夹。
当你点击“登录”按钮,“新建文件夹”时。你将看到如下图所示的文件的ID

如上所述,当一个文件夹被创建时,该文件夹将被分配一个唯一标示,例如:"folder.8b922582dc2j7b71.8B922451DC2F7B71!811"。既然文件和文件夹的连接使用的是ID而不是完整路径,我写了下面的帮助类来实现用完全路径创建文件夹和子文件夹。
Create_Folder()方法的算法:

1. 用'/'把完整路径分割为数组。 

2. 用getAsync校验文件是否存在。

3. 用getAsync方法钟的"/files"来获取文件ID 

4. 重复2和3步,知道所有文件夹的名称都被存储到了数组中。  

5. 当完整路径被存储后,用postAsync方法创建文件夹。

//code
private async Task<string> Create_Folder(string sNewFoldername, string sRoot)
{
    try
    {
        string sCurrentRootID = "me/skydrive";
        bool bFolderFound = true;
        if (sRoot != "")
        {
            string[] Folderhierarchy = sRoot.Split('/');                    
            LiveOperationResult result;                    
            
            foreach (string sFolder in Folderhierarchy)
            {
                bFolderFound = false;
                result = await liveClient.GetAsync(sCurrentRootID +"/files");
                dynamic files = result.Result;
                List<object> data = (List<object>)files.data;
                bFolderFound = false;
                if (data == null)
                    break;
                foreach (dynamic item in data)
                {
                    if (item.name == sFolder)
                    {
                        sCurrentRootID = (string)item.id;
                        bFolderFound = true;
                        break;
                    }
                }
                if (bFolderFound != true )
                {
                    this.infoTextBlock.Text = "Invalid path";
                    break;
                }
            }
        }
        if(bFolderFound == true)
        {
            var folderData = new Dictionary<string, object>();
            folderData.Add("name", sNewFoldername);
            LiveOperationResult operationResult = await liveClient.PostAsync(sCurrentRootID, folderData);
            dynamic DynResult = operationResult.Result;
            this.infoTextBlock.Text = string.Join("Created folder: ", DynResult.name, "ID: ", DynResult.id);
            return (string)DynResult.id;                
        }
        return null;
    }
    catch (LiveConnectException exception)
    {
        this.infoTextBlock.Text = "Error creating folder: " + exception.Message;
        return null;
    }            
}

你可以像下面这样调用上述方法: 

Create_Folder("TestFolderLevel1", ""); 
Create_Folder("TestFolderLevel2", "TestFolderLevel1");
Create_Folder("TestFolderLevel3", "TestFolderLevel1/TestFolderLevel2");

我希望上述帮助类,可以使你操作文件夹的时候和在终端设备操作文件夹那样方便。

向SkyDrive上传文件 

现在,示例程序已经登录了。而且我们也能够创建文件夹了。下一项任务就是向新建的文件夹中上传文件。我提供了一个上传文件到SkyDrive根目录的方法。你可以写一个上传到制定目录的方法。

private async void Button_UploadFile_Click(object sender, RoutedEventArgs e)
{
    try
    {
        var picker = new Windows.Storage.Pickers.FileOpenPicker();
        picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
        picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
        picker.FileTypeFilter.Add("*");
        Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
        if (file != null)
        {
            this.ctsUpload = new System.Threading.CancellationTokenSource();                    
            await liveClient.BackgroundUploadAsync("me/skydrive",
                "TestUploadedPicture.jpg", file, OverwriteOption.Overwrite, this.ctsUpload.Token, null);
            this.infoTextBlock.Text = "Upload completed.";
        }
    }
    catch (System.Threading.Tasks.TaskCanceledException)
    {
        this.infoTextBlock.Text = "Upload cancelled.";
    }
    catch (LiveConnectException exception)
    {
        this.infoTextBlock.Text = "Error uploading file: " + exception.Message;
    }
}

上述方法包含了很多行。但是大多数的代码是关于选择一个文件来上传的。上传已经用LiveConnectClient对象中的BackgroundUploadAsync方法初始化完成了。 

private void Button_UploadFileCancel_Click(object sender, RoutedEventArgs e)
{
    if (this.ctsUpload != null)
    {
        this.ctsUpload.Cancel();
    }
}

既然大文件上传需要花费更长时间来完成。那么异步传输和单击取消按钮来取消上传也需要实现。   

从SkyDrive下载文件    

只需创建LiveConnectClient对象并调用BackgroundDownloadAsync即可下载文件。用Live Connect SDK下载文件就是这么简单。

private System.Threading.CancellationTokenSource ctsDownload;
private async void Button_DownloadFile_Click(object sender, RoutedEventArgs e)
{
    try
    {
        var picker = new Windows.Storage.Pickers.FileSavePicker();
        picker.SuggestedFileName = "TestDownloadedPicutre.jpg";
        picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Downloads;
        picker.FileTypeChoices.Add("Picture", new List<string>(new string[] { ".jpg" }));
        StorageFile file = await picker.PickSaveFileAsync();
        if (file != null)
        {
            this.ctsDownload = new System.Threading.CancellationTokenSource();              
            await liveClient.BackgroundDownloadAsync("<file id to download>", file,
                this.ctsDownload.Token, null);
            this.infoTextBlock.Text = "Download completed.";
        }
    }
    catch (System.Threading.Tasks.TaskCanceledException)
    {
        this.infoTextBlock.Text = "Download cancelled.";
    }
    catch (LiveConnectException exception)
    {
        this.infoTextBlock.Text = "Error getting file contents: " + exception.Message;
    }
}

和上传文件一样,下载文件也依赖于网速。因此,下载的进程会花费较长时间。同时,应用还要响应用户的操作。所以,我们调用了BackgroundDownlodAsync方法并且提供了下面的句柄。  

private void Button_DownloadFileCancel_Click(object sender, RoutedEventArgs e)
{
    if (this.ctsDownload != null)
    {
        this.ctsDownload.Cancel();
    }
}

注意: 下载文件的结尾需要以"/content"来结束。   

BackgroundDownloadAsync("file.8c8ce076ca27823f.8C8CE076CA27823F!129/content", file,ctsDownload.Token, null);

如果没有以"/content"作结尾,那么可能只会下载文件的缩略图。


总结

我已经将MainPage.xaml.cs 和 MainPage.xaml写进了这篇文章。你可以自己建立一个工程。之后替换掉上述的文件就可以获得一个可以运行的实例了。使用Live Connect SDK可以简化我们的操作。但是还有很多其他的方法来实现SkyDrive文件的操作,详见这里。感谢你花费时间来阅读这篇文章。您的支持是我最大的动力。


赞助商