Упражнение 1. Обои экрана блокировки

В этом упражнении мы модифицируем приложение ContosoCookbook так, чтобы оно могло менять фон экрана блокировки устройства, когда пользователь выберет любимый рецепт.

Задание 1. Изменение файла манифеста приложения

Сначала следует обновить файл манифеста приложения, чтобы объявить приложение поставщиком фона экрана блокировки. Только зарегистрированные поставщики могут менять фон экрана блокировки.

  1. Перейдите в папку Source\Begin в установочной папке практического занятия и откройте файл ContosoCookbook.sln в Visual Studio.
  2. Запустите приложение и просмотрите его.

    С помощью приложения ContosoCookbook пользователь может находить нужный рецепт, просматривать ингредиенты и инструкции по приготовлению. На главной странице, реализованной в файле MainPage.xaml, представлены группы рецептов различных кухонь мира. Выбрав группу, пользователь переходит на страницу подробных сведений о группе (файл GroupDetailPage.xaml). Здесь посредством элементов управления Pivot с двумя элементами PivotItemотображаются общие сведения о группе и доступных рецептах. Кроме того, дополнительные рецепты можно купить с помощью реализованных в приложении механизмов приобретения (они описаны в практическом занятии «Приобретение»).

    Когда пользователь выбирает рецепт, на его странице (файл RecipeDetailPage.xaml) отображаются подробные сведения, такие как ингредиенты и инструкции по приготовлению. На странице подробных сведений о рецепте расположена кнопка Application Bar (Панель приложений). Нажав на нее, пользователь может внести рецепт в список избранного и закрепить на начальном экране. После выполнения этого действия рецепт будет установлен в качестве фона экрана блокировки.

  3. Перейдите в Visual Studio Solution Explorer (Обозреватель решений Visual Studio) и в папке Properties (Свойства) выберите элемент WMAppManifest.xml.
  4. Щелкните правой кнопкой мыши файл WMAppManifest.xml и выберите Open with (Открыть с помощью).

    Рис. 2.
    Открытие манифеста приложения

  5. Выберите XML (text) Editor (Редактор XML (текст)) и нажмите кнопку ОК.
  6. Добавьте новый элемент <Extension (Расширение)> в раздел <Extensions (Расширения)> манифеста. Этот элемент объявляет приложение в качестве поставщика фона экрана блокировки. Если элемент <Extensions> не отображается в файле манифеста, вставьте в файл приведенный ниже код.
<Extensions> <Extension ExtensionName="LockScreen_Background" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" TaskID="_default" /> </Extensions>

Примечание. Элемент <Extensions> нужно разместить под элементом <Tokens (Маркеры)>.

Задание 2. Добавление кода для изменения фона экрана блокировки

Чтобы изменить фон экрана блокировки, приложение должно вызвать API, запрашивающий разрешение пользователя. В приложении ContosoCookbook триггером изменения фона экрана блокировки является выбор пользователем любимого рецепта и его закрепление на начальном экране.

Примечание. В приложении ContosoCookbook изменение экрана блокировки инициируется пользователем. В других приложениях может потребоваться периодическая смена фона экрана блокировки. Для этого используется агент фона. Дополнительные сведения см. в разделе «Агенты фона для Windows Phone» документации.

Функция кнопки Favorite (Избранное) на панели приложения будет модифицирована: теперь по нажатию кнопки изменится фон экрана блокировки.

Рис. 3. 
Кнопка Favorite

  1. Откройте файл RecipeDetailPage.xaml.cs.
  2. Перейдите к методу btnPinToStart_Click.
  3. Добавьте следующий код под комментарием Setup lock screen (Настройка экрана блокировки):
// Setup lock screen. if (!LockScreenManager.IsProvidedByCurrentApplication) { //If you're not the provider, this call will prompt the user for permission. //Calling RequestAccessAsync from a background agent is not allowed. await LockScreenManager.RequestAccessAsync(); } if (LockScreenManager.IsProvidedByCurrentApplication) { Uri imageUri = new Uri("ms-appx://" + item.ImagePath.LocalPath, UriKind.RelativeOrAbsolute); LockScreen.SetImageUri(imageUri); }

Код этого метода обрабатывает два разных сценария: настройка дополнительной плитки (предоставляется в оригинальном коде) и изменение фона экрана блокировки (только что добавлен).

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

Свойство LockScreenManager.IsProvidedByCurrentApplication проверяет, настроил ли пользователь данное приложение в качестве поставщика фона экрана блокировки. Если приложение не является таким поставщиком, код запрашивает доступ к экрану блокировки у пользователя с помощью метода LockScreenManager.RequestAccessAsync.

Наконец, метод LockScreen.SetImageUri меняет фон экрана блокировки.

Примечание:

Метод RequestAccessAsync следует вызывать только в том случае, если приложение не является поставщиком фона экрана блокировки. Пользователь может изменить текущего поставщика фона экрана блокировки в разделе Settings.

Задание 3. Тестирование доступа к экрану блокировки из приложения

