Сервисы Live Connect: SkyDrive
Функционал приложения реализован в файле MainPage.xaml.cs, в Листинге 41.1 приведен его полный код.
using System; using System.Collections.Generic; using System.Windows; using Microsoft.Phone.Controls; using Microsoft.Live; using Windows.Storage; using System.IO; namespace P13_1 { public partial class MainPage : PhoneApplicationPage { private LiveConnectClient client; private LiveConnectSession session; // Конструктор public MainPage() { InitializeComponent(); } //Аутентификация private void btnSignIn_SessionChanged(object sender, Microsoft.Live.Controls.LiveConnectSessionChangedEventArgs e) { if (e.Status == LiveConnectSessionStatus.Connected) { session = e.Session; client = new LiveConnectClient(session); tbInfo.Text = "Вход выполнен."; } else { tbInfo.Text = "Вход не выполнен."; client = null; } } //Отправка файла private async void btnSendFile_Click(object sender, RoutedEventArgs e) { try { //Получаем файл из установочного пакета приложения StorageFile helloFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///HelloFile.txt")); //Открываем файл для чтения using (Stream file = await helloFile.OpenStreamForReadAsync()) { //отправляем файл await client.UploadAsync("me/skydrive/public_documents", "NewFile.txt", file, OverwriteOption.Overwrite); } MessageBox.Show("Файл отправлен"); } catch { MessageBox.Show("Произошла ошибка"); } } //Загрузка файла private async void btnReceive_Click(object sender, RoutedEventArgs e) { try { //Для идентификатора файла string fileId = ""; //получаем список файлов в папке LiveOperationResult res = await client.GetAsync("me/skydrive/public_documents/files"); //Перебираем результаты List<object> data = (List<object>)res.Result["data"]; foreach (IDictionary<string, object> content in data) { string type = (string)content["type"]; if (type != "folder") { //Если объект не является папкой, проверяем имя //Если нужное имя найдено - сохраняем идентификатор файла if ((string)content["name"] == "NewFile.txt") { fileId = (string)content["id"]; } } } //Загружаем файл LiveDownloadOperationResult res1 = await client.DownloadAsync(fileId + "/content"); StreamReader sr = new StreamReader(res1.Stream); //Выводим содержимое файла в текстовое поле txtData.Text = sr.ReadToEnd(); sr.Dispose(); } catch { MessageBox.Show("Произошла ошибка"); } } } }Листинг 41.1. Код файла MainPage.xaml.cs
Основным объектом, которым мы пользуемся при аутентификации и последующей работе со SkyDrive, является объект типа LiveConnectClient. Его методом UploadAsync мы пользуемся для отправки файла в SkyDrive. Как правило, в подобных методах используются идентификаторы файлов и папок в SkyDrive, так как такой подход универсален и позволяет работать с любыми файлами и папками. Однако, существуют и короткие имена папок, которые позволяют обращаться к ним напрямую, в частности, конструкция me/skydrive/public_documents позволяет обратиться к папке Общая пользователя (идентификатор пользователя заменяет имя me), который прошёл процедуру аутентификации. Именно так мы указываем папку при отправке файла. Мы используем здесь текстовый файл, хранящийся в пакете приложения.
При загрузке файла из SkyDrive нам, сначала, нужно получить его идентификатор. Для этого мы выполняем запрос к папке me/skydrive/public_documents, но путь выглядит как me/skydrive/public_documents/files – в противном случае сведений о файлах мы не получим. В ответ на этот запрос в объекте типа LiveOperationResult мы можем обнаружить строковое поле RawResult – оно содержит JSON-строку. Эту строку, при необходимости, можно десериализовать и работать с её данными в объектной форме. Кроме того, здесь имеется динамический словарь Result. Мы пользуемся этим словарём, перебирая его записи и, если запись не является папкой и имя (name), соответствующее записи – это NewFile.txt (именно под таким именем мы сохранили файл), мы получаем идентификатор файла для последующей работы.
При обращении к файлу с помощью метода DownloadAsync, мы добавляем к идентификатору файла (он указывается в виде строки) строку "/content". Это указывает системе на то, что мы хотим получить именно содержимое файла. В результате выполнения операции загрузки файла можно, из объекта типа LiveDownloadOperationResult, получить поток файла. С ним можно поступить так, как требует логика работы с приложением, например, сохранить в локальном хранилище данных приложения, обработать каким-то иным образом. Мы собираемся вывести текст, который хранится в файле, в текстовое поле, поэтому используем объект StreamReader для чтения содержимого потока и записи его в строку.
Выводы
В этой лабораторной работе состоялось ваше знакомство с сервисами Live Connect, и, в частности, со службой облачного хранения данных пользователей SkyDrive. Эта служба является органичной частью экосистемы Windows Phone, поэтому если работа в приложении подразумевает создание каких-либо файлов, такое приложение рекомендуется оснастить поддержкой SkyDrive. Так же, если приложение предназначено для обработки каких-либо файлов, поддержку SkyDrive можно назвать обязательной, так как пользователи вполне оправданно ожидают, что приложение позволит им работать с файлами, хранящимися в SkyDrive.
Задания
Проанализируйте сценарии работы с приложением, созданием которого вы занимаетесь. Выделите те из них, в реализации которых можно использовать SkyDrive. Подготовьте отчёт о проделанной работе.
Дополнительные материалы
К данной лекции подготовлено видеоприложение и демонстрационный программный проект.