Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 468 / 15 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 13:

Сервисы 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. Подготовьте отчёт о проделанной работе.

Дополнительные материалы

К данной лекции подготовлено видеоприложение и демонстрационный программный проект.