В Visual Studio интегрирован эмулятор Windows Phone, который выводит панель мониторинга для тестирования функций экрана блокировки в приложении. В этом задании мы проверим добавленный в предыдущих заданиях код и убедимся, что приложение успешно запрашивает доступ к экрану блокировки и меняет его фон.

  1. Откройте меню Tools (Сервис) в Visual Studio.
  2. В меню Tools выберите пункт Simulation Dashboard (Панель мониторинга моделирования). Появится панель мониторинга моделирования.

    Рис. 4.
    Панель мониторинга моделирования

    На этой панели можно моделировать сценарии работы приложения в сетях с разной скоростью передачи данных и силой сигнала, блокировать и разблокировать экран, инициировать напоминания. С помощью переключателей Locked (Заблокировано) и Unlocked (Разблокировано) мы проверим поставщика фона экрана блокировки в приложении.

  3. Запустите приложение ContosoCookbook.
  4. Выберите рецепт.
  5. На панели приложения щелкните значок Favorite (Избранное) (в форме сердца).

    Рис. 5.
    Кнопка Favorite (в форме сердца) на панели приложения

  6. При появлении соответствующего запроса разрешите приложению изменить фон экрана блокировки.

    Рис. 6.
    Запрос о поставщике фона экрана блокировки

  7. Ввернитесь на панель мониторинга моделирования в Visual Studio.
  8. Щелкните переключатель Locked и вернитесь в эмулятор. Фон экрана блокировки изменен.

    Рис. 7.
    Экран блокировки с фоном из приложения Contoso Cookbook

На этом практическом занятии мы научимся изменять фон экрана блокировки из приложения, выполнив следующие действия:

  • Объявление расширения экрана блокировки в манифесте приложения.
  • Проверка настройки приложения в качестве поставщика фона экрана блокировки.
  • Запрос разрешения пользователя на изменение фона экрана блокировки.
  • Изменение фона экрана блокировки программными средствами.

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

Теперь вы сможете создавать приложение, меняющее фон экрана блокировки.

private static string FileTemplate = "/FileTypeAssociation?fileToken=";

Этот шаблон определяет, является ли URI запросом на сопоставление типов файлов.

3. Найдите метод MapUri и добавьте следующий код после оператора «tempUri = uri.ToString()»:

if (tempUri.Contains("/FileTypeAssociation")) { tempUri = HttpUtility.UrlDecode(tempUri); if (tempUri.Contains("fileToken")) { return GetFileMappedUri(tempUri); } }

Код проверяет, представляет ли данный URI запрос на сопоставление файлов, и вызывает метод GetFileMappedUri для перенаправления на соответствующую страницу приложения.

4. Добавьте метод GetFileMappedUri в класс следующим образом:

