Сложные приёмы разработки приложений для Windows Phone 8

Сервисы Live Connect: SkyDrive

Разбить на страницы
Показывать лекцию целиком

Особенности передачи файлов и ограничения

Live Connect, предварительная подготовка

Набор служб Live Connect предоставляет разработчику следующие инструменты:

  • API для взаимодействия с хранилищем данных SkyDrive, в котором можно работать с папками, и файлами, такими, как фотоснимки, видеоролики, и документы. Файлы и папки можно создавать, удалять, перемещать, отправлять в облачное хранилище с устройства и загружать на устройство из облачного хранилища. API SkyDrive, кроме того, позволяет работать с комментарии и тегами.
  • Доступ к Hotmail, который позволяет работать с контактами и календарями.
  • Работу с Windows Live Messenger, который предназначен для обмена мгновенными сообщениями.
  • Для работы с этими службами, которая подразумевает предварительную проверку подлинности пользователя, используется сервис Live. Кроме того, этот сервис предоставляет сведения о профиле пользователя. Подробности о службах Live Connect можно узнать из документации: http://msdn.microsoft.com/ru-ru/library/live/ff621314.aspx.

    Для разработки с использованием Live API следует загрузить и установить соответствующий SDK, http://msdn.microsoft.com/ru-ru/live/ff621310.aspx. Он предоставляет набор элементов управления и API, которые позволяют интегрировать приложения со службой единого входа (SSO, Single Sign On) учетных записей Microsoft (в общем случае это позволяет производить автоматическую аутентификацию пользователя в приложениях, которые поддерживают одного и того же провайдера аутентификации), работать со SkyDrive, Hotmail и Windows Live Messenger из приложений для Windows Phone и Windows 8.

    Перед началом работы над приложением нужно создать учётную запись для приложения в Центре разработчиков Live Connect (https://manage.dev.live.com/Applications/Create). Здесь нужно указать название приложения и язык, который оно использует. После регистрации приложения ему будут назначены параметры Client ID и Client secret. Первый из них, идентификатор приложения-клиента, потребуется нам в последующей работе. Кроме того, после создания нового приложения нужно указать, что это – мобильное приложение, установив переключатель Mobile client app (Мобильное клиентское приложение) на странице настроек приложения в значение Yes (Да), рис. 41.1.

    (рис 41.1) Подготовка нового приложения Live Connect

    Службы Live Connect доступны для многих платформ – как мобильных, так и настольных. Мы создаём мобильное приложение и эта настройка нужна для правильного проведения аутентификации.

    Разработка приложения

    Мы собираемся создать приложение, которое может отправлять файлы в папку, расположенную на SkyDrive и выполнять загрузку файлов. Работа со SkyDrive подразумевает различные сценарии использования. Если посмотреть, например, на приложения пакета Microsoft Office, мы увидим, что они используют SkyDrive как одно из мест хранения документов, позволяя открывать документы, которые там хранятся и сохранять их. Некоторые приложения позволяют пользователям делать резервные копии данных, некоторые позволяют открывать какие-либо файлы, предварительно записанные пользователем в SkyDrive. Если ваше приложение каким-то образом работает с некими файлами или данными пользователя, вполне оправдано будет предоставить ему доступ к SkyDrive. Это повысит удобство приложения и его ценность для пользователя.

    Создадим новый проект по шаблону Приложение Windows Phone. Перед началом работы, при условии предварительной установки Live SDK для Windows Phone, добавим в проект ссылки на сборки Microsoft.Live.Controls и Microsoft.Live.

    Добавим в состав панели элементов элемент управления SignInButton. Это очень важный элемент управления, он автоматизирует аутентификацию пользователя. Кроме того, используя интерфейс окна входа в систему, вызываемому по нажатии этой кнопки, пользователь может зарегистрировать новую учетную запись. Элемент управления выглядит как кнопка, которую можно разместить на странице приложения. Для успешной аутентификации и возможности выполнять те действия, которые мы планируем выполнить нужно настроить свойства кнопки. В частности, это следующие:

    ClientID – сюда нужно скопировать тот идентификатор клиентского приложения, который выдан при регистрации приложения, описанной выше.

    .

    Кроме того, нужно задать обработчик события SessionChandged для этой кнопки. Он используется для входа в службу и выхода из неё.

    На странице присутствуют еще две кнопки – одна из них инициирует отправку файла в SkyDrive, вторая – получение. Есть текстовое поле, куда выводится содержимое файла (мы работаем с обычным .TXT-файлом) и текстовый блок, куда выводятся сведения о том, выполнена ли аутентификация. Те же сведения можно узнать, взглянув на кнопку входа – она автоматически изменяется после входа в систему либо после выхода из неё.

    Для отправки в SkyDrive мы используем файл, который находится в пакете приложения. В нашем случае используется метод UploadAsync, который может принимать поток, получаемый при открытии данного файла. Неважно, где именно хранится файл. Весьма желательно дать пользователю возможность контролировать передачу файлов, например, в явном виде задавать, файлы какого размера может передавать и принимать приложение в текущем режиме работы. При выполнении фоновой передачи данных нужно руководствоваться рекомендациями, изложенными в материале "Фоновая передача данных для Windows Phone", http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202955%28v=vs.105%29.aspx

    На рис. 41.2. вы можете видеть экран среды разработки и начальную страницу приложения. Обратите внимание на то, что данный проект имеется в дополнительных материалах к лабораторной работе, но для того, чтобы он работал, вам понадобится использовать собственный идентификатор приложения (ClientID), выше мы говорили о том, как его получить.

    (рис 41.2) Проект приложения

    Функционал приложения реализован в файле 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("Произошла ошибка");
                }
            }
        }
    }
    

    Основным объектом, которым мы пользуемся при аутентификации и последующей работе со 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. Подготовьте отчёт о проделанной работе.

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

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

    Страницы:

    Особенности передачи файлов и ограничения

    Live Connect, предварительная подготовка

    Набор служб Live Connect предоставляет разработчику следующие инструменты:

  • API для взаимодействия с хранилищем данных SkyDrive, в котором можно работать с папками, и файлами, такими, как фотоснимки, видеоролики, и документы. Файлы и папки можно создавать, удалять, перемещать, отправлять в облачное хранилище с устройства и загружать на устройство из облачного хранилища. API SkyDrive, кроме того, позволяет работать с комментарии и тегами.
  • Доступ к Hotmail, который позволяет работать с контактами и календарями.
  • Работу с Windows Live Messenger, который предназначен для обмена мгновенными сообщениями.
  • Для работы с этими службами, которая подразумевает предварительную проверку подлинности пользователя, используется сервис Live. Кроме того, этот сервис предоставляет сведения о профиле пользователя. Подробности о службах Live Connect можно узнать из документации: http://msdn.microsoft.com/ru-ru/library/live/ff621314.aspx.

    Для разработки с использованием Live API следует загрузить и установить соответствующий SDK, http://msdn.microsoft.com/ru-ru/live/ff621310.aspx. Он предоставляет набор элементов управления и API, которые позволяют интегрировать приложения со службой единого входа (SSO, Single Sign On) учетных записей Microsoft (в общем случае это позволяет производить автоматическую аутентификацию пользователя в приложениях, которые поддерживают одного и того же провайдера аутентификации), работать со SkyDrive, Hotmail и Windows Live Messenger из приложений для Windows Phone и Windows 8.

    Перед началом работы над приложением нужно создать учётную запись для приложения в Центре разработчиков Live Connect (https://manage.dev.live.com/Applications/Create). Здесь нужно указать название приложения и язык, который оно использует. После регистрации приложения ему будут назначены параметры Client ID и Client secret. Первый из них, идентификатор приложения-клиента, потребуется нам в последующей работе. Кроме того, после создания нового приложения нужно указать, что это – мобильное приложение, установив переключатель Mobile client app (Мобильное клиентское приложение) на странице настроек приложения в значение Yes (Да), рис. 41.1.

    (рис 41.1) Подготовка нового приложения Live Connect

    Службы Live Connect доступны для многих платформ – как мобильных, так и настольных. Мы создаём мобильное приложение и эта настройка нужна для правильного проведения аутентификации.

    Разработка приложения

    Мы собираемся создать приложение, которое может отправлять файлы в папку, расположенную на SkyDrive и выполнять загрузку файлов. Работа со SkyDrive подразумевает различные сценарии использования. Если посмотреть, например, на приложения пакета Microsoft Office, мы увидим, что они используют SkyDrive как одно из мест хранения документов, позволяя открывать документы, которые там хранятся и сохранять их. Некоторые приложения позволяют пользователям делать резервные копии данных, некоторые позволяют открывать какие-либо файлы, предварительно записанные пользователем в SkyDrive. Если ваше приложение каким-то образом работает с некими файлами или данными пользователя, вполне оправдано будет предоставить ему доступ к SkyDrive. Это повысит удобство приложения и его ценность для пользователя.

    Создадим новый проект по шаблону Приложение Windows Phone. Перед началом работы, при условии предварительной установки Live SDK для Windows Phone, добавим в проект ссылки на сборки Microsoft.Live.Controls и Microsoft.Live.

    Добавим в состав панели элементов элемент управления SignInButton. Это очень важный элемент управления, он автоматизирует аутентификацию пользователя. Кроме того, используя интерфейс окна входа в систему, вызываемому по нажатии этой кнопки, пользователь может зарегистрировать новую учетную запись. Элемент управления выглядит как кнопка, которую можно разместить на странице приложения. Для успешной аутентификации и возможности выполнять те действия, которые мы планируем выполнить нужно настроить свойства кнопки. В частности, это следующие:

    ClientID – сюда нужно скопировать тот идентификатор клиентского приложения, который выдан при регистрации приложения, описанной выше.

    .

    Кроме того, нужно задать обработчик события SessionChandged для этой кнопки. Он используется для входа в службу и выхода из неё.

    На странице присутствуют еще две кнопки – одна из них инициирует отправку файла в SkyDrive, вторая – получение. Есть текстовое поле, куда выводится содержимое файла (мы работаем с обычным .TXT-файлом) и текстовый блок, куда выводятся сведения о том, выполнена ли аутентификация. Те же сведения можно узнать, взглянув на кнопку входа – она автоматически изменяется после входа в систему либо после выхода из неё.

    Для отправки в SkyDrive мы используем файл, который находится в пакете приложения. В нашем случае используется метод UploadAsync, который может принимать поток, получаемый при открытии данного файла. Неважно, где именно хранится файл. Весьма желательно дать пользователю возможность контролировать передачу файлов, например, в явном виде задавать, файлы какого размера может передавать и принимать приложение в текущем режиме работы. При выполнении фоновой передачи данных нужно руководствоваться рекомендациями, изложенными в материале "Фоновая передача данных для Windows Phone", http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202955%28v=vs.105%29.aspx

    На рис. 41.2. вы можете видеть экран среды разработки и начальную страницу приложения. Обратите внимание на то, что данный проект имеется в дополнительных материалах к лабораторной работе, но для того, чтобы он работал, вам понадобится использовать собственный идентификатор приложения (ClientID), выше мы говорили о том, как его получить.

    (рис 41.2) Проект приложения

    Функционал приложения реализован в файле 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("Произошла ошибка");
                }
            }
        }
    }
    

    Основным объектом, которым мы пользуемся при аутентификации и последующей работе со 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. Подготовьте отчёт о проделанной работе.

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

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

    Вернуться к учебному плану