Windows Phone 8 - 使用 SkyDrive API 处理 SkyDrive 文件的简单辅助类






4.64/5 (10投票s)
如何使用 SkyDrive 上传、下载和同步应用程序文件
目录
- 引言
- 演示应用程序
- 在 Windows Phone 8 项目中使用 SkyDrive API 的基本概念
- 设置开发环境和使用辅助类的项目
- 使用
SkyDriveFileHandler
类 - 结论
引言
移动开发中的一项常见任务是在用户设备之间共享应用程序文件或将文件存储在设备外部。有许多云服务,如 Microsoft SkyDrive、DropBox、Google Drive 等,允许开发人员使用其 API 来实现这些目的。您可以考虑在应用程序中使用各种云服务,并让用户选择一个来存储和同步应用程序文件。这种方法有利有弊。我认为,如果您创建跨多个平台的应用程序(例如 Android、Windows Phone、iOS...),则绝对应该为它使用多个服务 - 用户可能拥有其中一个的服务账户,而没有其他服务的账户。在这种情况下,我们可能应该允许他使用他已有的账户,而不是让他注册一个新的账户,尽管现在我们需要支持更大的代码库。
但让我们看看 Windows Phone 平台的情况。Microsoft 有自己的云存储服务 - Microsoft SkyDrive。每个 Windows Phone 用户无需为该服务注册新账户,因为他/她已经有一个了!
您可以在 MSDN 上找到有关如何在项目中使用 SkyDrive
API 的文档。也就是说,将与 SkyDrive
的交互集成到 Windows Phone 应用程序中可能相当棘手。因此,我创建了一个简单的辅助类 - SkyDriveFileHandler
,用于通过 SkyDrive 服务处理文件(上传、下载和同步)。
在本文中,我将解释如何在应用程序中使用它以及使用 SkyDrive API 的一些基本概念。
演示应用程序
我创建了一个简单的演示应用程序,展示了如何在实际项目中使用的 SkyDriveFileHandler
。您可以通过上面的链接下载它。该应用程序包含三个按钮,它们具有用于异步上传、下载和同步文件的事件处理程序。
如果操作成功完成,它将显示一个 MessageBox
,其中包含“一切顺利”的文本。如果用户未登录 Microsoft 账户,它将显示账户的登录表单。
在 Windows Phone 8 项目中使用 SkyDrive API 的基本概念
SkyDrive API 为开发人员提供了使用用户 SkyDrive 账户处理文件、文件夹、相册、照片等的选项。为了在您的应用程序中使用它,您需要
- 在 Live Connect Developer Center 中注册您的应用,并获取您应用的唯一 ID
- 下载 LiveSDK 并将其引用添加到您的项目中
- 创建
LiveConnectClient
类的实例,并使用其方法与 SkyDrive 服务通信
当然,您应该有一个已配置的手机模拟器,该模拟器具有已建立的互联网连接,用于调试目的。
设置开发环境和使用辅助类的项目
请按照以下步骤设置您的项目
- 创建一个新的 Windows Phone 8 项目
- 添加对 Microsoft.Live.dll 和 Microsoft.Live.Controls.dll 的引用。这些库提供了一组组件和方法,用于使用
SkyDrive
API 与 SkyDrive 服务通信。在 Visual Studio 中,您可以使用 **NuGet 包管理器** 来获取包含这些库的 **Live SDK** 包。 - 将
SkyDriveFileHandler
类添加到您的项目中。 - 我强烈建议下载 Windows Phone Power Tools ,它允许您使用 GUI 浏览手机或手机模拟器的
IsolatedStorage
,而不是必须通过命令行逐个浏览IsolatedStorage
文件。您可以观察应用程序文件在IsolatedStorage
中的位置及其属性,以确定文件何时已与SkyDrive
正确同步。 - 为了能够使用 **LiveSDK**,您必须在 Live Connect Developer Center 中注册您的应用并获取
ClientID
。在创建辅助类实例以连接到 SkyDrive 时,您将使用它。
使用 SkyDriveFileHandler 类
首先,不要忘记添加对 Microsoft SkyDrive API 的引用
using Microsoft.Live;
using Microsoft.Live.Controls;
然后,您应该定义一个会话变量或属性,用于与 SkyDrive 交互。我倾向于在 App.xaml.cs 中进行设置,以便在应用程序的任何地方都可以访问。
//App.xaml.cs
public static LiveConnectSession LiveSession { get; set; }
创建会话变量后,让我们在手机页面上创建一个辅助类对象
private SkyDriveFileHandler skydrive;
有一件非常重要的事情您应该知道 - 只有当应用程序页面完全加载后,您才能创建 SkyDriveFileHandler
的实例。不要尝试在页面构造函数中初始化它!相反,您可以在“页面加载”事件处理程序或任何其他 GUI 元素(如按钮等)的事件处理程序中执行此操作。类的构造函数需要指定一个文件夹的名称,该文件夹将包含应用程序的文件作为第三个参数(在我们的例子中是“skydrivetestapp”)。
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
//WARNING! Third parameter is YOUR application ID, which you get after registering
//your app in SkyDrive
skydrive = new SkyDriveFileHandler(App.LiveSession,
"your_application_id", "skydrivetestapp");
}
使用辅助类非常简单。该类有三个 public
成员
public async Task<OperationStatus> UploadFile(string fileName);
public async Task<OperationStatus> DownloadFile(string fileName);
public async Task<OperationStatus> SynchronizeFile(string fileName);
我认为它们的作用很明显。UploadFile
获取文件的名称,并尝试在 IsolatedStorage
中找到它,然后将其上传到具有相同名称的 SkyDrive 文件夹。DownloadFile
异步从 SkyDrive
下载文件并将其保存在 IsolatedStorage
中。
SynchronizeFile
尝试在本地存储和 SkyDrive 文件夹中查找给定文件名的文件。然后,它会比较两个文件的最后修改日期,并将旧文件替换为较新的文件。如果未在 IsolatedStorage
中找到文件,则该方法会从 SkyDrive 下载它,反之亦然 - 如果文件存在于 IsolatedStorage
中但在 SkyDrive 文件夹中不存在,则该方法会将其上传到 SkyDrive。
这些方法返回一个 OperationStatus
enum
类型的变量。您可以检查它以了解操作是否已成功完成。所以,让我们看看如何在您的应用程序中使用这些方法
private async void btnUpload_Click(object sender, RoutedEventArgs e)
{
if (await skydrive.UploadFile(fileName) == OperationStatus.Completed)
MessageBox.Show("The file has been uploaded!");
}
private async void SynchronizeBtn_Click(object sender, RoutedEventArgs e)
{
if (await skydrive.SynchronizeFile(fileName) == OperationStatus.Completed)
MessageBox.Show("The file has been synchronized successfully!");
}
private async void DownloadBtn_Click(object sender, RoutedEventArgs e)
{
if (await skydrive.DownloadFile(fileName) == OperationStatus.Completed)
MessageBox.Show("The file has been downloaded to IsolatedStorage!");
}
不要忘记将您的方法标记为“async” - 所有方法都在后台异步工作,以避免阻塞应用程序用户界面。
结论
您可以“按原样”使用 SkyDriveFileHandler
类,也可以自己修改它。实际上,它目前只是一个相当粗略的草图。例如,您可以添加您需要的其他方法,并修改当前方法以更好地控制异常处理、检查 IsolatedStorage
中的可用空间等。至于我,我以后会创建一个用于处理 SkyDrive 的类库。
感谢您的关注!