Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

gmail.com Instytut Informatyki U P-H w Siedlcach 1/231 dr Grzegorz Terlikowski Środowiska Programowania Aplikacji Wirtualnych i Multimedialnych.

Podobne prezentacje


Prezentacja na temat: "gmail.com Instytut Informatyki U P-H w Siedlcach 1/231 dr Grzegorz Terlikowski Środowiska Programowania Aplikacji Wirtualnych i Multimedialnych."— Zapis prezentacji:

1 gmail.com Instytut Informatyki U P-H w Siedlcach 1/231 dr Grzegorz Terlikowski Środowiska Programowania Aplikacji Wirtualnych i Multimedialnych

2 gmail.com Instytut Informatyki U P-H w Siedlcach 2/231 Cechy JavaScript

3 gmail.com Instytut Informatyki U P-H w Siedlcach 3/231 Podstawowe zastosowania JavaScript 1.Tworzenie rozbudowanego, webowego interfejsu użytkownika, 2.Walidacja danych wprowadzanych przez użytkownika, 3.Dynamiczne generowanie treści strony oraz obsługa efektów graficznych i animacji, 4.Otwieranie i zamykanie okien, 5.Komunikacja z obiektami Silverlight, Flash, Java, 6.Obsługa komunikacji z serwerem, w tym odbieranie danych z serwera bez konieczności przeładowywania strony(AJAX),

4 gmail.com Instytut Informatyki U P-H w Siedlcach 4/231 Ograniczenia JavaScript 1.Nie można uzyskać dostępu do plików systemowych, 2.Brak możliwości komunikacji ze sprzętem, 3.Nie można bezpośrednio operować na pamięci operacyjnej, 4.Obsługa tylko protokołu HTTP(do wersji HTML 5, który wprowadza WebSockety), 5.Nie można otworzyć okna o zbyt małym rozmiarze, 6.Nie można ustawić wartości pola, 7.Brak dostępu do multimediów bez dodatkowego plugina (do wersji HTML 5),

5 gmail.com Instytut Informatyki U P-H w Siedlcach 5/231 Adobe AIR

6 gmail.com Instytut Informatyki U P-H w Siedlcach 6/231 Adobe AIR – ogólne możliwości (1)  Dzięki AIR aplikacje napisane w......mogą działać w różnych systemach operacyjnych i nie wymagają korzystania z przeglądarki  AIR jest dostępna na platformie Windows, Linux (do wersji 2,7), Mac OS, iOS, Android.  Swym zasięgiem obejmuje ponad miliard desktopów i ponad 500 milionów urządzeń mobilnych

7 gmail.com Instytut Informatyki U P-H w Siedlcach 7/231 1.Daje możliwość przekształcenia (dzięki kilku kliknięciom) aplikacji internetowej do postaci systemowej, nie tracąc na wyglądzie oraz użyteczności. 2.Dzięki AIR programista aplikacji webowych może przenieść swoje doświadczenie do obszaru wytwarzania aplikacji desktopowych. Można wykorzystywać te same mechanizmy. Aplikacje będą wyglądały identycznie jak w przeglądarce. 3.Dzięki specjalnemu API, daje możliwość dostępu do właściwości systemowych, niedostępnych w typowym JavaScripcie (np. obsługa plików), 4.Dzięki natywnym rozszerzeniom, można korzystać ze specyficznych funkcji danego OS, uzyskując zbliżoną wydajność. Adobe AIR – ogólne możliwości (2)

8 gmail.com Instytut Informatyki U P-H w Siedlcach 8/231 Adobe AIR – dostępne API W Adobe AIR mamy do czynienia z dwoma API: AIR i Flash. Do najważniejszych funkcjonalności należą: 1.Dostęp do plików, 2.Współpraca z multimediami (obrazki, dźwięk itd.), 3.Obsługa okien natywnych (specyficzna dla danego systemu); 4.Współpraca ze schowkiem, 5.Obsługa baz danych, 6.Obsługa gniazd.

9 gmail.com Instytut Informatyki U P-H w Siedlcach 9/231 Adobe AIR – dostępne API  Adobe AIR wykorzystuje silnik WebKit, jednak wersja tutaj zastosowana różni się od wersji opensource.  Niektóre cechy silnika WebKit nie są wspierane przez Adobe AIR,  Adobe AIR naprawia też błędy w tym silniku i poprawia mechanizmy bezpieczeństwa,

10 gmail.com Instytut Informatyki U P-H w Siedlcach 10/231 Adobe AIR – Niektóre cechy Webkit niewspierane przez Adobe AIR  Tagi audio i video (dostarcza własnego API),  Drukowanie (dostarcza PrintJob API),  WebSockety – (dostarcza własnego API do obsługi gniazd),  WebKit SQL API (dostarcza własnego API),  WebKit geolocation API (dostarcza własnego API na wspieranych urządzeniach),  WebKit touch events (dostarcza własnego API),  Ponadto nie wspiera: SVG, WebWorkerów (wątków roboczych), wielu atrybutów HTML i stylów CSS html

11 gmail.com Instytut Informatyki U P-H w Siedlcach 11/231 Adobe AIR – struktura projektu Struktura projektu Adobe AIR, napisanego w JavaScript/HTML jest podobna do struktury projektu dla każdej aplikacji webowej. W skład projektu może wchodzić np. następujący zestaw katalogów: 1.css – katalog na kaskadowe arkusze stylów 2.icons – katalog na ikony wykorzystywane przez aplikację 3.images – katalog zawierający grafikę 4.js – katalog ze skryptami napisanymi w JavaScript Ponadto muszą istnieć następujące pliki: 1.Plik html – plik zawierający treść głównej strony aplikacji 2.Plik xml – plik stanowiący deskryptor aplikacji

12 gmail.com Instytut Informatyki U P-H w Siedlcach 12/231 Adobe AIR – struktura projektu – pliki HTML i XML Przykładowa zawartość bazowego pliku HTML. Przykładowa zawartość deskryptora aplikacji (pliku XML) W pliku deskryptora aplikacji umieszcza się metadane związane z programem m.in.: 1.Nazwa, 2.Wersja, 3.Autor, 4.Opis, 5.Nota copyright, 6.Ikony, 7.Domyślny folder instalacji, 8.Wygląd okna i jego zachowanie.

13 gmail.com Instytut Informatyki U P-H w Siedlcach 13/231 Adobe AIR – Tworzenie certyfikatu Teoretycznie każda aplikacja wymaga podpisania cyfrowym podpisem certyfikującym (użytkownik ma pewność, że aplikacja nie uszkodzi jego komputera). Certyfikat można zakupić w centrum autentyfikacyjnym (np. Thawte, VeriSign) lub wygenerować samemu za pomocą narzędzia adt. Można wtedy generować instalatory dla aplikacji AIR. adt –certificate –cn NazwaCertyfikatu 1024-RSA plikCertyfikatu.pfx haslo Certyfikat wygenerowany samodzielnie będzie ważny przez 5 lat – czyli każda aplikacja powstała z tym certyfikatem musi być aktualizowana co najmniej co 5 lat. Po tym czasie należy opublikować nową aplikację zawierającą nowy certyfikat.

14 gmail.com Instytut Informatyki U P-H w Siedlcach 14/231 Adobe AIR – tworzenie instalatora aplikacji Podczas kompilowania aplikacji zostanie utworzony plik instalacyjny (.air ), który można dostarczać użytkownikom i instalować. Polecenie tworzące instalator wygląda następująco: adt –package –storetype pkcs12 -keystore plikCertyfikatu.pfx HelloWorld.air HelloWorld.xml HelloWorld.html gdzie package – wskazuje, że chcemy utworzyć aplikację spakowaną. storetype pkcs12 -keystore plikCertyfikatu.pfx – określają certyfikat, który będzie wykorzystywany w aplikacji Po nazwie głównego pliku aplikacji możemy wylistować katalogi, które zawierają dodatkowe dane (zasoby icons, js itd).

15 gmail.com Instytut Informatyki U P-H w Siedlcach 15/231 Adobe AIR – model bezpieczeństwa (1)  Aplikacje AIR mają inny model bezpieczeństwa niż aplikacje przeglądarkowe.  Model bezpieczeństwa określa uprawnienia dla każdego pliku w aplikacji AIR.  Dotyczy to zarówno plików zainstalowanych wraz aplikacją, jak i plików ładowanych przez aplikację.  Uprawnienia przyznawane są plikom według ich pochodzenia, i są przypisane do logicznych grup zabezpieczeń zwanych piaskownicami (ang. sandbox) lub obszarami izolowanymi.  Innymi słowy piaskownica definiuje środowisko w którym aplikacja może się bawić, czyli np. zapisywać i odczytywać z niego dane.

16 gmail.com Instytut Informatyki U P-H w Siedlcach 16/231 Adobe AIR – model bezpieczeństwa (2) AIR wykorzystuje model bezpieczeństwa zastosowany we Flashu, który udostępnia dwa modele piaskownic:  dla lokalnego systemu plików (komputera użytkownika),  dla zasobów zdalnych (Internetu i innych komputerów w sieci) Ponadto, AIR dodaje trzecią piaskownicę  aplikacji – która jest związana z zawartością folderu aplikacji.

17 gmail.com Instytut Informatyki U P-H w Siedlcach 17/231 Adobe AIR – model bezpieczeństwa (3) Piaskownica aplikacji (domyślna dla każdej aplikacji AIR)  Po zainstalowaniu aplikacji, wszystkie pliki zawarte w pliku instalatora AIR są instalowane na komputerze użytkownika w katalogu aplikacji.  Wszystkie pliki w drzewie katalogu aplikacji są przypisane do obszaru izolowanego(piaskownicy) aplikacji.  Tylko treść z katalogu instalacyjnego aplikacji posiada pełne przywileje dostępne dla aplikacji AIR, w tym interakcji z lokalnym systemem plików.  Aplikacja nie może po cichu bez wiedzy użytkownika się zaktualizować, lub doinstalować pluginy/rozszerzenia.

18 gmail.com Instytut Informatyki U P-H w Siedlcach 18/231 Adobe AIR – model bezpieczeństwa (4)  Aplikacje AIR nie są ograniczone tylko do plików z katalogu aplikacji – mogą załadować pliki z dowolnego źródła.  Dotyczy to zarówno plików na komputerze użytkownika, jak też plików z zewnętrznych źródeł (z sieci lokalnej lub Internetu).  Typ pliku nie ma wpływu na ograniczenia bezpieczeństwa, pobrane z zewnątrz pliki HTML mają te same przywileje zabezpieczeń co pliki SWF pochodzące z tego samego źródła.

19 gmail.com Instytut Informatyki U P-H w Siedlcach 19/231 Adobe AIR – model bezpieczeństwa (5)  Funkcja eval JS umożliwia dynamiczne przekształcenie ciągów znaków do kodu wykonalnego.  Treść zawarta w obszarze izolowanym może korzystać z tej funkcji podczas ładowania kodu z URL aplikacji.

20 gmail.com Instytut Informatyki U P-H w Siedlcach 20/231 Adobe AIR – model bezpieczeństwa (6)  Kod pobrany z sieci mógłby być złośliwy i być przyczyną np.,  Ataków cross-site scripting XSS,  Usunięcia lub modyfikacji plików na komputerze,  Wysłanie zawartości pliku lokalnego do niezaufanej sieci. Uwaga: W mobilnych aplikacjach AIR, HTML i JavaScript nie może być załadowany do obszaru izolowanego aplikacji. Mobilne aplikacje AIR wyświetlają takie treści za pomocą systemu kontroli sieci. Kontrola ta ma te same względy bezpieczeństwa jak domyślne przeglądarki internetowe systemu.

21 gmail.com Instytut Informatyki U P-H w Siedlcach 21/231 Adobe AIR – model bezpieczeństwa (7)  W piaskownicy nieaplikacyjnej (ang. non-application) aplikacja ma takie same prawa co aplikacja przeglądarkowa – mogą się np. wykonywać pluginy aplikacji pobierane od niezależnych dostawców.  Brak bezpośredniego dostępu do API platformy AIR.  Brak bezpośredniej możliwości wykonania dynamicznego kodu – nie można korzystać z funkcji eval – programista musi wykorzystać specjalny mechanizm (SadboxBridge API), który sprowadza się do serializacji i deserializacji obiektów.

22 gmail.com Instytut Informatyki U P-H w Siedlcach 22/231 Adobe AIR – dostęp do API Dostęp do API można uzyskać na dwa sposoby: 1.bezpośrednio za pomocą odwołania window.runtime np. var file = new window.runtime.flash.filesystem.File(); 2.lub za pośrednictwem aliasu var file = new air.File(). Aby „włączyć” dostęp do API za pośrednictwem aliasów, należy w tworzonej aplikacji dodać plik AIRAliases.js (plik aliasów).

