Одним из самых больших ограничений для разработчиков Windows Phone была невозможность обмена данными между приложениями. Это не ограничивалось сторонними приложениями, но и типы файлов, которые поддерживаются нативными приложениями (просто подумайте о файлах Office), нельзя было открыть напрямую: обходной путь состоял в том, чтобы открыть файл с помощью браузера, таким образом, если файл Тип был поддержан ОС, он был открыт с правильным приложением. Самая большая проблема этого обходного пути заключается в том, что он работал только в том случае, если файл был доступен онлайн: он не работал с файлами, которые хранились в изолированном хранилище.
С огромными аплодисментами мы приветствуем протокол и сопоставление файлов в Windows Phone 8, функции, которая идет непосредственно из Windows 8 и позволяет вашему приложению регистрироваться для определенного протокола или расширения файла; таким образом, другие приложения могут просто запустить запрос на открытие определенного файла или URL-адреса, и ОС позаботится о перенаправлении операции в одно из доступных приложений, зарегистрированных для этого типа файлов.
Существует два способа обмена данными: путем регистрации ассоциации файлов и протокола . Первая функция позволяет приложению регистрироваться для определенного расширения файла (например, log ): когда кто-то пытается открыть файл с таким расширением, файл передается приложению и копируется в его локальное хранилище, чтобы он мог взаимодействовать с ним. Второй, о котором мы расскажем в другом сообщении в блоге, может быть использован для регистрации определенного протокола (например, log: / ), чтобы приложение могло отправлять текстовые данные в другое приложение, просто вызывая этот протокол.
Что происходит, когда стороннее приложение пытается открыть файл? ОС ищет приложения, которые в файле манифеста зарегистрированы для поддержки этого типа файлов: если не найдено ни одного приложения, пользователю предлагается перейти в Магазин, чтобы загрузить приложение, способное управлять этим типом файла. Если на устройстве установлено несколько приложений, способных управлять одним и тем же расширением, у пользователя спрашивают, какое из них он хочет использовать; вместо этого, если доступно только одно приложение, оно открывается напрямую.
В этом уроке мы сосредоточимся на ассоциации файлов: мы поговорим об ассоциации протоколов в другом посте. В примере, который мы будем использовать для этого урока, мы создадим два отдельных приложения для Windows Phone 8: первое будет называться «средство запуска», и это будет приложение, которое запустит запрос файла, который будет обработан. приложением «читатель», которое будет «прослушивать» расширение определенного типа и получать файлы. Мы зарегистрируем расширение .log и будем использовать его для обмена файлом с текстом внутри двух приложений.
Приложение «launcher»: как открыть файл
В приложении запуска мы собираемся выполнить две задачи: первая — создать файл журнала, который будет простым текстовым файлом. Второй — «запустить» этот файл, чтобы приложение для чтения могло его использовать. Давайте начнем создавать файл журнала: для этого шага мы будем использовать класс, который добавляет два простых метода расширения для работы со строками. Первый называется WriteToFile и может использоваться для записи строки в файл в локальном хранилище; второй называется ReadFromFile и выполняет противоположную задачу: читает текстовый файл из локального хранилища и возвращает его в виде строки.
Давайте начнем создавать класс, который будет содержать наши методы расширения: для этого просто создайте новый класс (щелкнув правой кнопкой мыши по вашему проекту и выбрав « Добавить новый файл» ) и отметьте его как статический. В этом посте мы увидим метод WriteToFile , так как он единственный, который мы собираемся использовать в приложении запуска.
namespace ShareData.Launcher.Helpers { public static class FileExtensions { public static async Task WriteToFile(this string contents, string fileName, StorageFolder folder = null) { folder = folder ?? ApplicationData.Current.LocalFolder; var file = await folder.CreateFileAsync( fileName, CreationCollisionOption.ReplaceExisting); using (var fs = await file.OpenAsync(FileAccessMode.ReadWrite)) { using (var outStream = fs.GetOutputStreamAt(0)) { using (var dataWriter = new DataWriter(outStream)) { if (contents != null) dataWriter.WriteString(contents); await dataWriter.StoreAsync(); dataWriter.DetachStream(); } await outStream.FlushAsync(); } } } } }
Метод берет строку и сохраняет ее в файл в локальном хранилище, имя которого указывается в качестве параметра. Метод также принимает другой параметр, типом которого является StorageFolder (который определяет папку в локальном хранилище): мы можем использовать его в случае, если мы хотим сохранить файл в определенной папке. Если вы не установите этот параметр, файл будет создан в корне хранилища.
Этот метод использует стандартные API WinRT для создания файла в хранилище и использует OutputStream и класс DataWriter для записи содержимого строки в классе.
Следующим шагом является установка пакета Microsoft.Bcl.Async из NuGet, который мы научились использовать в этом посте : цель состоит в том, чтобы использовать методы async WebClient для загрузки содержимого RSS-канала и его сохранения в файл.
Теперь давайте поработаем над пользовательским интерфейсом: мы просто добавим две кнопки в MainPage.xaml , одну для загрузки XML и записи файла, а другую для его «открытия».
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <Button Content="Create file" Click="OnCreateFileButtonClicked" /> <Button Content="Open file" Click="OnOpenFileButtonClicked" /> </StackPanel> </Grid>
Благодаря созданному нами методу расширения и методам расширения WebClient, которые мы добавили, установив пакет Microsoft.Bcl.Async , очень легко выполнить нашу задачу: загрузить XML и сохранить в файл с расширением .log. :
private async void OnCreateFileButtonClicked(object sender, RoutedEventArgs e) { WebClient client = new WebClient(); string result = await client.DownloadStringTaskAsync("http://feeds.feedburner.com/qmatteoq_eng"); await result.WriteToFile("rss.log"); }
Мы просто загружаем RSS, используя метод DownloadStringTaskAsync (в этом примере мы загружаем RSS-канал этого блога), и сохраняем его в файле file.log , который находится в корне локального хранилища.
Теперь пришло время открыть файл:
private async void OnOpenFileButtonClicked(object sender, RoutedEventArgs e) { StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("rss.log"); Windows.System.Launcher.LaunchFileAsync(file); }
Также в этом случае операция действительно проста: мы получаем ссылку на файл (используя метод GetFileAsync ), а затем открываем его с помощью метода LaunchFileAsync класса Launcher . Что должно случиться? На этом этапе обучения вам будет выдано сообщение с сообщением о том, что у вас нет приложения, способного открывать файлы .log, и вас спросят, хотите ли вы найти его в Магазине. На данный момент просто проигнорируйте сообщение: в следующем посте мы собираемся создать приложение для чтения, которое зарегистрирует расширение .log и сможет открыть наш файл.
Если вы хотите попробовать эту функцию, пока я не опубликую следующий пост, попробуйте переименовать файл, сохраненный приложением, в rss.txt , просто изменив имя, которое передается в result.WriteToFile () и LocalFolder. Методы GetFileAsync () . Поскольку .txt является расширением, зарегистрированным операционной системой, файл будет открыт с помощью Word, и вы сможете прочитать содержимое файла XML.
Продолжение следует
В следующем посте мы собираемся разработать собственное приложение для чтения, которое сможет перехватить и открыть файл file.log, который мы создали в этом посте. Оставайтесь в курсе!