Блог Сергея Байдачного

Мой блог о технологиях

Archive for Ноябрь 16th, 2011

WP 7.5: Расширение Pictures Hub

with one comment

 

Продолжу тему, связанную с расширениями функциональности встроенных в WP 7 приложений. В прошлой статье мы говорили о расширении функциональности поиска, а в этой поговорим и расширении стандартного приложения по работе с изображениями – Pictures Hub.

Итак, начнем с того, что можно расширять. Тут существуют три возможности:

1). Расширение списка приложений на вкладке Apps, которая доступна при загрузке Pictures Hub.

 

image

 

Данная вкладка появляется только тогда, когда у Вас есть хотя бы одно приложение (установленное, в отличие от поиска), декларирующее поддержку фото-приложения. Если таких приложений не установлено, то и вкладки нет.

При расширении основного приложения Pictures Hub нет никаких специальных возможностей, лишь вызов приложения, которое якобы должно уметь работать с изображениями.

2, 3). Следующая возможность появляется уже на уровне работы с конкретной фотографией и позволяет Вашему приложению получить доступ к самой фотографии из меню Application Bar приложения Picture Viewer, вызываемого из Pictures Hub для просмотра отдельной фотографии.

 

image

 

Как видно, при работе с отдельной фотографией доступны такие пункты меню, как apps… и share….

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

Второй – использовать одно из приложений из списка, чтобы передать изображение по сети какой-либо веб-службе (например, опубликовать в facebook). Тут также можно получить идентификатор изображения, которое потом загрузить внутри приложения.

Давайте рассмотрим, как эти механизмы реализуются на практике.

На первом этапе необходимо в WMAppManifest.xml описать расширения. Для каждого из трех перечисленных случаев существует свое расширение. Ниже приведены примеры декларации поддержки всех трех расширений:

 

   1:  <Extensions>
   2:     <Extension ExtensionName="Photos_Extra_Viewer" 
             ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
   3:     <Extension ExtensionName="Photos_Extra_Hub" 
             ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
   4:     <Extension ExtensionName="Photos_Extra_Share" 
             ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
   5:  </Extensions>

 

При работе с расширениями нет ничего нового по сравнению с расширением поисковой функциональности. В элементе Extension прописывается фиксированный (характерный для расширения приложения по работе с изображениями) ConsumerID, имя расширения позволяет указать, какую часть приложения мы будем расширять, а TaskID ссылается на запись в разделе Tasks.

Если Вы планируете расширять Puctures Hub (основное его окно), то кода выше полностью достаточно. Ведь приложение просто вызывается из галереи, не получая специальных параметров.

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

 

   1:  IDictionary<string, string> queryStrings = 
   2:     this.NavigationContext.QueryString;
   3:   
   4:  if (queryStrings.ContainsKey("token"))
   5:  {
   6:     MediaLibrary library = new MediaLibrary();
   7:   
   8:     Picture picture = 
   9:        library.GetPictureFromToken(queryStrings["token"]);
  10:   
  11:     BitmapImage bitmap = new BitmapImage();
  12:     bitmap.CreateOptions = BitmapCreateOptions.None;
  13:     bitmap.SetSource(picture.GetImage());
  14:     WriteableBitmap picLibraryImage = new WriteableBitmap(bitmap);
  15:     . . . . .
  16:  }
  17:   

 

В данном коде мы обрабатываем ключ token, который присутствует, если мы расширяем пункт apps… В случае с share… пунктом следует обрабатывать ключ FileId.

Таким образом, расширить Pictures Hub – простая задача. Проблема только в отсутствии возможности протестировать все это на эмуляторе, так как в последнем Pictures Hub не активирован.

Written by Sergiy Baydachnyy

16.11.2011 at 15:04

Опубликовано в Windows Phone

Tagged with

WP 7.5: Расширение функциональности поиска

leave a comment »

 

Первая функциональность, с которой мне захотелось познакомиться в Windows Phone 7.5 – расширение возможностей стандартного поиска, результатами, которыми обладает Ваше собственное приложение. Решил это сделать, увидев подобную функциональность в Windows 8, ожидая увидеть что-то аналогичное. Скажу сразу, реализация в Windows Phone 7.5 меня разочаровала. Несмотря на это, механизм существует, поэтому я решил описать его возможности.

Начнем с того, что стандартный поиск в Bing теперь интегрирован с Windows Phone Marketplace. Иными словами, если пользователь выполняет поиск и вводит запрос, соответствующий названию приложения из Marketplace (или похожим критериям), то ссылка на приложение выдается в топе результатов поиска. При этом пользователь может установить приложение, используя результаты поиска, или запустить его на устройстве, если оно уже установлено. Ниже небольшой пример, который легко воспроизвести и в эмуляторе:

 

image

 

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

string searchTerms = NavigationContext.QueryString["bing_query"];

Естественно, данные нужно выбирать на основной странице приложения сразу же после его загрузки. Другой вопрос, что с ними делать. По крайней мере информацию о том, что Ваше приложение кто-то устанавливает через поисковый запрос – Вы получите.

Если Вы все же решили попробовать получать запрос из Bing, положившись на Вашу удачу, то можете попробовать протестировать поведение приложения, эмулируя его запуск с поисковым запросом. Для этого в WMAppManifest.xml достаточно прописать следующий код, заменив элемент DefaultTask на следующий:

<DefaultTask Name ="_default" NavigationPage="MainPage.xaml?bing_query=Пятнашки"/>

В этом случае, приложение получит параметры и сможет обработать их так, будто бы запущено из окна поиска Bing.

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

