piątek, 18 stycznia 2013

Windows Phone 8 na żywo - odc.1 (nowe File API + kilka różnic w stosunku do Win8)

Otwieram serię kilku postów, w których będę się dzielił praktycznymi uwagami związanymi z platformą WP8.

WP8_6

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ń.

WP8_1    WP8_2    WP8_9

Przy dodawaniu nowych klipów wyszukuję je sobie w YouTube i wybrane pobieram. Lokalnie przechowywane pliki również mogę przeszukiwać.

WP8_8    WP8_3

Oczywiście video można odtwarzać –;)

WP8_4

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: