Otwieram serię kilku postów, w których będę się dzielił praktycznymi uwagami związanymi z platformą WP8.
Uczynię to w oparciu o aplikację pobierającą filmy z YouTube, która jest odpowiednikiem wcześniejszej aplikacji na Windows 8.
Stroną startową w WP8 jest pivot z trzema widokami: lista nagrań video, ostatnio używane oraz lista aktualnych pobrań.
Przy dodawaniu nowych klipów wyszukuję je sobie w YouTube i wybrane pobieram. Lokalnie przechowywane pliki również mogę przeszukiwać.
Oczywiście video można odtwarzać –;)
Po tym krótkim wstępie pora na porcję informacji technicznych. Dziś tematem przewodnim będzie kwestia nowego API do lokalnego systemu plików. W drugiej części wspomnę krótko o innych różnicach, które rzuciły mi się w oczy przy przenoszeniu kodu z Windows 8.
File API
Jak powszechnie wiadomo w WP8 mamy podzbiór File API znanego z Windows 8. Wspierany jest folder lokalny, do którego nadal możemy mieć dostęp przez Isolated Storage API z WP 7.x. Trzeba zaznaczyć, że w przeciwieństwie do Windows 8 nie mamy folderów dla synchronizacji zdalnej i plików tymczasowych, a także znanego z tej platformy API do ustawień aplikacji. WP8 podobnie jak WP7.x ma kilka innych folderów o dedykowanym przeznaczeniu, a z ustawień aplikacji korzystamy przez Isolated Storage API. Dochodzą też bardziej szczegółowe różnice dotyczące obsługi systemu plików. Na nich się dzisiaj skupimy.
Sprawdzanie istnienia
Isolated Storage API z WP 7.x ma proste API do sprawdzenia czy dany plik lub folder istnieje. Nowe WinRT API mimo wielu zalet nie pozwala na bezpośrednią weryfikację takich informacji. Możemy to zrobić w sposób pośredni, posługując się kodem podobnym do poniższego:
StorageFile storageFile = null;
bool fileExists = false;
try
{
storageFile = await StorageFile.GetFileFromPathAsync(…);
fileExists = true;
}
catch (FileNotFoundException)
{
fileExists = false;
}
Wirtualizowany wektor
Windows 8 posiada klasę FileInformationFactory, która tworzy bindowalny wirtualizowany wektor z plikami. Razem z nim otrzymujemy miniatury dla plików oraz dynamiczne filtrowanie w oparciu o zdefiniowane zapytanie. Na ten temat pisałem m.in tutaj. Niestety, w WP8 takiego API nie ma. Przyjrzyjmy się więc bliżej kwestii filtrowania plików oraz wyświetlania ich miniatur.
Filtrowanie
Windows 8 oferuje tzw. file queries, które umożliwiają szybkie wygodne filtrowanie zbioru plików. W WP8 mimo obecności sygnatur takie API nie zostało zaimplementowane. Wyszukiwanie w folderze lokalnym plików, których nazwa zaczyna się od podanej frazy, zmuszony byłem zrealizować ręcznie:
var files = await ApplicationData.Current.LocalFolder.GetFilesAsync();
foreach (var file in files)
{
if (file.Name == "__ApplicationSettings" || file.Name.EndsWith(".tmp"))
continue;
if (file.Name.ToLower().StartsWith(queryText.ToLower()))
//dodanie pliku do wyników wyszukiwania
}
Pliki miniatur dla plików wideo
W Windows 8 mamy metodę w StorageFile do zwrócenia miniatury. WP8 nie implementuje takiego API. W WP7.x nie kojarzę standardowego API w C#, które by to umożliwiało bez odtwarzania. Ponieważ wszystkie filmy są pobierane przez aplikację z YouTube, wybrnąłem z problemu w prosty sposób. Otóż zapisuję dostarczone przez ten serwis miniatury obok właściwych plików wideo.
Pora na drugą część podsumowującą inne napotkane różnice w stosunku do Windows 8.
Interfejs użytkownika
- Win8: kontrolki i rozwiązania typowe dla Win8
- WP8: kontrolki i rozwiązania znane w zasadzie z WP7.x
Komunikacja
- Win8: HttpClient z wbudowanym async
- WP8: WebClient znany z WP7.x bez wbudowanego wsparcia dla async (dopisałem sobie wrapper)
Pobieranie plików w tle
- Win8: BackgroundDownloader
- WP8: BackgroundTransferService znany z WP7.x, z powiększonym limitem plików w kolejce do 25
Odtwarzanie wideo
- Win8: MediaElement (przeze mnie użyty) lub MediaPlayer (z Player Framework for Windows 8)
- WP8: MediaElement lub MediaPlayerLauncher (przeze mnie użyty)
Brak komentarzy:
Prześlij komentarz