23 gmail.com Instytut Informatyki U P-H w Siedlcach 23/231 Adobe AIR – Narzędzia debagowania Starym sposobem debagowania funkcji napisanych w JavaScript jest umieszczanie w nich wywołań okienka alert function mojaFunkcja(){ alert(‘Jestem tutaj!’); } Adobe AIR udostępnia narzędzie trace, umożliwiające wyświetlanie komunikatów na konsoli window.runtime.trace(‘Ten tekst pojawi się na konsoli’); lub air.trace(‘Ten tekst pojawi się na konsoli’);

24 gmail.com Instytut Informatyki U P-H w Siedlcach 24/231 Adobe AIR – Narzędzia debagowania Najbardziej znaczącym mechanizmem debagowania jest AIRIntrospector.js. Narzędzie to, dostępne jest (po jego dołączeniu do aplikacji) pod przyciskiem F12 i umożliwia: 1.Podejrzenie kodu związanego z poszczególnymi elementami programu, 2.Wykorzystanie konsoli w celu interakcji z JS (podglądanie wartości zmiennych), 3.Podejrzenie kodu HTML odpowiedzialnego za wygenerowane elementy, 4.Przeglądanie i manipulowanie obiektowym modelem dokumentu (ang. Document Object Model, DOM), 5.Przeglądanie zasobów strony (obrazków, załączonych plików itd.), 6.Przeglądanie całego kodu źródłowego aplikacji (wraz z kodem JavaScript), 7.Podgląd wartości obiektów XMLHttpRequest,

25 gmail.com Instytut Informatyki U P-H w Siedlcach 25/231 Tworzenie okien natywnych

26 gmail.com Instytut Informatyki U P-H w Siedlcach 26/231 Adobe AIR – Tworzenie okien Aplikacje AIR tworzone w HTML i JS mogą korzystać z dwóch rodzajów okien: 1.Standardowych okien HTML, 2.Okien natywnych – więcej kodu, ale za to większa swoboda w manipulowaniu cechami okna.

27 gmail.com Instytut Informatyki U P-H w Siedlcach 27/231 Adobe AIR – Tworzenie okien HTML Tworzenie okien HTML jest bardzo proste i polega na wywołaniu funkcji: var widnow = window.open(‘strona.html’, ‘tytuł’, ‘właściwość1=wartość1, właściwość2=wartość2’);

28 gmail.com Instytut Informatyki U P-H w Siedlcach 28/231 Tworzenie okien natywnych Tworzenie natywnych okien wymaga nieco więcej pracy, ale pozwala na większe możliwości. Aby utworzyć okno natywne należy: 1.Utworzyć obiekt NativeWindowInitOptions 2.Utworzyć obiekt typu Rectangle, definiujący wielkość i położenie, 3.Utworzyć okno air.HTMLLoader.createRootWindow(true, options, false, rect); 4.Załadować treść okna var page = air.File.applicationDirectory.resolvePath('strona.html '); popup.load(new air.URLRequest(page.url));

29 gmail.com Instytut Informatyki U P-H w Siedlcach 29/231 Tworzenie okien natywnych – Atrybuty obiektu NativeWindowOptions AtrybutWartość maximizabletrue/false minimizabletrue/false resizabletrue/false systemChrome„none”/”standard” transparenttrue/false type„normal”/”lightweight”/”utility” W każdym natywnym oknie można manipulować poniższym zestawem opcji:

30 gmail.com Instytut Informatyki U P-H w Siedlcach 30/231 Tworzenie okien natywnych – Chrom  Chrom określa ramki wykorzystywane w oknach systemu, w tym kolor ramek, ikony minimalizacji/maksymalizacji/zamykania.  Okna wykorzystujące chrom systemowy będą wyglądały jak wszystkie standardowe okna w danym systemie.

31 gmail.com Instytut Informatyki U P-H w Siedlcach 31/231 Adobe AIR – Tworzenie natywnych okien - typy okien

32 gmail.com Instytut Informatyki U P-H w Siedlcach 32/231 Dostęp do natywnych okien Dostęp do okna natywnego można uzyskać za pomocą dwóch konstrukcji: 1.zwracającej aktualne okno (w którym wykonywany jest ten kod) var currentWindow = window.nativeWindow; 2.zwracającej tablicę obiektów typu NativeWindow. var allWindows = air.NativeApplication.nativeApplication. openedWindows; var currentWindow = allWindows[1];

33 gmail.com Instytut Informatyki U P-H w Siedlcach 33/231 Atrybuty obiektu NativeWindow AtrybutWartość alwaysInFronttrue/false bounds obiekt typu Rectangle height liczba całkowita(w pikselach) maxSize obiekt typu Point menu Obiekt typu NativeMenu minSize obiekt typu Point title łańcuch znaków visibletrue/false width liczba całkowita(w pikselach) x y Poniżej znajduje się lista atrybutów, którymi można manipulować.

34 gmail.com Instytut Informatyki U P-H w Siedlcach 34/231 Dostęp do natywnych okien

35 gmail.com Instytut Informatyki U P-H w Siedlcach 35/231 Dostęp do natywnych okien AIR API dostarcza kilku ciekawych atrybutów, które są pomocne przy ustalaniu rozmiaru okien. Nazwa atrybutuOpis air.Capabilities.screenResolutionX Szerokość ekranu w pikselach air.Capabilities.screenResolutionY Wysokość ekranu w pikselach air.NativeWindow.systemMaxSize Maksymalny rozmiar okna w pikselach air.NativeWindow.systemMinSize Minimalny rozmiar okna w pikselach

36 gmail.com Instytut Informatyki U P-H w Siedlcach 36/231 Tworzenie okien pełnoekranowych Okna pełnoekranowe zajmują obszar całego ekranu, w ten sposób udostępniając jak największy obszar roboczy. W Adobe AIR, aby przełączyć okno w tryb pełnoekranowy, trzeba podmienić wartość atrybutu stage.dispayState w następujący sposób: var win = window.nativeWindow; win.stage.displayState = runtime.flash.display.StegeDisplayState.FULL_SCREEN;

37 gmail.com Instytut Informatyki U P-H w Siedlcach 37/231 Tworzenie okien pełnoekranowych

