Если вы пропустили это, я запускаю серию, в которой рассказывается, как создать приложение, которое синхронизирует контент с ваших устройств Windows Phone напрямую в SkyDrive. Есть два предыдущих взноса:
- SkyDrive Sync на Windows Phone — базовый комплект
- SkyDrive Sync на Windows Phone — Добавление локального контента
Сегодня я собираюсь поговорить о следующей теме на линии — как обрабатывать контент из внешнего хранилища.
Очевидно, что внешнее хранилище не то, что применимо к каждому устройству Windows Phone 8. Хотя API поддерживает это, не все устройства поддерживают. В целях тестирования я использую устройство Nokia Lumia 825 с картой памяти microSD 16 ГБ. Он наполнен произвольным контентом — изображениями, текстовыми файлами, парой электронных книг и видео.
Здесь начинается интересная часть — есть несколько вещей, о которых вы должны знать заранее:
- На этом этапе вы не можете записывать контент во внешнее хранилище. Это сделано специально, и вы не можете обойти это ограничение через общедоступный SDK / API.
- Вы не можете получить доступ к встроенным мультимедийным папкам. Это тоже по замыслу. Если вы видите папки, содержащие изображения, музыку или видео, которые не были созданы вами — вы не сможете получить к ним доступ через API. С другой стороны, картинки и скриншоты будут по-прежнему доступны через стандартную PhotoChooserTask .
- Вы можете читать только те файлы, расширение которых связано с вашим приложением. То есть вы должны указать в манифесте приложения, какие расширения файлов вы хотите обработать.
- Некоторые расширения, которые вы можете захотеть зарегистрировать, уже зарезервированы ОС. Это означает, что вы не можете читать файлы DOCX, XLSX, MP3 или JPEG, поскольку вы не можете напрямую связать их с вашим приложением. Для более полного списка, пожалуйста, прочитайте эту статью MSDN .
Давайте код.
Прежде всего, давайте погрузимся в файл WMAppManifest.xml, чтобы убедиться, что мы объявляем некоторые примеры расширений файлов. А теперь давайте связать PDF, RAR и MPG с приложением синхронизации. Для этого я собираюсь добавить узел FileTypeAssociation в контексте расширений :
<FileTypeAssociation Name="SyncFiles" NavUriFragment="fileToken=%s" TaskID="_default"> <Logos> <Logo Size="small" IsRelative="true">Assets/fileIcon.png</Logo> <Logo Size="medium" IsRelative="true">Assets/fileIcon_69x69.png</Logo> <Logo Size="large" IsRelative="true">Assets/fileIcon_176x176.png</Logo> </Logos> <SupportedFileTypes> <FileType>.pdf</FileType> <FileType>.rar</FileType> <FileType>.mpg</FileType> </SupportedFileTypes> </FileTypeAssociation>
ПРИМЕЧАНИЕ . Узел Extensions следует размещать сразу после токена .
Обычно у вас будут отдельные узлы ассоциации файлов, созданные для каждого из типов, которые вы хотите обработать. Однако в этом случае (для демонстрационных целей) мы будем использовать одну ассоциацию типов файлов с несколькими различными расширениями.
Также смело меняйте расположение значков файлов. Подробнее об использовании файловых ассоциаций в Windows Phone вы можете прочитать здесь .
Теперь поговорим о способах фактического выбора контента с внешнего устройства хранения. Для этого я создал пользовательский элемент управления, называемый FileExplorer . Это универсальное решение для выбора файлов, позволяющее просматривать файловую систему как в изолированном, так и во внешнем хранилище. Вы можете скачать его, получив экспериментальную ветку Coding4Fun Toolkit .
ПРИМЕЧАНИЕ. Убедитесь, чтов качестве необходимой возможности выбран ID_CAP_REMOVABLE_STORAGE . В противном случае будет выдано исключение UnauthorizedAccessException.
Возвращаясь к подсказке, где нам нужно было выбрать цель хранения, теперь вы можете использовать элемент управления FileExplorer:
else if (returnButton == 1) { // The user decided to use the external storage. Dispatcher.BeginInvoke(() => { FileExplorer explorer = new FileExplorer(); explorer.SelectionMode = SelectionMode.File; explorer.StorageTarget = StorageTarget.ExternalStorage; explorer.OnDismiss += explorer_OnDismiss; explorer.Show(); }); }
Когда элемент управления FileExplorer отклоняется, экземпляр ExternalStorageFile возвращается в контексте обработчика события OnDismiss.
После вызова обработчика OnDismiss я получаю имя и путь к файлу в качестве эталонного токена:
void explorer_OnDismiss(StorageTarget target, object file) { var reference = new FileReference(); reference.FileType = FileType.ExternalStorage; reference.Name = ((ExternalStorageFile)file).Name; reference.Token = ((ExternalStorageFile)file).Path; FileReferences.Add(reference); }
Ссылка позже добавляется в коллекцию FileReferences, после чего она отображается в ListBox.
Поздравляем, теперь вы можете обрабатывать внешние файлы, которые впоследствии будут переданы в SkyDrive. Поскольку мы предполагаем, что SD-карта всегда подключена, нет необходимости передавать содержимое в изолированное хранилище как временные элементы.