private Uri GetFileMappedUri(string uri) { string fileToken = ""; // Extract parameter values from URI. if (uri.IndexOf(FileTemplate) > -1) { int groupIdLen = uri.IndexOf("=", 0); fileToken = uri.Substring(groupIdLen + 1); } string NewURI = String.Format("/{0}?ID={1}&Command=HandleFile", TargetPageName, fileToken); return new Uri(NewURI, UriKind.Relative); }

Этот код перенаправляет запрос на страницу RecipeDetailPage.xaml, которая считывает содержимое файла и отображает рецепт.

5. Откройте файл RecipeDetailPage.xaml.cs и добавьте в начало файла следующие операторы using:
using Windows.Phone.Storage.SharedAccess; using Windows.Storage.Streams; using System.Xml.Linq;using Windows.Storage;

6. Затем найдите метод OnNavigatedTo: он вызывается, поскольку UriMapper перенаправил запрос на эту страницу. Замените оператор «string UniqueId = NavigationContext.QueryString["ID"];» следующим кодом:

string UniqueId = ""; if (NavigationContext.QueryString.ContainsKey("Command")) { string fileToken = NavigationContext.QueryString["ID"]; var filename = SharedStorageAccessManager. GetSharedFileName(fileToken); var file = await SharedStorageAccessManager. CopySharedFileAsync( ApplicationData.Current.LocalFolder, fileToken + ".rcp", NameCollisionOption.ReplaceExisting, fileToken); var content = await file.OpenAsync(FileAccessMode.Read); DataReader dr = new DataReader(content); await dr.LoadAsync((uint)content.Size); //Get XML from file content string xml = dr.ReadString((uint)content.Size); //Load XML document XDocument doc = XDocument.Parse(xml); XName attName = XName.Get("ID"); XAttribute att = doc.Root.Attribute(attName); //Get UniqueId from file UniqueId = att.Value; } else UniqueId = NavigationContext.QueryString["ID"];

В этом коде используется класс SharedStorageAccessManager из пространства имен Windows.Phone.Storage, чтобы извлекать имя файла из токена, получаемого приложением. Затем код копирует файл из общего местоположения в локальное хранилище приложения, откуда к нему может осуществляться доступ.

Примечание. Необходимо скопировать файл из общего системного расположения перед тем, как предпринимать попытку доступа к файлу, который используется системой, и запускать сопоставление файлов.

Файл копируется в локальное хранилище, затем код открывает файл и загружает его содержимое. В приложении ContosoCookbook файл рецепта — это XML-файл следующего формата:

<?xml version="1.0" encoding="utf-8" ?> <Recipe ID="1003"/>

Примечание. Формат файла и его содержимое определяются исключительно приложением. Приложение может использовать совершенно другой формат файлов. Это означает, что загружающий код после копирования файла в локальное хранилище будет отличаться от приведенного выше.

Приложение использует классы LINQ to XML (XDocument и XName) для извлечения идентификатора рецепта из XML-файла. Выполнив извлечение идентификатора, приложение продолжает работу, как в предыдущем упражнении.

Задание 3. Тестирование сопоставлений файлов

Существует три способа протестировать сопоставления файлов.

  • Отправка электронного сообщения с прикрепленным файлом. Например, если к электронному сообщению прикреплен PDF-файл, то пользователь может щелкнуть маленький логотип PDF-файла: будет инициирован поиск сопоставлений файлов в системе. Затем пользователь выбирает приложение для запуска (при наличии нескольких доступных вариантов). Если имеется только одно зарегистрированное приложение, оно запускается автоматически.

Если на устройстве нет доступных зарегистрированных приложений, ОС Windows Phone представляет стандартное системное диалоговое окно (см. изображение ниже).

Рис. 7.
Системное диалоговое окно для поиска нужного приложения

Примечание. Можно настроить учетную запись электронной почты в эмуляторе Windows Phone и получать электронные письма, однако для этого придется выполнить множество операций по настройке. Мы не будем рассматривать это в данном занятии.

  • Скачивание файла в веб-браузере. После скачивания файла в веб-браузере и щелчка логотипа (крупного размера) запускается поиск и осуществляется переход к сопоставлению файлов.


Примечание. Этот метод достаточно продвинутый и требует сложной настройки, и мы не будем подробно обсуждать его на этом практическом занятии.

  • Инициирование навигации по сопоставлениям файлов из стороннего вспомогательного приложения. В ходе данного практического занятия мы будем изучать только этот подход.

Чтобы настроить тестирование сопоставлений файлов с помощью вспомогательного приложения, выполните следующие действия:

  1. Создайте новое приложение Windows Phone.
  2. Инициировать навигацию по сопоставлениям файлов можно только в том случае, если приложение имеет файл в изолированном хранилище. Добавьте в приложение новый файл. Содержимое файла, подходящее для приложения ContosoCookbook, должно выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8" ?> <Recipe ID="1003"/>
  1. Убедитесь, что файл называется sample.rcp (или .recipe — в этом случае необходимо удостовериться, что в методе WriteFiles ниже используется новое название).

  2. Для включения файла в пакет приложений щелкните файл правой кнопкой мыши в обозревателе решений и выберите Properties (Свойства).
  3. Измените действие построения на Content (Содержимое).
  4. Добавьте кнопку для загрузки и запуска файла.
  5. Добавьте следующий код в обработчик события нажатия кнопки:
StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder; if (local != null) { await WriteFiles(); StorageFile recipeFile = await local.GetFileAsync("sample.rcp"); if (recipeFile != null) await Windows.System.Launcher.LaunchFileAsync(recipeFile); }

Этот код вызывает метод WriteFiles, который инициализирует пример файла, а затем запускает навигацию по приложениям с помощью описанного выше метода LaunchFileAsync.

7. Добавьте метод WriteFiles:
private async Task WriteFiles() { StreamReader stream = new StreamReader(TitleContainer.OpenStream("recipe.rcp")); StorageFolder local = Windows.Storage. ApplicationData.Current.LocalFolder; var file = await local.CreateFileAsync ("sample.rcp", CreationCollisionOption.ReplaceExisting); string fileAsString = stream.ReadToEnd(); byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(fileAsString); var outputStream = await file.OpenStreamForWriteAsync(); outputStream.Write(fileBytes, 0, fileBytes.Length); stream.Close(); outputStream.Close(); }

Этот метод открывает встроенный файл рецепта и копирует его в локальную папку приложения, чтобы использовать его для запуска сопоставлений файлов.

8. Запустите новое приложение, а затем нажмите кнопку. Приложение ContosoCookbook должно запуститься и отобразить рецепт.

9. На этом упражнение и практическое занятие завершено.

Краткая информация:

На этом занятии мы рассмотрели действия, которые следует выполнить для сопоставления файлов и имен схем URI в приложении Windows Phone 8.

Для этого необходимо зарегистрировать сопоставление в файле манифеста приложения, реализовать класс средства сопоставления URI для фильтрации и обработки запуска приложений, добавить возможность загрузки данных из файлов и извлечения параметров из URI.

Теперь вы научились создавать приложение, использующее сопоставления файлов и имен схем URI, чтобы обмениваться данными с другими приложениями и расширять возможности взаимодействия.

Предыдущая | Назад