38 gmail.com Instytut Informatyki U P-H w Siedlcach 38/231 Obsługa zdarzeń okien (1) Obsługa zdarzeń okien składa się z dwóch etapów: 1.Utworzenie funkcji, która obsłuży zdarzenie function funkcjaObsugujacaZdarzenie(event){ //Kod } 2.Związanie (skojarzenie) funkcji ze zdarzeniem, nazwaOkna.addEventListener(typZdarzenia, funkjaObslugujacaZdarzenie);

39 gmail.com Instytut Informatyki U P-H w Siedlcach 39/231 Obsługa zdarzeń okien (2) ZdarzenieKlasa ACTIVEEvent CLOSEEvent CLOSINGEvent DEACTIVATEEvent FOCUS_INEvent FOCUS_OUTEvent Zdarzenia związane z oknami są zawarte w klasie air.Event i przedstawiają się następująco: Próba zamknięcia okna spowoduje wywołanie zdarzenia CLOSING, a gdy się ono powiedzie zostanie wywołane zdarzenie CLOSE.

40 gmail.com Instytut Informatyki U P-H w Siedlcach 40/231 Obsługa zdarzeń okien (3) ZdarzenieKlasa MOVENativeWindowBoundsEvent MOVINGNativeWindowBoundsEvent RESIZENativeWindowBoundsEvent RESIZINGNativeWindowBoundsEvent DISPLAY_STATE_CHANGENativeWindowDisplayStateEvent DISPLAY_STATE_CHANGINGNativeWindowDisplayStateEvent Zdarzenia związane z oknami są zawarte w klasach air.NativeWindowBoundsEvent i air.NativeWindowDisplayStateEvent.

41 gmail.com Instytut Informatyki U P-H w Siedlcach 41/231 Obsługa zdarzeń okien (4) Zmiana trybu z normalnego na zminimalizowany lub na odwrót spowoduje wygenerowanie zdarzenia DISPLAY_STATE_CHANGING i DISPLAY_STATE_CHANGE. Aby podjąć jakąś akcję należy skorzystać z wywołania: window.nativeWindow.addEventListener( air.NativeWindowDisplayStateEvents. DISPLAY_STATE_CHANGE, nazwaFunkcji);

42 gmail.com Instytut Informatyki U P-H w Siedlcach 42/231 Obsługa zdarzeń okien (5) W ten sposób można nadpisać domyślne zachowanie aplikacji związane np. z zamknięciem okna. Aplikacja może powstrzymać wykonywanie zdarzenia za pomocą metody preventDefault() obiektu Event.

43 gmail.com Instytut Informatyki U P-H w Siedlcach 43/231 Tworzenie własnego chrom Chrom systemowy zapewnia nie tylko wygląd, ale także funkcjonalność, do których należą możliwość maksymalizowania, minimalizowania i zamykania okna. W przypadku tworzenia własnego chromu, trzeba zadbać o tę funkcjonalność samemu. Logika tych funkcji sprowadza się do wywołania odpowiednich metod obiektu NativeWindow :  nazwaOkna.close();  nazwaOkna.maximize();  nazwaOkna.minimize();

44 gmail.com Instytut Informatyki U P-H w Siedlcach 44/231 Tworzenie menu natywnego

45 gmail.com Instytut Informatyki U P-H w Siedlcach 45/231 Tworzenie menu (1) Menu są bardzo ważnym elementem każdej aplikacji. Można je tworzyć w HTML, lub wykorzystać API do tworzenia menu natywnych. Aby utworzyć natywne menu trzeba skorzystać z dwóch klas: 1. NativeMenu – umożliwia tworzenie podstawowego obiektu menu, 2. NativeMenuItem – pozwala na tworzenie elementów wewnątrz menu,

46 gmail.com Instytut Informatyki U P-H w Siedlcach 46/231 Tworzenie menu (2) Ponadto istnieje różnica pomiędzy dodawaniem menu w systemach Windows, a Mac OS UWAGA: Menu okien w systemie Windows mogą być tworzone tylko wewnątrz okien wykorzystujących chrom systemowy. Ponadto: Menu można tworzyć także za pomocą języków ActionScript, MXML i JavaScript.

47 gmail.com Instytut Informatyki U P-H w Siedlcach 47/231 Tworzenie menu (3) separator

48 gmail.com Instytut Informatyki U P-H w Siedlcach 48/231 Obsługa menu – zdarzenia Zdarzenia menu obsługuje się podobnie do zdarzeń związanych z oknami z tym że kluczowe znaczenie mają tutaj dwa zdarzenia: ZdarzenieOpis displaying wywoływane tuż przed wyświetleniem menu. Przydaje się np., gdy chcemy zaktualizować listę ostatnio otwartych dokumentów (tak jak w MS Word) select wywoływane, gdy użytkownik wybiera jeden z elementów menu (nie działa dla separatora). Aby wykonać jakąś czynność w momencie wybrania elementu menu, należy dodać do niego „słuchacza” zdarzeń: elementMenu.addEventListener(air.Event.SELECT, funkcjaObslugujacaZdarzenie); Stałe zawarte w klasie air.Event

49 gmail.com Instytut Informatyki U P-H w Siedlcach 49/231 Obsługa menu – skróty klawiszowe (1) Każdy element menu można skojarzyć ze skrótem klawiszowym. Aby dodać skrót do aplikacji AIR należy:  Utworzyć element menu, a następnie 1.Ustawić atrybut keyEquivalent – nazwa głównego klawisza, 2.Ustawić atrybut keyEquivalentModifiers = [modyfikatory] – stałe zawarte w klasie air.Keyboard UWAGA: Aby skorzystać z wielu klawiszy modyfikatorów należy rozdzielić je przecinkami

50 gmail.com Instytut Informatyki U P-H w Siedlcach 50/231 Obsługa menu – skróty klawiszowe (2) StałaKlucz ALTERNATEAlt/Option BACKSPACEBackspace F13 NUMBER_77 PAGE_UPPage up SPACEspacja Niektóre stałe zawarte w klasie air.Keyboard.

51 gmail.com Instytut Informatyki U P-H w Siedlcach 51/231 Obsługa menu – mnemoniki  W systemie Windows elementy menu często zawierają jedną podkreśloną literę. Wciśnięcie odpowiedniego klawisza (gdy menu jest otwarte), jest równoważne z wybraniem danego elementu menu i naciśnięciu klawisza ENTER.  Jeśli chcemy wykorzystać mnemonik w menu, należy podać indeks litery z etykiety (numeracja oczywiście od 0).

52 gmail.com Instytut Informatyki U P-H w Siedlcach 52/231 Obsługa menu – zmiana stanu elementu menu Elementy menu mogą przyjmować dwa dodatkowe stany: StanOpis enabled określa czy dany element menu, jest w danej chwili aktywny checked niektóre elementy menu umieszczają znak zaznaczenia obok etykiety, określając swój status

53 gmail.com Instytut Informatyki U P-H w Siedlcach 53/231 Tworzenie menu z użyciem frameworka MenuBuilder Framework MenuBuilder pozwala definiować strukturę menu w formacie XML lub JSON. Framework Ten działa tylko w aplikacyjnym sandboxie. Aby użyć frameworka należy załadować plik AIRMenuBuilder.js. Środowisko Aptana Studio 2.0, umożliwia automatyczne dodanie frameworka (na etapie tworzenia nowego projektu) poprzez zaznaczenie odpowiedniej opcji.

54 gmail.com Instytut Informatyki U P-H w Siedlcach 54/231 Tworzenie menu z użyciem frameworka MenuBuilder Aby dodać do aplikacji menu wykorzystujące framework MenuBuilder należy: 1.Utworzyć strukturę menu w pliku XML lub JSON, 2.Załadować plik ze strukturą menu wywołując metodę Menu.createFromXML(‘plikXML’) lub Menu.createFromJSON(‘plikJSON’) 3.Podłączyć menu do aplikacji za pomocą jednej z metod: 1.Menu.setAsMenu() – by ustawić główne menu aplikacji. 2.Menu.setAsContextMenu() – by wyświetlić menu jako menu kontekstowe elementu drzewa DOM. 3.Menu.setAsIconMenu() by ustawić menu jako kontekstowe dla zasobnika systemowego(ang. system tray) lub ikony paska zadań (ang. dock icon)

55 gmail.com Instytut Informatyki U P-H w Siedlcach 55/231 Tworzenie menu z użyciem frameworka MenuBuilder Przykład definicji struktury menu w formacie XML. var treeContextMenu = air.ui.Menu.createFromXML("treeContextMenu.xml"); air.ui.Menu.setAsContextMenu(treeContextMenu, "id_DOM_node"); Przykład dodawania menu kontekstowego do węzła DOM.

56 gmail.com Instytut Informatyki U P-H w Siedlcach 56/231 Tworzenie menu z użyciem frameworka MenuBuilder Przykład definicji struktury menu w formacie JSON. [ {label: "MenuItem A"}, {label: "MenuItem B", type: "check", toggled: "true"}, {label: "MenuItem C", enabled: "false"}, {type: "separator"}, {label: "MenuItem D", items: [ {label: "SubMenuItem D-1"}, {label: "SubMenuItem D-2"}, {label: "SubMenuItem D-3"} ] } ] var mainMenu = air.ui.Menu.createFromJSON(„mainMenu.js"); air.ui.Menu.setAsMenu(mainMenu); Przykład dodawania głównego menu aplikacji.

57 gmail.com Instytut Informatyki U P-H w Siedlcach 57/231 Korzystanie ze schowka

58 gmail.com Instytut Informatyki U P-H w Siedlcach 58/231 Schowek – operacje na schowku  Mechanizmy takie jak kopiuj/wytnij/wklej i przeciągnij/upuść są obsługiwane w aplikacjach AIR domyślnie dzięki silnikowi WebKit,  Użytkownicy mogą kopiować i przeciągać dane z/do aplikacji bez konieczności wykonywania dodatkowych czynności,  Dzięki Adobe AIR API, programista może przejąć kontrolę nad tym, w jaki sposób i gdzie dane będą: Edytowane, Kopiowane, Przeciągane, Upuszczane,

59 gmail.com Instytut Informatyki U P-H w Siedlcach 59/231 Schowek – Kopiowanie Aby nadpisać domyślne zachowanie aplikacji związane z kopiowaniem, należy: 1.W znaczniku skojarzyć zdarzenie oncopy z nową funkcją 2.Zaimplementować funkcję kopiującą w której należy:  Unieważnić domyślne systemowe działanie związane z kopiowaniem  Wyczyścić schowek,  Pobrać zaznaczony tekst,  Umieścić tekst w schowku,

60 gmail.com Instytut Informatyki U P-H w Siedlcach 60/231 Schowek – typy przechowywanych danych Typy MIME są wykorzystywane do rozróżniania typów danych przechowywanych w schowku. Typ MIMEZnaczenie image/x- vnd.adobe.air.bitmap Obiekt typu BitmapData application/x- vnd.adobe.air.file-list Tablica obiektów typu File text/html Tekst sformatowany w języku HTML text/plain Czysty tekst text/uri-list Adres URL

61 gmail.com Instytut Informatyki U P-H w Siedlcach 61/231 Schowek – umieszczanie różnych typy danych Schowek może przechowywać te same dane w różnych formatach. Aby umożliwić użytkownikowi kopiowanie po naciśnięciu odpowiedniego elementu menu, należy podpiąć (do tego elementu menu) słuchacza zdarzenia.

62 gmail.com Instytut Informatyki U P-H w Siedlcach 62/231 Schowek – Wycinanie Wycinanie to proces kopiowania zaznaczonej treści połączony z jej usunięciem. Aby nadpisać domyślne zachowanie aplikacji, związane z wycinaniem, należy: 1.W znaczniku skojarzyć zdarzenie oncut z nową funkcją 2.Zaimplementować funkcję wycinającą w której należy:  Unieważnić domyślne systemowe działanie związane z wycinaniem,  Skopiować zaznaczony element do schowka,  Usunąć zaznaczony element z treści strony,

63 gmail.com Instytut Informatyki U P-H w Siedlcach 63/231 Schowek – Wycinanie W JavaScript istnieje kilka sposobów na usunięcie treści ze strony m.in. przez zastosowanie obiektu Range. Metoda getRangeAt zwraca wskazany index -em obiekt Range – użytkownik mógł zaznaczyć kilka obszarów, przy użyciu klawisza CTRL.

64 gmail.com Instytut Informatyki U P-H w Siedlcach 64/231 Schowek – Wklejanie Aby nadpisać domyślne zachowanie aplikacji związane z wklejaniem, należy: 1.Powiadomić aplikację w jaki sposób powinna obsługiwać zdarzenie onpaste. 2.Zaimplementować funkcję „wklejającą”, w której należy:  Unieważnić domyślne systemowe działanie związane z wklejaniem,  Sprawdzić, czy w schowku istnieje element wymaganego typu,  Pobrać ze schowka element do wklejenia,  Dodać wklejany element do treści strony,

65 gmail.com Instytut Informatyki U P-H w Siedlcach 65/231 Schowek – Wklejanie

66 gmail.com Instytut Informatyki U P-H w Siedlcach 66/231 Zaznaczanie – sprawdzanie typów danych Adobe AIR obsługuje następujące formaty:  Tekst,  Adresy URL,  Bitmapy(rysunki),  Pliki,  Obiekty. Aby sprawdzić jakiego typu jest zaznaczony element (obsługa zdarzenia oncopy lub oncut ) należy użyć operatora instanceof.

67 gmail.com Instytut Informatyki U P-H w Siedlcach 67/231 Zaznaczanie – Ograniczanie możliwości zaznaczania Silnik WebKit dodaje wiele własnych stylów CSS np. – webkit-user-select, który określa co użytkownik może zaznaczyć.

68 gmail.com Instytut Informatyki U P-H w Siedlcach 68/231 Mechanizm Przeciągnij Upuść(drag&drop)

69 gmail.com Instytut Informatyki U P-H w Siedlcach 69/231 Mechanizm przeciągnij upuść – zdarzenia Mechanizm przeciągnij upuść (ang. drag&drop) oferuje podobną funkcjonalność, jednak bez wykorzystania schowka. Zdarzenia związane z mechanizmem drag&drop można podzielić na 2 typy: 1.Zdarzenia generowane przez źródło, 2.Zdarzenia generowane przez cel.

70 gmail.com Instytut Informatyki U P-H w Siedlcach 70/231 Mechanizm przeciągnij upuść – zdarzenia generowane przez źródło ZdarzenieOpis ondragstart Wywoływane przy rozpoczęciu gestu przeciągania. ondrag Wywoływane w sposób ciągły podczas gestu przeciągania. ondragend Wywoływane podczas zwolnienia przycisku myszy, kończącego przeciąganie. Zdarzenia generowane przez źródło: Można w bardzo łatwy sposób zapobiec przeciąganiu elementów, wywołując wewnątrz metody obsługującej zdarzenie ondragstart metodę preventDefault. Aby określić operacje, jakie mogą być wykonane na obiekcie, należy ustawić właściwość effectAllowed.

71 gmail.com Instytut Informatyki U P-H w Siedlcach 71/231 Mechanizm przeciągnij upuść – zdarzenia generowane przez cel ZdarzenieOpis ondragenter Wywoływane, gdy gest przeciągania znajdzie się w granicach elementu docelowego, ondragover Wywoływane w sposób ciągły w czasie przytrzymania gestu przeciągania w ramach elementu docelowego, ondragleave Wywoływane w momencie opuszczenia przez gest przeciągania granic elementu docelowego. ondrop Wywoływane w momencie upuszczenia danych na element docelowy. Dostęp do przeciąganych danych można uzyskać tylko w tym miejscu. Zdarzenia generowane przez cel:

72 gmail.com Instytut Informatyki U P-H w Siedlcach 72/231 Mechanizm przeciągnij upuść – nadpisywanie zdarzeń Aby nadpisać domyślne zachowanie aplikacji związane z przeciąganiem i upuszczaniem, należy: 1.Powiadomić aplikację w jaki sposób powinna obsługiwać zdarzenie ondragover i ondrop. 2.Zaimplementować funkcję dla zdarzenia ondragover, w ten sposób aby unieważniała domyślną obsługę tego zdarzenia 3.Zaimplementować funkcję dla zdarzenia ondrop, aby „upuszczała” przeciągany element.

73 gmail.com Instytut Informatyki U P-H w Siedlcach 73/231 Mechanizm przeciągnij upuść – efekt przeciągania (1) Aplikacja może definiować, co użytkownik może zrobić z treścią przeciąganą poza tę aplikację za pomocą tzw. efektu przeciągania. Efekt ten przypisuje się (najlepiej w metodzie ondragstart ) do atrybutu zdarzenia np. event.dataTransfer.effectAllowed = ‘copyMove’;

74 gmail.com Instytut Informatyki U P-H w Siedlcach 74/231 Mechanizm przeciągnij upuść – efekt przeciągania (2) Wartość dla efektu Znaczenie efektu none Przeciąganie jest zabronione copy Dane mogą być kopiowane link Dane mogą być podłączone (powiązane) z celem. W miejscu docelowym będzie odnośnik do oryginału – w ten sposób obiekt będzie współdzielony move Dane mogą być przeniesione z aplikacji copyLink Dane mogą być kopiowane lub podłączane copyMove Dane mogą być podłączone lub przenoszone all Na danych można wykonać wszystkie operacje Efekty przeciągania:

75 gmail.com Instytut Informatyki U P-H w Siedlcach 75/231 Mechanizm przeciągnij upuść – efekt upuszczania Aplikacja może definiować to co może się dziać z upuszczanym elementem poprzez ustawienie tzw. efektu upuszczania – dropEffect. Efekt ten najlepiej jest ustawić w obsłudze zdarzenia dragover lub dragenter. event.dataTransfer.dropEffect = ‘copy’; Adobe AIR aktualizuje kursor, aby poinformować użytkownika o tym, co będzie się działo po zwolnieniu przez niego lewego przycisku myszy. Efekt upuszczania musi zawierać się w zbiorze efektów przeciągania – w przeciwnym razie zostanie wyświetlony kursor świadczący o niedostępności operacji.

76 gmail.com Instytut Informatyki U P-H w Siedlcach 76/231 Obsługa plików i katalogów

77 gmail.com Instytut Informatyki U P-H w Siedlcach 77/231 Obsługa plików i katalogów - Klasy Adobe AIR udostępnia 3 główne klasy, które umożliwiają obsługę plików i katalogów: 1.File – najważniejsza klasa do obsługi plików i katalogów, 2.FileStream – klasa umożliwiająca odczytanie/zapisanie danych z/do pliku, 3.FileMode – klasa definiująca cztery stałe, wykorzystywane przez FileStream, definiujące tryb dostępu do pliku.

78 gmail.com Instytut Informatyki U P-H w Siedlcach 78/231 Obsługa plików i katalogów – obiekt klasy File (1) Klasa File umożliwia: tworzenie, usuwanie, przenoszenie, kopiowanie wybranych plików i katalogów. Do plików i katalogów (obiektów klasy File ) możemy odwoływać się na dwa sposoby: 1.poprzez utworzenie obiektu klasy File za pośrednictwem operatora new i podanie ścieżki natywnej (nazwy absolutnej) zależnej od OS. var file = new air.File(‘ścieżka’); 2.poprzez wykorzystanie predefiniowanych atrybutów. var file = air.File.atrybut

79 gmail.com Instytut Informatyki U P-H w Siedlcach 79/231 Obsługa plików i katalogów – obiekt klasy File (2) Wykorzystanie operatora new wygląda tak... var file = new air.File(‘ścieżka do pliku’);...lub tak: var file = new air.File(); file.nativePath = ‘ścieżka do pliku’; UWAGA: Aby pobrać separator dla danego OS, co jest b. przydatne należy wywołać air.File.separator.

80 gmail.com Instytut Informatyki U P-H w Siedlcach 80/231 Obsługa plików i katalogów – predefiniowane atrybuty Atrybut Ścieżka w systemie Windows XP userDirectoryC:\Documents and Settings\uzytkownik documentsDirectoryC:\Documents and Settings\uzytkownik\Moje dokumenty desktopDirectoryC:\Documents and Settings\uzytkownik\Pulpit applicationStorageDirectoryC:\Documents and Settings\uzytkownik\Dane Aplikacji applicationDirectory Katalog instalacyjny aplikacji Przykładowe użycie: var file = air.File.applicationDirectory; W celu odniesienia do specyficznych katalogów, możemy użyć następujących predefiniowanych atrybutów, które będą działały poprawnie pod każdym OS.

81 gmail.com Instytut Informatyki U P-H w Siedlcach 81/231 Obsługa plików i katalogów – dostęp do plików wewnątrz katalogów Aby skorzystać z plików, które znajdują się wewnątrz danego katalogu należy użyć metody resolvePath(). var directory = air.File.desktopDirectory; var file = directory.resolvePath(‘plik.txt’); lub bezpośrednio var file = air.File.desktopDirectory. resolvePath(‘plik.txt’);

82 gmail.com Instytut Informatyki U P-H w Siedlcach 82/231 Obsługa plików i katalogów – schematy W przypadku plików i katalogów dodatkowo można skorzystać z następujących nazw schematów: 1.file np. file://nazwahosta/katalog 2. app-storage np. new air.File(‘app-storage:/plik.txt’); znaczy tyle co: air.File.applicationStorageDirectory. resolvePath(‘plik.txt’); 3.app np. new air.File(‘app:/plik.txt’) znaczy tyle co: air.File.applicationDirectory. resolvePath(‘plik.txt’);

83 gmail.com Instytut Informatyki U P-H w Siedlcach 83/231 Obsługa plików i katalogów – okna przeglądania Do przeglądania plików i katalogów do dyspozycji mamy następujące metody klasy File : 1.browseForOpen(‘etykieta okna’) – otwiera się okno umożliwiające wybór pliku, 2.browseForOpenMultiple(‘etykieta okna’) – umożliwia wybranie wielu plików, 3.browseForDirectory(‘etykieta okna’) – umożliwia wskazanie katalogu.

84 gmail.com Instytut Informatyki U P-H w Siedlcach 84/231 Obsługa plików i katalogów – okna przeglądania – filtry W oknach wyboru browseForOpen i browseForOpenMultiple, można stosować filtry – FileFilter. Umożliwi to ograniczenie możliwości wyboru plików, tylko do wskazanych typów np. graficznych, tekstowych lub wideo.

85 gmail.com Instytut Informatyki U P-H w Siedlcach 85/231 Obsługa plików i katalogów – okna przeglądania – zdarzenia Zdarzenia związane z wyborem pliku lub katalogu można obserwować, w taki sposób... file.addEventListener(air.Event.SELECT, funkcjaObslugujaca);...lub taki: file.addEventListener(air.Event. SELECT_MULTIPLE, funkcjaObslugujaca);

86 gmail.com Instytut Informatyki U P-H w Siedlcach 86/231 Obsługa plików i katalogów – atrybuty klasy File WłaściwośćZnaczenie creationDate Data utworzenia pliku/katalogu exists Określa czy dany plik/katalog istnieje extention Przechowuje rozszerzenie pliku isDirectory Określa czy dany obiekt jest katalogiem isHidden Określa czy dany plik/katalog jest ukryty isSymbolicLink Określa, czy dany obiekt jest dowiązaniem symbolicznym modificationDate Data modyfikacji pliku/katalogu name Nazwa pliku/katalogu nativePath Pełna ścieżka i nazwa pliku parent Katalog nadrzędny size Rozmiar w bajtach url Adres URL do pliku Klasa air.File posiada wiele właściwości; najważniejsze z nich zostały przedstawione poniżej:

87 gmail.com Instytut Informatyki U P-H w Siedlcach 87/231 Obsługa plików i katalogów – listowanie zawartości katalogów W Adobe AIR można w bardzo łatwy sposób wylistować zawartość danego katalogu. Wystarczy tylko wywołać jedną z dwóch metod: 1.getDirectoryListing() – wersja synchroniczna, 2.getDirectoryListingAsync() – wersja asynchroniczna. Powyższe metody zwracają listę obiektów klasy File, z których każda reprezentuje pojedynczy element znajdujący się w danym katalogu.

88 gmail.com Instytut Informatyki U P-H w Siedlcach 88/231 Obsługa plików i katalogów – usuwanie Aby usunąć dany plik lub katalog należy wywołać od tego obiektu metodę deleteFile()/deleteFileAsync() lub deleteDirectory()/deleteDirectoryAsync() Aby usunąć katalog, który posiada jakąś zawartość należy wywołać metodę z argumentem true. deleteDirectory(true); Dany element można przenieść do kosza wywołując metody: moveToTrash()/moveToTrashAsync()

89 gmail.com Instytut Informatyki U P-H w Siedlcach 89/231 Obsługa plików i katalogów – tworzenie nowych plików i katalogów Aby utworzyć nowy katalog należy określić jego nazwę… var file = air.File. documentsDirectory(‘Nazwa nowego katalogu’); …a następnie wywołać metodę. file.createDirectory(); W analogiczny sposób tworzymy katalog tymczasowy… file.createTempDirectory(); …oraz plik tymczasowy… file.createTempFile(); UWAGA: Pliki i katalogi tymczasowe są usuwane po zamknięciu aplikacji.

90 gmail.com Instytut Informatyki U P-H w Siedlcach 90/231 Obsługa plików i katalogów – kopiowanie i przenoszenie Ważnymi operacjami na plikach i katalogach są kopiowanie i przenoszenie. Aby skopiować plik lub katalog, należy użyć poniższych konstrukcji.

91 gmail.com Instytut Informatyki U P-H w Siedlcach 91/231 Obsługa plików i katalogów – kopiowanie i przenoszenie Ważnymi operacjami na plikach i katalogach są kopiowanie i przenoszenie. W analogiczny sposób postępujemy w przypadku przenoszenia plików lub katalogów.

92 gmail.com Instytut Informatyki U P-H w Siedlcach 92/231 Praca wewnątrz plików – tryby pracy z plikami Stałe zdefiniowane w klasie FileMode, definiują tryb dostępu do pliku. Są wykorzystywane w metodzie open i openAsync klasy FileStream. StałaZnaczenie READ Otwiera plik do odczytu. WRITE Otwiera plik do zapisu. Plik jest tworzony jeśli nie istnieje. Jeśli plik istnieje, jego dotychczasowa zawartość jest usuwana. APPEND Otwiera plik do zapisu. Plik jest tworzony jeśli nie istnieje. Jeśli plik istnieje, dane są zapisywane na końcu pliku. UPDATE Otwiera plik do zapisu. Plik jest tworzony jeśli nie istnieje. Istniejące dane są nadpisywane

93 gmail.com Instytut Informatyki U P-H w Siedlcach 93/231 Praca wewnątrz plików – zapis danych tekstowych Aby zapisać dane do pliku tekstowego (w trybie synchronicznym) należy: 1.Utworzyć obiekty File i FileStream, 2.Otworzyć plik wywołując metodę open klasy FileStream, - należy w niej wskazać plik do otwarcia oraz tryb dostępu do tego pliku, 3.Zapisać dane wywołując metodę writeUTFBytes klasy FileStream, w której należy wskazać dane do zapisania, 4.Zamknąć strumień, wywołując metodę close ; Zawartość pliku Przed Zawartość pliku Po

94 gmail.com Instytut Informatyki U P-H w Siedlcach 94/231 Praca wewnątrz plików – odczyt danych tekstowych Aby odczytać dane z pliku tekstowego (w trybie synchronicznym) należy: 1.Utworzyć obiekty File i FileStream. 2.Otworzyć plik wywołując metodę open klasy FileStream, - należy w niej wskazać plik do otwarcia oraz tryb dostępu do tego pliku. 3.Odczytać dane wywołując metodę readUTFBytes klasy FileStream, w której należy wskazać liczbę bajtów do odczytania. 4.Zamknąć strumień, wywołując metodę close ; Zawartość plikuEfekt wykonania programu

95 gmail.com Instytut Informatyki U P-H w Siedlcach 95/231 Praca wewnątrz plików – dostęp swobodny do plików Klasa FileStream posiada właściwość position, którą można wykorzystać do swobodnego dostępu do pliku. Zmienna ta przechowuje bieżącą pozycję w pliku, od której rozpocznie się następna operacja odczytu lub zapisu. Domyślnie ma ona wartość 0. Kluczowe znaczenie ma przy operacjach aktualizacji związanych z trybem air.FileMode.UPDATE. Zawartość pliku PrzedZawartość pliku Po

96 gmail.com Instytut Informatyki U P-H w Siedlcach Do zapisu, aktualizacji lub dopisania do pliku można wykorzystać, metodę browseForSave klasy File. 96/231 Praca wewnątrz plików – zapis do pliku z wykorzystaniem okna

97 gmail.com Instytut Informatyki U P-H w Siedlcach 97/231 Praca wewnątrz plików – transakcje asynchroniczne  W przypadku operacji na dużych porcjach danych, lepiej jest zastosować mechanizm asynchroniczny.  Wykonanie transakcji asynchronicznych jest trudniejsze, bo wymaga napisania większej ilości kodu..

98 gmail.com Instytut Informatyki U P-H w Siedlcach 98/231 Praca wewnątrz plików – transakcje asynchroniczne – zdarzenia W przypadku asynchronicznego odczytu/zapisu danych należy obserwować następujące zdarzenia: 1.ProgressEvent.PROGRESS – wywoływana wielokrotnie podczas odczytu, gdyż dane wczytywane są porcjami, 2.OutputProgressEvent.OUTPUT_PROGRESS – wywoływania wielokrotnie podczas zapisywania danych – dane zapisywane są porcjami, 3.Event.COMPLETE – wywoływana po zakończeniu transakcji dotyczącej zapisu/odczytu.

99 gmail.com Instytut Informatyki U P-H w Siedlcach 99/231 Praca wewnątrz plików – transakcje asynchroniczne – zapis i odczyt W celu odczytania danych w sposób asynchroniczny należy użyć metody readMultiByte (), która przyjmuje 2 parametry:  liczbę bajtów do wczytania,  kodowanie znaków. np.’ iso ’. Analogicznie do obsługi asynchronicznej transakcji związanej z zapisem danych mamy do dyspozycji metodę writeMultiByte (), która przyjmuje również 2 parametry:  dane do zapisania,  kodowanie znaków.

100 gmail.com Instytut Informatyki U P-H w Siedlcach 100/231 Praca wewnątrz plików – transakcje asynchroniczne – przykład …

101 gmail.com Instytut Informatyki U P-H w Siedlcach 101/231 Praca wewnątrz plików – transakcje asynchroniczne – obsługa błędów W trakcie wykonywania operacji asynchronicznych mogą pojawić się błędy, w szczególności IOErrorEvent.IO_ERROR. Aby go obsłużyć, należy do strumienia FileStream dodać nasłuch. Inne błędy mogą dotyczyć nieistniejących plików, braku uprawnień i prób nadpisania istniejących plików i katalogów.

102 gmail.com Instytut Informatyki U P-H w Siedlcach 102/231 Praca wewnątrz plików – zapisywanie danych binarnych W przypadku pracy z danymi binarnymi należy wykorzystać klasę ByteArray, którą można traktować tak samo jak strumień do pliku.

103 gmail.com Instytut Informatyki U P-H w Siedlcach 103/231 Praca wewnątrz plików – odczyt danych binarnych W podobny sposób postępujemy w przypadku odczytania danych binarnych ze wskazanego pliku.

104 gmail.com Instytut Informatyki U P-H w Siedlcach 104/231 Obsługa baz danych

105 gmail.com Instytut Informatyki U P-H w Siedlcach 105/231 Obsługa baz danych – SQLite  Adobe AIR posiada wbudowany lekki system bazodanowy SQLite (spełniający w większości standard SQL92),  System ten jest bardzo łatwy w użyciu (stąd jego popularność),  System bazodanowy SQLite jest wykorzystywany m.in. przez przeglądarkę Firefox, silnik PHP i liczne urządzenia przenośne.  Najlepiej sprawdza się w średnich i małych systemach/witrynach, gdzie nie ma wymagań co do kontroli dostępu.

106 gmail.com Instytut Informatyki U P-H w Siedlcach 106/231 Obsługa baz danych – SQLite – rozmiar  Plik bazy SQLite może składać się z jednej lub większej liczby stron,  Wszystkie strony wewnątrz bazy posiadają taką samą wielkość strony – od 512B do 65536B (włącznie),  Maksymalna liczba stron  Minimalna wielkość pliku bazy – pojedyncza 512B strona.  Maksymalna wielkość pliku bazy –140,737,488,224,256 bajtów (około 140 TB).  Zazwyczaj wielkość pliku SQLite jest ograniczana dopuszczalną wielkością w systemie plików lub (sprzętowo) parametrami dysku twardego.  W większości przypadków baza ma rozmiar od kilku kilobajtów do kilku gigabajtów.

107 gmail.com Instytut Informatyki U P-H w Siedlcach 107/231 Obsługa baz danych – SQLite – zalety  Zawartość bazy danych przetrzymywana jest w jednym pliku binarnym.  SQLite jest utrzymywany na dysku przy użyciu drzew binarnych (dla każdej z tabel i każdego z indeksów używane jest osobne drzewo).  Do niewątpliwych zalet należą: 1.Możliwość korzystania z bazy danych bez potrzeby tworzenia nowego procesu, 2.Wysoka wydajność, szczególnie przy zapytaniach typu SELECT, INSERT, 3.Wieloplatformowość,

108 gmail.com Instytut Informatyki U P-H w Siedlcach 108/231 Obsługa baz danych – SQLite – wady i ograniczenia Do ograniczeń, należą: 1.Brak systemu zarządzania użytkownikami i uprawnieniami – każdy może otworzyć plik, dlatego programista samodzielnie musi implementować warstwę kontroli dostępu. 2.Niepełne wsparcie dla wyzwalaczy, 3.Niepełne wsparcie dla ALTER TABLE, 4.Podczas dopisywania danych, blokowany jest cały plik (baza), co przekłada się na stosunkowo małą skalowalność – słaba wydajność przy ciągłej modyfikacji pliku – w przypadku dużych systemów lepszym rozwiązaniem jest skorzystanie z baz danych MySQL lub PostgreSQL.

109 gmail.com Instytut Informatyki U P-H w Siedlcach 109/231 Obsługa baz danych – nawiązywanie połączenia Aby połączyć się z bazą danych należy: 1.Utworzyć obiekt SQLConnection, var con = new air.SQLConnection(); 2.Utworzyć obiekt File – każda baza w SQLite jest zwykłym plikiem, var dbFile = air.File.applicationStorageDirectory. resolvePath(‘baza.db’); 3.Otworzyć połączenie z bazą danych wywołując metodę open/openAsync od obiektu klasy SQLConnection. con.open(dbFile);

110 gmail.com Instytut Informatyki U P-H w Siedlcach 110/231 Obsługa baz danych – tworzenie bazy UWAGA: Baza danych zostanie utworzona w katalogu: C:\Documents and Settings\użytkownik\Dane Aplikacji\id\Magazyn Lokalny, gdzie, id jest identyfikatorem aplikacji zapisanym w pliku xml.

111 gmail.com Instytut Informatyki U P-H w Siedlcach 111/231 Obsługa baz danych – tryby pracy Metoda open/openAsync może zostać wywołana z dodatkowym parametrem określającym tryb pracy z bazą danych. Tryby pracy są zapisane w stałych klasy SQLMode. StałaZnaczenie CREATE Baza zostanie utworzona w przypadku jej braku, UPDATE Baza danych zostanie otworzona w trybie do aktualizacji, READ Baza danych będzie otworzona w trybie do odczytu – nie będzie można modyfikować/usuwać/wstawiać rekordów, Przykładowe użycie: con.open(dbFile, air.SQLMode.CREATE);

112 gmail.com Instytut Informatyki U P-H w Siedlcach 112/231 Obsługa baz danych – obsługiwane typy danych SQLite obsługuje tylko 4 typy danych, które zostały przedstawione poniżej: Nazwa typuZnaczenie INTEGER Liczby całkowite ze znakami REAL Liczby zmiennoprzecinkowe TEXT Dane tekstowe BLOB Dane binarne Mimo, że nie istnieje typ reprezentujący datę i czas, można skorzystać z typu tekstowego.

113 gmail.com Instytut Informatyki U P-H w Siedlcach 113/231 Obsługa baz danych – wykonywanie zapytań Do wykonywania zapytań do baz danych służy klasa SQLStatement. Aby wykonać zapytanie na bazie danych należy: 1.Otworzyć połączenie z bazą danych var con … 2.Utworzyć obiekt SQLStatement var stmt = new air.SQLStatement(); 3.Do właściwości sqlConnection obiektu klasy SQLStatement przypisać utworzone wcześniej połączenie z bazą danych. stmt.sqlConnection = con; 4.Do właściwości text, obiektu klasy SQLStatement, przypisać zapytanie. stmt.text = ‘CREATE TABLE …’; 5.Wywołać metodę execute od obiektu klasy SQLStatement. stmt.execute(); 6.Zamknąć połączenie z bazą danych wywołujące metodę close.

114 gmail.com Instytut Informatyki U P-H w Siedlcach 114/231 Obsługa baz danych – poprawianie wydajności SQLConnection posiada właściwości autoCompact i pageSize, które mają znaczący wpływ na wielkość i zachowanie bazy danych. Obie właściwości można ustawić przy wywołaniu metody open lub openAsync tworzących nową bazę danych.  autoCompact – wskazuje, czy podczas tworzenia bieżącej bazy danych ma być włączona funkcja automatycznej defragmentacji,  pageSize – wskazuje rozmiar bazy danych (w bajtach) określony w momencie tworzenia bieżącej bazy danych.

115 gmail.com Instytut Informatyki U P-H w Siedlcach 115/231 Obsługa baz danych – wykonywanie zapytań – przykład Przykładowe operacje wykonane na bazie danych

116 gmail.com Instytut Informatyki U P-H w Siedlcach 116/231 Obsługa baz danych – pobieranie rekordów W przypadku wykonywania zapytania typu SELECT, rezultat wykonania (obiekt klasy SQLResult ) możemy pobrać wywołując metodę getResult() od obiektu SQLStatement. Można pobrać wartość automatycznie inkrementowanego klucza głównego: var result = stmt.getResult(); var pk = result.lastInsertRowID;

117 gmail.com Instytut Informatyki U P-H w Siedlcach 117/231 Obsługa baz danych – pobieranie rekordów – przykład

118 gmail.com Instytut Informatyki U P-H w Siedlcach 118/231 Obsługa baz danych – wykonywanie asynchronicznych zapytań – przykład W przypadku zapytań asynchronicznych, należy dodać słuchaczy zdarzeń dla:  obiektu SQLConnection, zdarzenie SQLEvent.OPEN.  obiektu klasy SQLStatement, zdarzenie SQLEvent.RESULT.

119 gmail.com Instytut Informatyki U P-H w Siedlcach 119/231 Obsługa baz danych – obsługa błędów W aplikacji mogą pojawiać się błędy związane z operacjami na bazie danych. Aby je obsłużyć należy: 1.dla transakcji synchronicznych kod, który może spowodować błędy zawrzeć w bloku try…catch…finally. 2.dla transakcji asynchronicznych dodać słuchacza zdarzenia SQLErrorEvent.ERROR do obiektów klas SQLConnection, SQLStatement.

120 gmail.com Instytut Informatyki U P-H w Siedlcach 120/231 Obsługa baz danych – obsługa błędów – opis błędów Błędy powstałe w czasie operacji na DB są opisane poprzez obiekt klasy SQLError. Klasa ta posiada kilka właściwości, które zostały przedstawione poniżej: WłaściwośćZnaczenie message Komunikat o błędzie details Szczegóły błędu operation Określa operację, która była wykonana w momencie powstania błędu errorID Identyfikator błędu

121 gmail.com Instytut Informatyki U P-H w Siedlcach 121/231 Obsługa baz danych – obsługa błędów – przykład (1) Przykład obsługi błędów w operacjach asynchronicznych

122 gmail.com Instytut Informatyki U P-H w Siedlcach 122/231 Obsługa baz danych – obsługa błędów – przykład (2) Przykład obsługi błędów w operacjach synchronicznych Rezultat działania obu programów

123 gmail.com Instytut Informatyki U P-H w Siedlcach 123/231 Obsługa baz danych – rozpowszechnianie baz danych Pomimo, że aplikacja jest w stanie utworzyć nową bazę danych (dzięki specjalnej konstrukcji SQL), lepszym rozwiązaniem jest utworzenie jej na etapie projektowym, w celu późniejszego rozpowszechniania. Bezpośrednio po zainstalowaniu aplikacji, baza danych znajduje się w katalogu instalacyjnym i należy ją przekopiować do magazynu danych użytkownika.

124 gmail.com Instytut Informatyki U P-H w Siedlcach 124/231 Obsługa baz danych – zapytania parametryzowane Większość systemów bazodanowych obsługuje tzw. zapytania parametryzowane. Z ich stosowania wynikają dwie korzyści: 1.Pozwalają one uniknąć potencjalnych niebezpieczeństw związanych z SQL injection, 2.Zwiększają wydajność aplikacji, gdyż dane zapytanie jest analizowane pod kątem składni tylko raz – wielokrotne wykonanie tego samego zapytania z różnymi parametrami będzie wykonywało się dużo szybciej w porównaniu do zwykłych zapytań.

125 gmail.com Instytut Informatyki U P-H w Siedlcach 125/231 Obsługa baz danych – zapytania parametryzowane – typy parametrów W zapytaniach parametryzowanych zamiast konkretnych wartości stosuje się specjalne parametry. Parametry te dzielimy na dwa typy: 2.Parametry jawne lub :nazwaParametru 1.Parametry anonimowe – ‘ ? ’

126 gmail.com Instytut Informatyki U P-H w Siedlcach 126/231 Obsługa baz danych – porcjonowanie wyników Jeśli zapytanie zwraca wiele wyników, aplikacja może działać niewydajnie nawet pomimo stosowania zapytań asynchronicznych. Rozwiązaniem tego problemu jest porcjonowanie wyników. W metodzie execute obiektu klasy SQLStatement, można umieścić parametr mówiący o liczbie rekordów do pobrania. stmt.execute(20); Aby pobrać kolejne rekordy z bazy danych trzeba wywołać metodę next, również z parametrem mówiącym o liczbie rekordów. if(!stmt.getResult().complete) stmt.next(10);

127 gmail.com Instytut Informatyki U P-H w Siedlcach 127/231 Obsługa baz danych – obsługa transakcji Transakcje w SQLite są wspierane w postaci 3 metod obiektu klasy SQLConnection. 1.begin – rozpoczęcie transakcji, 2.commit – zatwierdzenie transakcji, 3.rollback – wycofanie (unieważnienie) transakcji. Wszystkie operacje SQL dokonane pomiędzy wywołaniem metody begin, a commit nie są przeprowadzane w trwały sposób. Dopiero metoda commit utrwala wyniki działania wszystkich operacji na DB, Jeśli jakaś operacja cząstkowa (wchodząca w skład danej transakcji) na DB się nie powiedzie, można unieważnić rezultaty działania wcześniejszych operacji (w ramach tej samej transakcji) wywołując metodę rollback.

128 gmail.com Instytut Informatyki U P-H w Siedlcach 128/231 Obsługa sieci

129 gmail.com Instytut Informatyki U P-H w Siedlcach 129/231 Obsługa sieci – API do obsługi sieci Adobe AIR oferuje bogaty wachlarz możliwości sieciowych. Oprócz klasy XMLHttpRequest, która wchodzi w skład standardowych bibliotek JavaScript do obsługi sieci można wykorzystywać następujący zbiór klas z Adobe AIR API: KlasaOpis URLRequest Klasa identyfikująca źródło danych zlokalizowanych w sieci, URLMonitor Klasa umożliwiająca sprawdzenie dostępności zasobu w sieci, URLLoader Klasa umożliwiająca pobranie/wysłanie danych do/z sieci. Źródło musi być podane jako URL, URLStream Klasa dostarczająca niskopoziomowego dostępu do danych binarnych, Socket Klasa umożliwiająca nawiązanie połączenia trwałego, SocketMonitor Klasa umożliwiająca badanie połączenia sieciowego

130 gmail.com Instytut Informatyki U P-H w Siedlcach 130/231 Obsługa sieci – asynchroniczne połączenia XMLHttpRequest – przykład

131 gmail.com Instytut Informatyki U P-H w Siedlcach 131/231 Obsługa sieci – zasoby URL Obiekty klasy URLRequest zawierają referencje do zasobów, z którymi będzie nawiązywane połączenie. Obiekt tego typu może wykorzystywać różne schematy: file, http, https, app, app-storage. Zasoby można monitorować używając klasy URLMonitor. Aby móc skorzystać z tej klasy należy dołączyć servicemonitor.swf.

132 gmail.com Instytut Informatyki U P-H w Siedlcach 132/231 Obsługa sieci – monitorowanie zasobów URL (1) Aby sprawdzić dostępność danego zasobu należy: 1.Utworzyć obiekt klasy URLRequest, przekazując jako parametr konstruktora adres URL zasobu, var request = new air.URLRequest(‘adresUrl’); 2.Utworzyć obiekt klasy URLMonitor, przekazując jako parametr konstruktora utworzony wcześniej obiekt żądania, var monitor = new air.URLMonitor(request); 3.Dodać słuchacza zdarzenia StatusEvent.STATUS do obiektu monitora, monitor.addEventListener(air.StatusEvent.STATUS, funkcjaObsługująca);

133 gmail.com Instytut Informatyki U P-H w Siedlcach 133/231 Obsługa sieci – monitorowanie zasobów URL (2) 4.Uruchomić monitor, monitor.start(); 5.Sprawdzić zmienną available monitora w funkcji obsługowej z kroku 3, monitor.available;

134 gmail.com Instytut Informatyki U P-H w Siedlcach 134/231 Obsługa sieci – monitorowanie zasobów URL – przykład

135 gmail.com Instytut Informatyki U P-H w Siedlcach 135/231 Obsługa sieci – pobieranie danych z zasobów URL Aby pobrać dane ze zdalnego serwera należy: 1.Utworzyć obiekt klasy URLRequest, przekazując jako parametr konstruktora adres URL zasobu, var request = new air.URLRequest(‘adresUrl’); 2.Utworzyć obiekt „ładujący” klasy URLLoader, var loader = new air.URLLoader(); 3.Dodać słuchacza zdarzenia Event.COMPLETE do obiektu „ładującego”, loader.addEventListener(air.Event.COMPLETE, funkcjaObsługująca); 4.I na koniec pobrać dane wywołując metodę load() z parametrem, którym jest obiekt utworzony w kroku 1. loader.load(request);

136 gmail.com Instytut Informatyki U P-H w Siedlcach 136/231 Obsługa sieci – pobieranie danych z zasobów URL – przykład

137 gmail.com Instytut Informatyki U P-H w Siedlcach 137/231 Obsługa sieci – pobieranie danych z zasobów URL – formaty danych Pobrane dane mogą być w różnym formacie (nie tylko w postaci zwykłego tekstu). Po pobraniu danych w jakimś formacie należy powiadomić o tym obiekt klasy URLLoader ustawiając jego właściwość dataFormat na jeden z typów:  URLLoaderDataFormat.TEXT – dane tekstowe (domyślnie),  URLLoaderDataFormat.VARIABLES – dane w postaci klucz1=wartość1&klucz2=wartość2,  URLLoaderDataFormat.BINARY – dane binarne, loader.dataFormat = air.URLLoaderDataFormat.VARIABLES; UWAGA: W przypadku danych w postaci XML, lepiej jest skorzystać z XMLHttpRequest lub potraktować dane jako dane tekstowe, a następnie użyć obiekt klasy DOMParser.

138 gmail.com Instytut Informatyki U P-H w Siedlcach 138/231 Obsługa sieci – pobieranie danych z zasobów URL – przetwarzanie Po ustawieniu zmiennej dataFormat na URLLoaderDataFormat.VARIABLES, zmienna data będzie obiektem klasy URLVariables. Obiekt udostępnia dane pobrane z serwera już po ich sparsowaniu(przetworzeniu).

139 gmail.com Instytut Informatyki U P-H w Siedlcach 139/231 Obsługa sieci – pobieranie danych z zasobów URL – przetwarzanie Obiekt URLVariables można również uzyskać wstawiając do konstruktora odpowiednio sformatowane dane tekstowe. var variables = new air.URLVariables(‘klucz=wartość’); var value = variables.klucz;

140 gmail.com Instytut Informatyki U P-H w Siedlcach 140/231 Obsługa sieci – wysyłanie danych do zasobów URL Aplikacje Adobe AIR mają możliwość wysyłania danych do sieci(np. modyfikują wpis w sieciowej bazie danych). Aby wysłać dane do sieci należy określić dwie właściwości obiektu klasy URLRequest: 1.method – określa sposób wykonania żądania. Jest ją najczęściej URLRequestMethod.GET (wartość domyślna) lub URLRequestMethod.POST, 2.data – dane do wysłania.

141 gmail.com Instytut Informatyki U P-H w Siedlcach 141/231 Obsługa sieci – pobieranie danych binarnych z zasobów URL W przypadku pobierania danych binarnych (np. skompresowanego pliku), można wprawdzie posłużyć się obiektem klasy URLLoader,......jednak lepszym rozwiązaniem jest wykorzystanie URLStream, która jest analogiczna w obsłudze co FileStream.

142 gmail.com Instytut Informatyki U P-H w Siedlcach 142/231 Obsługa sieci – pobieranie danych binarnych z zasobów URL Aby pobrać binarny plik należy: 1.Utworzyć obiekty klas URLRequest i URLStream, var request = new air.URLRequest(‘adres URL’); var stream = new air.URLStream(); 2.Dodać obsługę zdarzenia Event.COMPLETE i (w przypadku dużych plików) ProgressEvent.PROGRESS. stream.addEventListener(air.Event.COMPLETE, handleComplete); stream.addEventListener(air.ProgressEvent. PROGRESS, handleProgress); 3.Wywołać metodę load obiektu klasy URLStream, w celu rozpoczęcia procesu pobierania danych binarnych. stream.load(request);

143 gmail.com Instytut Informatyki U P-H w Siedlcach 143/231 Obsługa sieci – pobieranie danych binarnych z zasobów URL – przykład Aby uzyskać dostęp do pobranych danych trzeba skopiować je do tablicy bajtów ( ByteArray ), wywołując metodę readBytes obiektu klasy URLStream. Na zakończenie należy zamknąć strumień – metoda close().

144 gmail.com Instytut Informatyki U P-H w Siedlcach 144/231 Obsługa sieci – gniazda TCP Jeśli chcemy monitorować konkretny port, należy wykorzystać klasę SocketMonitor. var socket, monitor; function checkPort(){ monitor = new SocketMonitor("www.adobe.com", 6667); monitor.addEventListener(air.StatusEvent.STATUS, onSocketStatus); monitor.start(); } function onSocketStatus(e){ if(monitor.available){ socket = new Socket(); socket.addEventListener(air.Event.CONNECT, onConnect); socket.addEventListener(air.DataEvent.DATA, onData); socket.connect("www.adobe.com", 6667); socket.send("dataToSend"); }else alert('Połączenie nie zostało nawiązane'); } function onData(e){ alert("[" + e.type + "] " + e.data); }

145 gmail.com Instytut Informatyki U P-H w Siedlcach 145/231 Obsługa sieci – wysyłanie danych binarnych do zasobów URL (1) Dane binarne można wysyłać na różne sposoby: 1.Skorzystać z klas Socket i SocketMonitor. 2.Skorzystać z obiektu klasy URLRequest i URLLoader – w tym przypadku należy ustawić właściwości odpowiednie właściwości obu obiektów:

146 gmail.com Instytut Informatyki U P-H w Siedlcach 146/231 Obsługa sieci – wysyłanie danych binarnych do zasobów URL (2) 3.A w przypadku przesyłania plików wykorzystać klasę File, definiującą metodę upload(), która działa asynchronicznie. Można obserwować zdarzenie Event.COMPLETE i ProgressEvent.PROGRESS. Drugi parametr metody upload należy traktować jako odpowiednik nazwy pola typu file w formularzu HTML

147 gmail.com Instytut Informatyki U P-H w Siedlcach 147/231 Obsługa mediów

148 gmail.com Instytut Informatyki U P-H w Siedlcach 148/231 Obsługa mediów – obsługiwane typy mediów Adobe AIR obsługuje takie media jak:  Dźwięki (bezpośrednio tylko w formacie MP3),  Wideo w formatach FLV(Flash Video), MP4 i H.264.  Dokumenty PDF,  Dokumenty XML,  Technologia DRM (Digital Rights Management) – zarządzanie prawami do cyfrowych danych. W ten sposób można skontrolować pliki FLV i MP4. Ponadto w aplikacjach Adobe AIR (analogicznie jak w zwykłych stronach HTML) można osadzać wszelkiego rodzaju wtyczki.

149 gmail.com Instytut Informatyki U P-H w Siedlcach 149/231 Obsługa dźwięków – obsługiwane typy W zakresie obsługi dźwięków mamy następujące możliwości:  Załadowanie i odtworzenie zewnętrznego pliku MP3,  Załadowanie i odtworzenie dźwięków osadzonych plikach SWF, poprzez użycie ) – mogą to być dźwięki w formacie WAVE lub AIFF,  Pobranie danych audio z mikrofonu podłączonego do komputera użytkownika i przekierowanie ich na głośniki,  Dostęp do danych w sposób strumieniowy,  Dynamiczne (programowe) generowanie lub przetwarzanie dźwięków.

150 gmail.com Instytut Informatyki U P-H w Siedlcach 150/231 Obsługa dźwięków – API do obsługi dźwięków (1) W zakresie obsługi dźwięków mamy następujące klasy: Obsługa mediów – obsługa dokumentów XML KlasaOpis Sound Klasa umożliwiająca załadowanie dźwięku, zarządzanie jego podstawowymi właściwościami oraz rozpoczęcie odtwarzania, SoundChannel Każdy odtwarzany dźwięk posiada swój własny obiekt tej klasy. Kontroluje on głośność lewego i prawego kanału dźwiękowego. SoundLoaderContext Określa ile dźwięku (czasu w milisekundach) musi być załadowane, zanim rozpocznie się odtwarzanie. Ponadto określa czy mają być sprawdzane uprawnienia międzydomenowe.

151 gmail.com Instytut Informatyki U P-H w Siedlcach 151/231 Obsługa dźwięków – API do obsługi dźwięków (2) Obsługa mediów – obsługa dokumentów XML KlasaOpis SoundMixer Umożliwia m.in dostęp do surowych danych dźwiękowych oraz łączenie kilku dźwięków w jeden, SoundTransform Umożliwia on kontrolę głośności i balansu. Obiekt tej klasy współpracuje z obiektem klasy SoundChannel. ID3Info Przechowuje informacje o pliku MP3 w formacie ID3. Microphone Reprezentuje mikrofon lub inne urządzenie wejściowe dostarczające dźwięków. W zakresie obsługi dźwięków mamy następujące klasy:

152 gmail.com Instytut Informatyki U P-H w Siedlcach 152/231 Obsługa dźwięków – odtwarzanie Aby odtworzyć dźwięk z lokalnego lub zdalnego źródła należy: 1.Utworzyć obiekt klasy URLRequest, wskazując adres źródła. var url = new air.URLRequest(‘app:/sound.mp3’); lub var url = new air.URLRequest(‘http://adresHosta/sound.mp3’); 2.Utworzyć obiekt klasy Sound(). var sound = new air.Sound(); 3.Pobrać plik dźwiękowy wywołując metodę load() od obiektu klasy Sound. sound.load(url); 4.I wreszcie odtworzyć plik dźwiękowy wywołjuąc metody play() obiektu klasy Sound ; sound.play();

153 gmail.com Instytut Informatyki U P-H w Siedlcach 153/231 Obsługa dźwięków – odtwarzanie – typy zdarzeń Z obsługą dźwięków mamy możliwość obserwowania kilku zdarzeń związanych z klasą Sound. ZdarzenieOpis Event.OPEN Generowane bezpośrednio przed pobraniem danych, ProgressEvent.PROGRESS Generowane wielokrotne w czasie ładowania danych z pliku lub strumienia, Event.ID3 Generowane, gdy dostępne są dane ID3 dla plik MP3, Event.COMPLETE Generowane, gdy dane zostały załadowane, IOErrorEvent.IO_ERROR Generowane,gdy wystąpi problem I/O. Dodatkowo z klasą SoundChannel związane jest zdarzenie Event.SOUND_COMPLETE, generowane po zakończeniu odtwarzania danych dźwiękowych.

154 gmail.com Instytut Informatyki U P-H w Siedlcach 154/231 Obsługa dźwięków – odtwarzanie długich dźwięków Dłuższe pliki dźwiękowe (np. te pobierane z Internetu) trzeba traktować trochę inaczej, gdyż ich pobranie zajmuje więcej czasu. Próba odtworzenia nie do końca załadowanego pliku może spowodować problemy. Do upewnienia się czy plik został już pobrany należy dodać do obiektu Sound słuchacza zdarzenia Event.COMPLETE. Dodatkowo należy obsłużyć zdarzenie związane z wystąpieniem błędu I/O – IOErrorEvent.IO_ERROR.

155 gmail.com Instytut Informatyki U P-H w Siedlcach 155/231 Obsługa dźwięków – odtwarzanie długich dźwięków - przykład

156 gmail.com Instytut Informatyki U P-H w Siedlcach 156/231 Obsługa dźwięków – strumieniowe odtwarzanie dźwięków (1)  Pliki multimedialne (dźwięki, wideo) są często pobierane z Internetu i odtwarzane w sposób strumieniowy.  Odebrane dane są buforowane, a player ogrywa je, jeśli uzna, że jest ich wystarczająco w buforze.  Do obsługi danych w sposób strumieniowy należy użyć klasy SoundLoaderContext, której konstruktor przyjmuje 2 argumenty:  bufferTime – długość odtwarzanego pliku w milisekundach, która ma zostać pobrana przed rozpoczęciem odtwarzania,  checkPolicyFile – wartość logiczna określająca, czy aplikacja powinna wyszukiwać plik zabezpieczeń miedzydomenowych na serwerze w momencie pobierania pliku.

157 gmail.com Instytut Informatyki U P-H w Siedlcach 157/231 Obsługa dźwięków – strumieniowe odtwarzanie dźwięków (2) Aby odtwarzać plik dźwiękowy strumieniowo: 1.Utworzyć obiekty klas URLRequest, Sound i SoundLoaderContext. 2.Dodać do obiektu Sound obsługę zdarzenia ProgressEvent.PROGRESS. 3.Wywołać metodę load, przekazując jej oprócz obiektu URLRequest także obiekt SoundLoaderContext. 4.Na koniec należy wywołać metodę play (); Uwaga: Zdarzenie ProgressEvent.PROGRESS posiada właściwości:  bytesLoaded – licznik załadowanych bajtów,  bytesTotal – całkowita wielkość pliku w bajtach.

158 gmail.com Instytut Informatyki U P-H w Siedlcach 158/231 Obsługa dźwięków – strumieniowe odtwarzanie dźwięków – przykład

159 gmail.com Instytut Informatyki U P-H w Siedlcach 159/231 Obsługa dźwięków – kontrola odtwarzania W aplikacjach Adobe AIR można pozwolić sobie na większy zakres operacji niż tylko play(). 1.Wstrzymanie dźwięku, 2.Ponowne odtwarzanie wstrzymanego dźwięku, 3.Obserwację odtwarzanego utworu, 4.Zmianę głośności, 5.Zmianę balansu – lewy-prawy głośnik. Do kontroli odtwarzania służą SoundChannel i SoundTransform.

160 gmail.com Instytut Informatyki U P-H w Siedlcach 160/231 Obsługa dźwięków – kontrola odtwarzania - pauzowanie W bibliotece AIR nie istnieje bezpośrednia funkcja umożliwiająca pauzowanie odtwarzanego dźwięku. Zamiast tego metoda play() może przyjąć jako argument czas (w milisekundach) od którego powinno zacząć się odtwarzanie. player.play(czas_w_milisekundach); W czasie pauzowania, aplikacja musi, więc zapamiętać miejsce, w którym odtwarzanie zostało przerwane. Metoda play zwraca obiekt klasy SoundChannel … var sc = player.play();

161 gmail.com Instytut Informatyki U P-H w Siedlcach 161/231 Obsługa dźwięków – kontrola odtwarzania - pauzowanie  Obiekt klasy SoundChannel, z kolei posiada właściwość position, przetrzymującą bieżącą pozycję odtwarzania. var position = sc.position;  Ponadto posiada metodę stop() umożliwiającą zatrzymanie odtwarzania. sc.stop();

162 gmail.com Instytut Informatyki U P-H w Siedlcach 162/231 Obsługa dźwięków – kontrola odtwarzania – pauzowanie – przykład Pauzowany dźwięk może pochodzić z pliku, albo ze strumienia. Metoda stop, klasy SoundChannel, zatrzymuje odtwarzanie. W celu przerwania pobierania danych należy wywołać metodę close(), klasy Sound.

163 gmail.com Instytut Informatyki U P-H w Siedlcach 163/231 Obsługa dźwięków – kontrola odtwarzania – głośność i balans (1)  Głośność dźwięku i jego balans może być kontrolowany przez obiekt klasy SoundTransform.  Konstruktor tej klasy posiada 2 argumenty:  głośność – liczba z zakresu od 0 (wyciszony) do 1 (pełna głośność),  balans – liczba z zakresu od -1(dźwięk jest wysyłany tylko na lewy kanał) do 1 (dźwięk jest wysyłany tylko na prawy kanał). Wartość 0 oznacza, że 2 kanały otrzymują ten sam poziom dźwięku. var st = new SoundTransfer(0.8, 0);  Aby skojarzyć obiekt klasy SoundTransform z odtwarzanym dźwiękiem, należy użyć w wywołaniu metody play. player.play(position, st);

164 gmail.com Instytut Informatyki U P-H w Siedlcach 164/231 Obsługa dźwięków – kontrola odtwarzania – głośność i balans (2)  Głośność i balans można kontrolować ustawiając odpowiednie właściwości obiektu klasy SoundTransform : st.volume = 1; st.pan = -1;  Dodatkowo metoda play może przyjmować argument, który określa ile razy dany dźwięk ma zostać odtworzony (wartość 0 oznacza, że dźwięk będzie odtworzony tylko raz). player.play(position, 0, st);

165 gmail.com Instytut Informatyki U P-H w Siedlcach 165/231 Obsługa dźwięków – kontrola odtwarzania – głośność i balans (3) UWAGA: Obiekt klasy SoundTransform jest skojarzony tylko z pojedynczym utworem. Aby zastosować ustawienia globalnie należy użyć obiektu klasy SoundMixer. soundMixer.soundTransform = new air.SoundTransform(1, -1);

166 gmail.com Instytut Informatyki U P-H w Siedlcach 166/231 Obsługa dźwięków – kontrola głośności i balansu – przykład (cz. 1) Można również obserwować zdarzenie związane z zakończeniem odtwarzania dźwięku

167 gmail.com Instytut Informatyki U P-H w Siedlcach 167/231 Obsługa dźwięków – kontrola głośności i balansu – przykład (cz. 2) Po zmianie głośności lub balansu należy obiekt klasy SoundTransform przypisać do zmiennej soundTransform, obiektu klasy SoundChannel.

168 gmail.com Instytut Informatyki U P-H w Siedlcach 168/231 Obsługa dźwięków – znaczniki ID3  Format MP3 wykorzystuje specjalne metadane w formacie ID3 do przechowywania informacji na temat zawartości pliku dźwiękowego. Atrybut znacznika ID3Opis songName nazwa utworu artist wykonawca genre rodzaj muzyki album nazwa albumu track numer utworu w albumie year data wydania TIME całkowita długość pliku TRDA data nagrywania comment komentarz  Poniżej lista niektórych właściwości znacznika ID3.

169 gmail.com Instytut Informatyki U P-H w Siedlcach 169/231 Obsługa dźwięków – znaczniki ID3 – przykłady Informacje na temat znacznika ID3 są dostępne we właściwości id3 obiektu klasy Sound. Nie każdy plik MP3 posiada tę właściwość, dlatego aplikacja powinna ją odczytywać po wystąpieniu zdarzenia Event.ID3. ID3v1

170 gmail.com Instytut Informatyki U P-H w Siedlcach 170/231 Obsługa dźwięków – znaczniki ID3 – przykłady UWAGA: Dostęp do znaczników ID3 zależy również od kwestii bezpieczeństwa i konfiguracji SoundContextLoader. ID3v2

171 gmail.com Instytut Informatyki U P-H w Siedlcach 171/231 Obsługa dźwięków – dostęp do surowych danych  Metoda SoundMixer.computeSpectrum() umożliwia dostęp do surowych danych dźwiękowych, które są w danej chwili odtwarzane.  Może ona przyjmować 3 parametry: 1.bytes – obiekt klasy ByteArray – zawiera 512*4 bajtów danych, po 256*4 na kanał. Każdy element reprezentuje wartość rzeczywistą z zakresu (-1,1) i odzwierciedla amplitudę dźwięku. 2.FFTMode – włączenie/wyłączenie Szybkiej Transformaty Furiera (FFT), gdy flaga jest ustawiona dane binarne reprezentują widmo częstotliwości, a nie postać falową. Przy ustawionej fladze wartości w tablicy bajtów są z zakresu 0 do (pierwiastek z 2) 3.stretchFactor - parametr kontrolujący tempo próbkowania danych dźwiękowych. Gdy parametr jest ustawiony na 0 (domyślnie), dane dźwiękowe są próbkowane z częstotliwością 44.1 kHz. Dla wartości 1 częstotliwość wynosi kHz, dla kHz itd.

172 gmail.com Instytut Informatyki U P-H w Siedlcach 172/231 Obsługa dźwięków – dostęp do surowych danych Program reaguje na aktualne ustawienia SoundTransform. Po prawej wizualizacja z wyciszoną głośnością Zwiększenie wartości stretchFactor powoduje wygładzenie postaci fali lub częstotliwości kosztem szczegółów. (Wynik dla stretchFactor = 10 poniżej)

173 gmail.com Instytut Informatyki U P-H w Siedlcach 173/231 Obsługa wideo – możliwości W zakresie obsługi wideo mamy następujące możliwości:  Załadowanie i odtworzenie lokalnego pliku wideo,  Przechwytywanie danych wideo z kamery podłączonej do komputera użytkownika i wyświetlenie ich w GUI, lub wysłanie na serwer.  Dostęp do danych w sposób strumieniowy,  Użycie składnika FLVPlayback.  Programowa manipulacja obiektami wyświetlanymi, taka jak transformacje macierzowe i filtry,

174 gmail.com Instytut Informatyki U P-H w Siedlcach 174/231 Obsługa wideo – klasy(1) W zakresie obsługi wideo w Adobe AIR do dyspozycji mamy następujące klasy: Nazwa klasyOpis Video Umożliwia wyświetlenie treści wideo w GUI. NetStream Reprezentuje strumień danych wideo. NetStreamInfo Zawiera informacje umożliwiające monitorowanie procesu odtwarzania wideo NetConnection Używany wraz z instancją klasy NetStream i reprezentuje połączenie z plikiem wideo.

175 gmail.com Instytut Informatyki U P-H w Siedlcach 175/231 Obsługa wideo – klasy(2) Nazwa klasyOpis SoundTranform Do sterowania głośnością odtwarzania wideo. Camera Umożliwia pracę z danymi wideo z kamery podłączonej do komputera użytkownika. Reprezentuje źródło treści wideo — kamerę wideo użytkownika i dane wideo, które ta kamera udostępnia. StageVideo Pozwala stosować w aplikacji wyświetlanie z przyspieszeniem sprzętowym

176 gmail.com Instytut Informatyki U P-H w Siedlcach 176/231 Obsługa wideo – odtwarzanie Aby odtwarzać plik wideo należy: 1.Utworzyć obiekt klasy NetConnection. 2.Wywołać na tym obiekcie metodę connect() z parametrem null (w celu odtwarzania pliku spod adresu HTTP lub z dysku lokalnego) lub adresem URI(w przypadku nawiązania połączenia z serwerem). 3.Utworzyć obiekt klasy Video, i dodać go do aplikacji. 4.Utworzyć obiekt NetStream, przekazując obiekt NetConnection jako argument konstruktora. 5.Podłączyć do obiektu Video obiekt strumienia przy użyciu funkcji attachNetStream. 6.Uruchomić ładowanie pliku za pomocą metody play() przekazując jako parametr nazwę pliku do odtworzenia.

177 gmail.com Instytut Informatyki U P-H w Siedlcach 177/231 Obsługa wideo – odtwarzanie – przykład //Utworzenie obiektu połączenia var nc = new air.NetConnection(); //Połączenie z (w tym przypadku lokalnym) zasobem nc.connect(null); //Utworzenie obiektu wyświetlającego treść wideo(domyślnie 320x240) var vid = new air.Video(); //Dodanie obiektu do stołu montażowego window.htmlLoader.stage.addChild(vid); //Utworzenie obiektu strumienia i skojarzenie go z obiektem połączenia var ns = new air.NetStream(nc); //Podłączenie strumienia do obiektu Video vid.attachNetStream(ns); //Uruchomienie odtwarzania ns.play("sample.flv"); //ns.play("http://www.helpexamples.com/flash/video/water.flv"); "

178 gmail.com Instytut Informatyki U P-H w Siedlcach 178/231 Obsługa wideo – sterowanie odtwarzaniem Proces odtwarzania wideo można kontrolować za pomocą następujących funkcji należących do klasy NetStream. Nazwa klasyOpis pause Wstrzymuje odtwarzanie wideo. resume Wznawia odtwarzanie wideo. seek Wyszukuje klatkę kluczową znajdującą się najbliżej określonego miejsca (przesunięcia w sekundach względem początku strumienia). Jako, że nie istnieje metoda stop(), aby zatrzymać odtwarzanie strumienia, należy wstrzymać odtwarzanie i przejść ( seek ) na początek strumienia tooglePause Wstrzymuje albo wznawia odtwarzanie strumienia.

179 gmail.com Instytut Informatyki U P-H w Siedlcach 179/231 Obsługa wideo – sterowanie odtwarzaniem – przykład function pauseVideo() { ns.pause();//zapauzowanie wideo } function playVideo() { ns.resume();//wznawianie odtwarzania wideo } function stopVideo() { ns.pause();//zapauzowanie wideo ns.seek(0);//ustawienie wskaźnika na początek wideo } function togglePauseVideo() { ns.togglePause();//zapauzowane lub wznowienie odtwarzania wideo } Uwaga: Metoda play() nie wznawia odtwarzania, służy do ładowania plików wideo.

180 gmail.com Instytut Informatyki U P-H w Siedlcach 180/231 Obsługa wideo – zdarzenia(1) Aby wykryć problemy związane z odtwarzaniem, należy do obiektu strumienia dodać obsługę zdarzenia AsyncErrorEvent.ASYNC_ERROR. ns.addEventListener(air.AsyncErrorEvent.ASYNC_ERROR, asyncError); function asyncError(e){ alert(e); }

181 gmail.com Instytut Informatyki U P-H w Siedlcach 181/231 Obsługa wideo – zdarzenia(2) ns.addEventListener(air.NetStatusEvent.NET_STATUS, statusHandler); function statusHandler(event){ switch (event.info.code){ case "NetStream.Play.Start": air.trace("Start [" + ns.time.toFixed(3) + " seconds]"); break; case "NetStream.Play.Stop": air.trace("Stop [" + ns.time.toFixed(3) + " seconds]"); break; } Dzięki zdarzeniu NetStatusEvent.NET_STATUS, można utworzyć odtwarzacz wideo, który ładuje następne wideo z listy odtwarzania po zakończeniu odtwarzania bieżącego. Aby wykryć początek i koniec strumienia wideo, należy do obiektu strumienia dodać obsługę zdarzenia NetStatusEvent.NET_STATUS. Obiekt klasy NetStreamInfo udostępnia opis danego typu zdarzenia.

182 gmail.com Instytut Informatyki U P-H w Siedlcach 182/231 Obsługa wideo – metadane Aby odczytać metadane dotyczące pliku wideo należy: 1.Utworzyć obiekt klasy Object. 2.Utworzyć w nim dynamiczną właściwość onMetaData i przypisać do niej funkcję, która będzie reagowała na metadane. 3.Przypisać obiekt, do właściwości client obiektu NetStream. var customClient = new Object(); customClient.onMetaData = function(info){ var infoDesc = ""; for(var k in info){ infoDesc+=k+'='+info[k]+"\n"; } alert(infoDesc); } ns.client = customClient;

183 gmail.com Instytut Informatyki U P-H w Siedlcach 183/231 Obsługa wideo – punkty sygnalizacji  W formatach Adobe F4V i FLV punkty sygnalizacji umożliwiają wywoływanie operacji w aplikacji w momencie, gdy punkt pojawia się w strumieniu.  W treści wideo programu Flash można używać kilku różnych rodzajów punktów sygnalizacji: 1.Nawigacyjne punkty sygnalizacji: użytkownicy mogą wyszukiwać konkretne miejsca w pliku. 2.Punkty sygnalizacji zdarzeń: można obsługiwać zdarzenia wywoływane w określonych momentach podczas odtwarzania wideo. 3.Punkty sygnalizacji ActionScript: dostępne tylko dla składnika FLVPlayback programu Flash. Są to zewnętrzne punkty sygnalizacji tworzone za pomocą kodu ActionScript i dostępne z tego kodu. Są one mniej dokładne od osadzonych punktów sygnalizacji (mają dokładność jednej dziesiątej sekundy).

184 gmail.com Instytut Informatyki U P-H w Siedlcach 184/231 Obsługa wideo – punkty sygnalizacji zdarzeń Aby dodać obsługę punktów sygnalizacji zdarzeń należy: 1.Utworzyć obiekt klasy Object. 2.Utworzyć w nim dynamiczną właściwość onCuePoint i przypisać do niej funkcję, która będzie reagowała na zdarzenie wykrycia punktów sygnalizacji. 3.Przypisać obiekt, do właściwości client obiektu NetStream. var customClient = new Object(); ns.client = customClient; customClient.onCuePoint = function(info){ var infoDesc = ""; for(var k in info){ infoDesc+=k+'='+info[k]+"\n"; } alert(infoDesc); }

185 gmail.com Instytut Informatyki U P-H w Siedlcach 185/231 Obsługa wideo – sterowanie dźwiękiem  Jeżeli do pliku wideo jest dołączona ścieżka dźwiękowa, to warto rozważyć możliwość dodania do aplikacji sterowania dźwiękiem.  Aby to osiągnąć należy postępować podobnie jak przy odtwarzaniu zwykłych plików dźwiękowych, z tym że instancję SoundTranform przypisujemy do właściwości soundTranform obiektu klasy NetStream. //Utworzenie obiektu połączenia var nc = new air.NetConnection();... var ns = new air.NetStream(nc);... var st = new air.SoundTransform(0.5,0); ns.soundTransform = st;

186 gmail.com Instytut Informatyki U P-H w Siedlcach 186/231 Obsługa wideo – współpraca z kamerą Klasa Camera umożliwia przechwytywanie obrazu z kamery zainstalowanej w systemie. //Sprawdzanie czy kamera jest zainstalowana if (Camera.names.length) { var cam = air.Camera.getCamera(); if (cam) { //Uzyskiwanie jak najlepszej jakości wideo var vid = new air.Video(cam.width, cam.height); //Podłączenie camery jako źródła wideo vid.attachCamera(cam); } Ponadto istnieje możliwość sprawdzenia uprawnień dostępu do kamery oraz monitorowanie stanu odtwarzania danych wideo.

187 gmail.com Instytut Informatyki U P-H w Siedlcach 187/231 Obsługa pozostałych mediów – obsługa dokumentów XML (1)  XML jest popularnym formatem, ponieważ umożliwia przechowywanie zarówno danych jak i informacji o nich (czyli metadanych),  Pliki XML w aplikacjach są wykorzystywane w różny sposób np., mogą przechowywać dane konfiguracyjne aplikacji,

188 gmail.com Instytut Informatyki U P-H w Siedlcach 188/231 Obsługa pozostałych mediów – obsługa dokumentów XML (2)  W rzeczywistości dane XML są danymi tekstowymi, w specyficznym formacie.  Zatem dane XML wymagają również specjalnej obsługi.  Aby obsłużyć dokument XML należy utworzyć obiekt klasy DOMParser.  Klasa ta wchodzi w skład standardowej biblioteki JavaScript (a nie Adobe AIR) i umożliwia przetwarzanie danych. var parser = new DOMParser(); parser.parseFromString(‘daneXML’, ‘text/xml’);

189 gmail.com Instytut Informatyki U P-H w Siedlcach 189/231 Obsługa pozostałych mediów – obsługa dokumentów XML – przykład

190 gmail.com Instytut Informatyki U P-H w Siedlcach 190/231 Aktualizacja aplikacji - schemat Pobierz wersję aktualnie działającej aplikacji Pobierz numer najnowszej dostępnej wersji Nowa wersja dostępna Aktualizować Pobierz nową wersję aplikacji Zapisz nową wersję aplikacji Aktualizuj aplikację Komunikat TAK NIE Koniec NIE Koniec

191 gmail.com Instytut Informatyki U P-H w Siedlcach 191/231 Aktualizacja aplikacji – przykład (1) var thisVersion, currentVersion, xhr, newAppFile, data, urlStream = null; window.onload = function(){ getThisVersion(); getCurrentVersion(); } //Pobiera wersję działającej aplikacji z pliku deskryptora aplikacji function getThisVersion(){ //Pobieranie danych o działającej aplikacji var appData = air.NativeApplication.nativeApplication.applicationDescriptor; //Przetwarzanie danych na format XML var dp = new DOMParser(); var xml = dp.parseFromString(appData, 'text/xml'); //Pobieranie wersji var version = xml.getElementsByTagName('version')[0].firstChild; thisVersion = version.nodeValue; } //Wykonanie żądania XMLHttpRequest i zwrócenie najnowszej wersji function getCurrentVersion(){ xhr = new XMLHttpRequest(); xhr.open('get', 'http://serwer_macierzysty/version.txt'); xhr.onreadystatechange = askAboutUpdate; xhr.send(null);//wysłanie zapytania }

192 gmail.com Instytut Informatyki U P-H w Siedlcach 192/231 Aktualizacja aplikacji – przykład (2) //Funkcja pyta użytkownika, czy chce zaktualizować aplikację, o ile jest dostępna jej nowsza wersja function askAboutUpdate(){ if(xhr.readyState == 4){//Sprawdź wartość właściwości readyState //Pobierz aktualną wersję currentVersion = xhr.responseText; //Zaproponuj użytkownikowi aktualizację if(currentVersion > thisVersion){ if(confirm('Zaktualizować aplikację?')) downloadNewVersion(); }else{ alert('Twoja aplikacja jest aktualna'); } function downloadNewVersion(){ var url = new air.URLRequest('http://serwer_macierzysty/MyApp.air'); urlStream = new air.URLStream(); data = new air.ByteArray(); //Dodaj słuchacza zdarzeń urlStream.addEventListener(air.Event.COMPLETE, saveNewVersion); //Pobierz dane: urlStream.load(url); }

193 gmail.com Instytut Informatyki U P-H w Siedlcach 193/231 Aktualizacja aplikacji – przykład (3) function saveNewVersion(e){ //Umieszczenie pobranych danych w zmiennej data urlStream.readBytes(data, 0, urlStream.bytesAvailable); //Zapisanie danych do pliku newAppFile = air.File.desktopDirectory.resolvePath('MyApp.air'); var fileStream = new air.FileStream(); fileStream.open(newAppFile, air.FileMode.WRITE); fileStream.writeBytes(data, 0, data.length); fileStream.close(); //Wywołanie funkcji, która dokona aktualizacji updateApplication(); } function updateApplication(){ var updater = new air.Updater(); updater.update(newAppFile, currentVersion); }


Pobierz ppt "gmail.com Instytut Informatyki U P-H w Siedlcach 1/231 dr Grzegorz Terlikowski Środowiska Programowania Aplikacji Wirtualnych i Multimedialnych."

Podobne prezentacje


Reklamy Google