Возможность базируется на так называемых «Быстрых карточках». Так, обратите внимание на изображение ниже:

 

image

 

Тут, перед результатами поиска из Web (и после ссылки на приложение в Marketplace) появляется специальный раздел Products. Его появление объясняется тем, что Bing нашел несколько продуктов, соответствующих нашему запросу. Нажав на один из представленных продуктов, мы можем перейти к его описанию, состоящему из нескольких вкладок (это и есть быстрая карточка продукта):

 

image

 

Тут Вы сможете увидеть несколько вкладок, включая обзоры, цены и, самое интересное, список приложений:

 

image

 

Причем, обратите внимание, в списке приложений есть и те, которые уже установлены, а также те, которые можно загрузить. Идея состоит в том, чтобы пользователю показать именно те приложения, которые помогут ему работать с «Быстрыми карточками». Иными словами, если продукт продается на eBay, то пользователю было бы здорово загрузить приложение-клиент для eBay (кстати, он есть в списке) или выбрать приложение другого магазина.

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

1). Необходимо понимать, что существует всего (пока) три типа таких карточек: Продукты, Местоположения (отображающиеся на вкладке Local) и Фильмы (которые демонстрируются в кинотеатрах, недалеко от Вашего местоположения).

2). Каждый тип карточки поддерживает несколько расширений (категорий). Иными словами, если пользователь ищет новый лаптоп, а Вы продаете ювелирные украшения, то не имеет смысла показывать пользователю Ваше приложение. Список доступных расширений можно посмотреть тут: http://msdn.microsoft.com/en-us/library/hh202958(v=VS.92).aspx.

3). Чтобы приложение попало в список, ассоциированный с одной из карточек (в одну или несколько категорий), достаточно прописать набор параметров в его манифесте и обработать (хотя и не обязательно) возможный поисковый запрос. Как только Вы это делаете, то пользователь получает возможность видеть и Ваше приложение.

Давайте рассмотрим детальную реализацию третьего пункта.

Начнем с изменения WMAppManifest.xml, где в раздел App (в самый конец) записывают следующий блок:

 

   1:  <Extensions>
   2:     <Extension ExtensionName="Bing_Products_Arts_and_Crafts"
   3:        ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
   4:        TaskID="_default" ExtraFile="Extensions\\Extras.xml" />
   5:        . . . . .
   6:  <Extensions>

 

Тут основным атрибутом является ExtensionName, описывающим с помощью элементов Extention категории, в ответ на которые Ваше приложение будет появляться в списке. Атрибут CunsumerID Вы просто копируете с его значением, так как значение этого атрибута является стандартным для данного типа расширений. Атрибут TaskID указывает на ту задачу, которая будет выполняться при запуске приложения (обычно это _default – запуск MainPage.xaml), наконец ExtraFile указывает путь к файлу, где записываются дополнительные детали к расширению (обычно он один для всех расширений).

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

 

   1:  <ExtrasInfo>
   2:    <AppTitle>
   3:       <default>Quick Card Sample</default>
   4:    </AppTitle>
   5:   
   6:    <Consumer ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}">
   7:       <ExtensionInfo>
   8:          <Extensions>
   9:            <ExtensionName>Bing_Products_Arts_and_Crafts</ExtensionName>
  10:            <ExtensionName>Bing_Products_Baby_and_Nursery</ExtensionName>
  11:          </Extensions>
  12:   
  13:          <CaptionString>
  14:            <default>Product URI Details</default>
  15:            <fr-FR> . . . </fr-FR>
  16:          </CaptionString>
  17:   
  18:       </ExtensionInfo>
  19:   
  20:       . . . . .
  21:   
  22:     </Consumer>
  23:  </ExtrasInfo>

 

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

Последнее, что необходимо сделать, это обработать запрос, который отправляется Вашему приложению из Bing. Проблема в том, что несмотря на явное использование TaskID, Bing перенаправляет запрос приложению в следующем виде:

app://<AppID>/_default#/SearchExtras?ProductName=<product_name>&Category=<extension_names>

Тут параметры могут меняться, в зависимости от типа Быстрой карточки.

Так вот, чтобы это работало, нужно настроить mapping внутри Вашего приложения. Это можно сделать, прописав в ресурсах объекта App вот такой код (при этом запрос перенаправляется на другую страницу приложения):

 

   1:  <Application.Resources>
   2:     <nav:UriMapper x:Key="UriMapper">
   3:        <nav:UriMapper.UriMappings>
   4:           <nav:UriMapping Uri="/SearchExtras" MappedUri="/ItemPage.xaml"/>
   5:        </nav:UriMapper.UriMappings>
   6:     </nav:UriMapper>
   7:  </Application.Resources>

 

Далее, подключаем данный mapping внутри App.xaml.cs, при загрузке приложения:

RootFrame.UriMapper = Resources["UriMapper"] as UriMapper;

Вот и все. Теперь обрабатываем параметры запроса с помощью QueryString и реализуем нужную нам бизнес-логику.

Таким образом, добавить Ваше приложение в список, ассоциированный с одной или несколькими категориями в Быстрых карточках не так и сложно. Другое дело, что пользователю весьма нетривиально попасть на предлагаемый список, чтобы увидеть Ваше приложение. И самое интересное (возможно, с этого стоило начать), быстрые карточки работаю пока не везде. Точнее работают они всего в 4-х странах: США, Франция, Австралия и Англия. Причем в последних трех, работают только Продукты. Проверить работу карточек Вы можете, установив Browser&Search language в язык, соответствующей одной из стран.

Written by Sergiy Baydachnyy

16.11.2011 at 11:46

Опубликовано в Windows Phone

Tagged with