Объявления в манифесте
Контакты
Последний контракт, который мы рассмотрим в этой лекции (ух ты!), это средство выбора контактов. Мы еще не видели этого средства в действии в Windows 8. Поэтому посмотрим на него для начала, а потом разберемся, как это средство используется с одной стороны контракта, и как приложение-поставщик удовлетворяет нужды другой стороны.
Контакт, или контактные сведения, как вы, вероятно, ожидаете, это информация о человеке, которая включает в себя подробности наподобие имени, номера телефона, адреса электронной почты и так далее. Очевидное место, где вам понадобится контакт – это составление электронного письма, как показано на рис. 3.8. Здесь, при прикосновении к элементу управления "+" в правой части полей To (Кому) и Cc (Копия), будет открыто средство выбора контактов, которое по умолчанию относится к приложению Peoples (Люди) Windows 8, как показано на рис. 3.9. (экран-заставка), и на рис. 3.10 (вид в режиме множественного выбора, где я размыл сведения о моих друзьях, и они не станут обвинять меня за привлечение к ним нежелательного внимания!). Как мы видели с интерфейсом средства выбора файлов, приложение-поставщик поддерживает пользовательский интерфейс для центральной части экрана, в то время как Windows поддерживает верхнюю и нижнюю части, заголовок и элемент меню в виде стрелки, направленной вниз, используя информацию из манифеста приложения-поставщика (обратиесь к рис. 3.3). На рис. 3.11. вы можете видеть внешний вид приложения из примера "Приложение для выбора контактов" (http://code.msdn.microsoft.com/windowsapps/Contact-Picker-App-sample-fc6677a1 ) в режиме поставщика, так же как и меню, которое позволяет вам выбирать разных поставщиков (те приложения, которые объявили себя в качестве поставщиков контактов)
Когда я выбираю один или большее количество контактов в любом приложении-поставщике и нажимаю на кнопку Select (Выбрать) в нижней части экрана, эти контакты поступают в первое приложение, в данном случае это Mail (Почта).
Так же, как контракт средства выбора файлов позволяет перемещаться по данным, представленным в виде файлов другим приложением, контракт контактов (скажите это быстро раз десять!) позволяет пользователю просто перемещаться по сведениям о людях, которые вы можете выбирать из любого другого источника.
Рис. 3.10. Пользовательский интерфейс выбора внутри приложения Peoples (Люди), показанный при множественном выделении (сведения о моих друзьях здесь размыты, так как они обычно не ищут славы среди разработчиков). Выделенные объекты собраны в нижней части, в корзине элементов
Рис. 3.11. Пользовательский интерфейс примера выбора контактов, когда приложение используется в качестве поставщика, вместе со всплывающим меню в заголовке, которое позволяет выбирать поставщика
Использование средства выбора контактов
Контакты, в целом, используют API в пространстве имен Windows.ApplicationModel.Contacts. Приложение, принимающее контакты, воспринимает каждый из них представленным в виде экземпляра класса ContactInformation (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.contacts.contactinformation.aspx ), свойства которого, такие как name, phoneNumbers, locations, emails, instantMessages, и customFields, вместе с методами getThumbnailAsync и queryCustomFields, предоставляют вам контактную информацию. Выбор контакта осуществляется через интерфейс средства выбора контактов, который очень похож на интерфейс средства выбора файла. Интерфейс запускается с помощью Windows.ApplicationModel.Contacts.ContactPicker (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.contacts.contactpicker.aspx ). После создания экземпляра данного объекта, вы можете установить подпись commitButtonText для первой (левой) кнопки в интерфейсе (как "Select" (Выбор) на предыдущих рисунках). Так же вы можете установить свойство selectionMode в одно из значений перечисления ContactSelectionMode: либо в contact (по умолчанию) либо в fields. В первом случае, возвращается полная контактная информация, в последнем, средство выбора работает с содежимым свойства desiredFields ( http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.contacts.contactpicker.desiredfields.aspx). Обратитесь к документации по данному свойству для того, чтобы узнать подробности.
Когда вы готовы к показу интерфейса, вызовите метод средства выбора контактов pickSingleContactAsync или pickMultipleContactsAsync. Они предоставляют вам обработчик завершения для одного объекта ContactInformation или для вектора из них, соответственно. Как и в случае со средством выбора файлов, обратите внимание на то, что эти API выдают исключения, если вызываются, когда приложение находится в прикрепленном режиме просмотра, очевидно, вы постараетесь избежать подобной ситуации.
Выбор и отображение отдельного контакта показан в Сценарии 1 примера "Приложение для выбора контактов" ( http://code.msdn.microsoft.com/windowsapps/Contact-Picker-App-sample-fc6677a1):
var picker = new Windows.ApplicationModel.Contacts.ContactPicker(); picker.commitButtonText = "Select"; // Открывает для пользователя средство выбор контакта picker.pickSingleContactAsync().done(function (contact) { if (contact !== null) { // Получает информацию о контакте... } });
Выбор нескольких контактов (Сценарий 2, js/scenarioMultiple.js) работает похожим образом, лишь использует pickMultipleContactsAsync. В любом случае, вызывающее приложение затем применяет данные ContactInformation так, как ему нужно, например, заполняет поля To (Кому) и Cc (Копия) в приложении Mail (Почта). Однако, свойства этого объекта, помимо name, которое является обычной строкой, обладают некоторой структурой, как показано в следующей таблице.
Свойство | Тип | Свойства и типы полей |
---|---|---|
emails phoneNumbers | Вектор ContactField | category (ContactFieldCategory), name (строка), type (типа ContactFieldType), value (строка) |
instantMessages | Вектор ContactInstantMessageField | То же самое, что и ContactField выше, плюс - displayText, launchUri,service, и userName (все имеют строковой тип) |
locations | Вектор ContactLocationField | То же, что и ContactField выше, плюс city, country, postalCode, region, street, и unstructuredAddress (все имеют строковой тип) |
Таким образом, пример принимает объект ContactInformation следующим образом, сначала извлекая индивидуальные свойства вектора:
appendFields("Emails:", contact.emails, contactElement); appendFields("Phone Numbers:", contact.phoneNumbers, contactElement); appendFields("Addresses:", contact.locations, contactElement);
И затем перечисляя содержимое этих векторов и в этом случае создавая элементы с их содержимым. Другие приложения, конечно, будут перемещать значения в подходящие поля или в другие части интерфейса приложения, то, что показано здесь, демонстрирует обработку различных категорий:
function appendFields(title, fields, container) { // Создаёт интерфейс для списка полей контактатого же типа, например, для // адресов электронной почты или телефонов fields.forEach(function (field) { if (field.value) { // Присоединяет title только если имеется не пустое поле контакта if (title) { container.appendChild(createTextElement("h4", title)); title = ""; } // Отображает категорию около значения поля switch (field.category) { case Windows.ApplicationModel.Contacts.ContactFieldCategory.home: container.appendChild(createTextElement("div", field.value + " (home)")); break; case Windows.ApplicationModel.Contacts.ContactFieldCategory.work: container.appendChild(createTextElement("div", field.value + " (work)")); break; case Windows.ApplicationModel.Contacts.ContactFieldCategory.mobile: container.appendChild(createTextElement("div", field.value + " (mobile)")); break; case Windows.ApplicationModel.Contacts.ContactFieldCategory.other: container.appendChild(createTextElement("div", field.value + " (other)")); break; case Windows.ApplicationModel.Contacts.ContactFieldCategory.none: default: container.appendChild(createTextElement("div", field.value)); break; } } }); }