Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Środowiska Programowania Aplikacji Wirtualnych i Multimedialnych

Podobne prezentacje


Prezentacja na temat: "Środowiska Programowania Aplikacji Wirtualnych i Multimedialnych"— Zapis prezentacji:

1 Środowiska Programowania Aplikacji Wirtualnych i Multimedialnych
dr Grzegorz Terlikowski

2 Cechy JavaScript

3 Tworzenie rozbudowanego, webowego interfejsu użytkownika,
Podstawowe zastosowania JavaScript Tworzenie rozbudowanego, webowego interfejsu użytkownika, Walidacja danych wprowadzanych przez użytkownika, Dynamiczne generowanie treści strony oraz obsługa efektów graficznych i animacji, Otwieranie i zamykanie okien, Komunikacja z obiektami Silverlight, Flash, Java, Obsługa komunikacji z serwerem, w tym odbieranie danych z serwera bez konieczności przeładowywania strony(AJAX),

4 Nie można uzyskać dostępu do plików systemowych,
Ograniczenia JavaScript Nie można uzyskać dostępu do plików systemowych, Brak możliwości komunikacji ze sprzętem, Nie można bezpośrednio operować na pamięci operacyjnej, Obsługa tylko protokołu HTTP(do wersji HTML 5, który wprowadza WebSockety), Nie można otworzyć okna o zbyt małym rozmiarze, Nie można ustawić wartości pola <input type=‘file’/>, Brak dostępu do multimediów bez dodatkowego plugina (do wersji HTML 5),

5 Adobe AIR

6 Dzięki AIR aplikacje napisane w...
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 Adobe AIR – ogólne możliwości (2)
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. 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. 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), Dzięki natywnym rozszerzeniom, można korzystać ze specyficznych funkcji danego OS, uzyskując zbliżoną wydajność.

8 W Adobe AIR mamy do czynienia z dwoma API: AIR i Flash.
Adobe AIR – dostępne API W Adobe AIR mamy do czynienia z dwoma API: AIR i Flash. Do najważniejszych funkcjonalności należą: Dostęp do plików, Współpraca z multimediami (obrazki, dźwięk itd.), Obsługa okien natywnych (specyficzna dla danego systemu); Współpraca ze schowkiem, Obsługa baz danych, Obsługa gniazd.

9 Niektóre cechy silnika WebKit nie są wspierane przez Adobe AIR,
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 Tagi audio i video (dostarcza własnego API),
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

11 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: css – katalog na kaskadowe arkusze stylów icons – katalog na ikony wykorzystywane przez aplikację images – katalog zawierający grafikę js – katalog ze skryptami napisanymi w JavaScript Ponadto muszą istnieć następujące pliki: Plik html – plik zawierający treść głównej strony aplikacji Plik xml – plik stanowiący deskryptor aplikacji

12 Przykładowa zawartość bazowego pliku HTML.
Adobe AIR – struktura projektu – pliki HTML i XML W pliku deskryptora aplikacji umieszcza się metadane związane z programem m.in.: Nazwa, Wersja, Autor, Opis, Nota copyright, Ikony, Domyślny folder instalacji, Wygląd okna i jego zachowanie. Przykładowa zawartość bazowego pliku HTML. Przykładowa zawartość deskryptora aplikacji (pliku XML)

13 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 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 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 Ponadto, AIR dodaje trzecią piaskownicę
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 Piaskownica aplikacji (domyślna dla każdej aplikacji AIR)
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. AIR zapewnia kompleksową architekturę bezpieczeństwa , która określa uprawnienia dla każdego pliku w aplikacji AIR . Dotyczy to zarówno tych plików zainstalowanych z aplikacji i innych plików ładowanych przez aplikację. Uprawnienia przyznawane są pliki według ich pochodzenia , i są przypisane do logicznych grup zabezpieczeń zwanych Piaskownice .Pliki zainstalowane z tej aplikacji są w katalogu znanej jako katalogu aplikacji , a jako takie , są domyślnie umieszczone w bezpiecznym obszarze izolowanym - znany jako izolowanym aplikacji - który ma dostęp do wszystkich interfejsów API AIR. Obejmuje to API , które stanowią wielkie zagrożenie dla bezpieczeństwa , jeśli udostępnione treści z innych źródeł niż w katalogu zasobów aplikacji (innymi słowy , pliki, które nie są instalowane z aplikacją ) .Model zabezpieczeń AIR z obszarów izolowanych składa się z modelu zabezpieczeń programu Flash Player z dodatkiem obszarze izolowanym aplikacji . Pliki, które nie znajdują się w obszarze izolowanym aplikacji obowiązują ograniczenia bezpieczeństwa , takich jak te określone przez model zabezpieczeń programu Flash Player .Czas wykorzystuje te obszary izolowane zabezpieczeń w celu określenia zakresu danych, któremogą uzyskać dostęp do plików i operacje może wykonać . Aby zachować bezpieczeństwo lokalne , pliki w każdej piaskownicy są odizolowane od innych plików Piaskownice . Na przykład ,plik SWF załadowany do aplikacji AIR z zewnętrznego adresu URL internetowej jest umieszczony w zdalnym obszarze izolowanym i nie ma domyślnie mają uprawnienia do skryptu do plików znajdujących się w katalogu aplikacji , które są przypisane do obszaru izolowanego aplikacji.

18 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. AIR zapewnia kompleksową architekturę bezpieczeństwa , która określa uprawnienia dla każdego pliku w aplikacji AIR . Dotyczy to zarówno tych plików zainstalowanych z aplikacji i innych plików ładowanych przez aplikację. Uprawnienia przyznawane są pliki według ich pochodzenia , i są przypisane do logicznych grup zabezpieczeń zwanych Piaskownice .Pliki zainstalowane z tej aplikacji są w katalogu znanej jako katalogu aplikacji , a jako takie , są domyślnie umieszczone w bezpiecznym obszarze izolowanym - znany jako izolowanym aplikacji - który ma dostęp do wszystkich interfejsów API AIR. Obejmuje to API , które stanowią wielkie zagrożenie dla bezpieczeństwa , jeśli udostępnione treści z innych źródeł niż w katalogu zasobów aplikacji (innymi słowy , pliki, które nie są instalowane z aplikacją ) .Model zabezpieczeń AIR z obszarów izolowanych składa się z modelu zabezpieczeń programu Flash Player z dodatkiem obszarze izolowanym aplikacji . Pliki, które nie znajdują się w obszarze izolowanym aplikacji obowiązują ograniczenia bezpieczeństwa , takich jak te określone przez model zabezpieczeń programu Flash Player .Czas wykorzystuje te obszary izolowane zabezpieczeń w celu określenia zakresu danych, któremogą uzyskać dostęp do plików i operacje może wykonać . Aby zachować bezpieczeństwo lokalne , pliki w każdej piaskownicy są odizolowane od innych plików Piaskownice . Na przykład ,plik SWF załadowany do aplikacji AIR z zewnętrznego adresu URL internetowej jest umieszczony w zdalnym obszarze izolowanym i nie ma domyślnie mają uprawnienia do skryptu do plików znajdujących się w katalogu aplikacji , które są przypisane do obszaru izolowanego aplikacji.

19 Adobe AIR – model bezpieczeństwa (5)
Funkcja eval JS umożliwia dynamiczne przekształcenie ciągów znaków do kodu wykonalnego. Niektóre techniki JavaScript dynamicznie przekształcenia istnieją ciągi do kodu wykonywalnego . Treść w obszarze izolowanym aplikacji może korzystać tylko z tych technik podczas ładowania kodu z URL aplikacji . Korzystanie z tych technik w izolowanym aplikacji może stanowić zagrożenie dla bezpieczeństwa . Na przykładaplikacja może przypadkowo wykonać ciąg znaków załadowany z piaskownicy sieci , i że ciąg może zawierać złośliwy kod , takie jak kod , aby usunąć lub zmienić pliki na komputerze użytkownika lub zgłosić powrotem zawartość pliku lokalnego do niezaufanych sieci domeny . Szczegółowe informacje znajdują się w dokumentacji programisty .Uwaga : W aplikacjach AIR mobilnych , HTML i JavaScript nie może być załadowany do obszaru izolowanego aplikacji. Mobilne aplikacje AIR wyświetlać takie treści za pomocą systemu kontroli sieci . Kontrola ta ma te same względy bezpieczeństwa jak domyślne przeglądarki internetowej systemu . Treść zawarta w obszarze izolowanym może korzystać z tej funkcji podczas ładowania kodu z URL aplikacji.

20 Kod pobrany z sieci mógłby być złośliwy i być przyczyną np.,
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 . Niektóre techniki JavaScript dynamicznie przekształcenia istnieją ciągi do kodu wykonywalnego . Treść w obszarze izolowanym aplikacji może korzystać tylko z tych technik podczas ładowania kodu z URL aplikacji . Korzystanie z tych technik w izolowanym aplikacji może stanowić zagrożenie dla bezpieczeństwa . Na przykładaplikacja może przypadkowo wykonać ciąg znaków załadowany z piaskownicy sieci , i że ciąg może zawierać złośliwy kod , takie jak kod , aby usunąć lub zmienić pliki na komputerze użytkownika lub zgłosić powrotem zawartość pliku lokalnego do niezaufanych sieci domeny . Szczegółowe informacje znajdują się w dokumentacji programisty .Uwaga : W aplikacjach AIR mobilnych , HTML i JavaScript nie może być załadowany do obszaru izolowanego aplikacji. Mobilne aplikacje AIR wyświetlać takie treści za pomocą systemu kontroli sieci . Kontrola ta ma te same względy bezpieczeństwa jak domyślne przeglądarki internetowej systemu .

21 Brak bezpośredniego dostępu do API platformy AIR.
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. Oczywiście w pewnych przypadkach deweloper może się upierać przy konieczności użycia eval – pozwala na to komunikacja pomiędzy piaskownicami (SandboxBridge API) która sprowadza się do serializacji i deserializacji obiektów. Można przekazać łańcuch z piaskownicy aplikacji do piaskownicy non-application, tam wykonać eval (w bezpiecznym środowisku) i zwrócić wynik z powrotem do piaskownicy aplikacji.Adobe AIR, 5.0 out of 5 based on 1 rating W ten sposób można przekazać łańcuch z piaskownicy aplikacji do piaskownicy typu non-application, tam wykonać eval (w bezpiecznym środowisku) i zwrócić wynik z powrotem do piaskownicy aplikacji.

22 Dostęp do API można uzyskać na dwa sposoby:
Adobe AIR – dostęp do API Dostęp do API można uzyskać na dwa sposoby: bezpośrednio za pomocą odwołania window.runtime np. var file = new window.runtime.flash.filesystem.File(); 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 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 Najbardziej znaczącym mechanizmem debagowania jest AIRIntrospector.js.
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: Podejrzenie kodu związanego z poszczególnymi elementami programu, Wykorzystanie konsoli w celu interakcji z JS (podglądanie wartości zmiennych), Podejrzenie kodu HTML odpowiedzialnego za wygenerowane elementy, Przeglądanie i manipulowanie obiektowym modelem dokumentu (ang. Document Object Model, DOM), Przeglądanie zasobów strony (obrazków, załączonych plików itd.), Przeglądanie całego kodu źródłowego aplikacji (wraz z kodem JavaScript), Podgląd wartości obiektów XMLHttpRequest,

25 Tworzenie okien natywnych

26 Adobe AIR – Tworzenie okien
Aplikacje AIR tworzone w HTML i JS mogą korzystać z dwóch rodzajów okien: Standardowych okien HTML, Okien natywnych – więcej kodu, ale za to większa swoboda w manipulowaniu cechami okna.

27 Tworzenie okien HTML jest bardzo proste i polega na wywołaniu funkcji:
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 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: Utworzyć obiekt NativeWindowInitOptions Utworzyć obiekt typu Rectangle, definiujący wielkość i położenie, Utworzyć okno air.HTMLLoader.createRootWindow(true, options, false, rect); Załadować treść okna var page = air.File.applicationDirectory.resolvePath('strona.html'); popup.load(new air.URLRequest(page.url));

29 W każdym natywnym oknie można manipulować poniższym zestawem opcji:
Tworzenie okien natywnych – Atrybuty obiektu NativeWindowOptions W każdym natywnym oknie można manipulować poniższym zestawem opcji: Atrybut Wartość maximizable true/false minimizable resizable systemChrome „none”/”standard” transparent type „normal”/”lightweight”/”utility”

30 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 Utility Lightweight Normal
Adobe AIR – Tworzenie natywnych okien - typy okien Normal Utility Lightweight

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

33 Poniżej znajduje się lista atrybutów, którymi można manipulować.
Atrybuty obiektu NativeWindow Poniżej znajduje się lista atrybutów, którymi można manipulować. Atrybut Wartość alwaysInFront true/false bounds obiekt typu Rectangle height liczba całkowita(w pikselach) maxSize obiekt typu Point menu Obiekt typu NativeMenu minSize title łańcuch znaków visible width x y

34 Dostęp do natywnych okien

35 Dostęp do natywnych okien
AIR API dostarcza kilku ciekawych atrybutów, które są pomocne przy ustalaniu rozmiaru okien. Nazwa atrybutu Opis 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 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 Tworzenie okien pełnoekranowych

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

39 Obsługa zdarzeń okien (2)
Zdarzenia związane z oknami są zawarte w klasie air.Event i przedstawiają się następująco: Zdarzenie Klasa ACTIVE Event CLOSE CLOSING DEACTIVATE FOCUS_IN FOCUS_OUT Próba zamknięcia okna spowoduje wywołanie zdarzenia CLOSING, a gdy się ono powiedzie zostanie wywołane zdarzenie CLOSE.

40 Obsługa zdarzeń okien (3)
Zdarzenia związane z oknami są zawarte w klasach air.NativeWindowBoundsEvent i air.NativeWindowDisplayStateEvent. Zdarzenie Klasa MOVE NativeWindowBoundsEvent MOVING RESIZE RESIZING DISPLAY_STATE_CHANGE NativeWindowDisplayStateEvent DISPLAY_STATE_CHANGING

41 Aby podjąć jakąś akcję należy skorzystać z wywołania:
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 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 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 Tworzenie menu natywnego

45 Aby utworzyć natywne menu trzeba skorzystać z dwóch klas:
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: NativeMenu – umożliwia tworzenie podstawowego obiektu menu, NativeMenuItem – pozwala na tworzenie elementów wewnątrz menu,

46 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 Tworzenie menu (3) separator

48 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: Stałe zawarte w klasie air.Event Zdarzenie Opis 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);

49 Każdy element menu można skojarzyć ze skrótem klawiszowym.
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 Ustawić atrybut keyEquivalent – nazwa głównego klawisza, 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 Niektóre stałe zawarte w klasie air.Keyboard.
Obsługa menu – skróty klawiszowe (2) Niektóre stałe zawarte w klasie air.Keyboard. Stała Klucz ALTERNATE Alt/Option BACKSPACE Backspace F13 NUMBER_7 7 PAGE_UP Page up SPACE spacja

51 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 Elementy menu mogą przyjmować dwa dodatkowe stany:
Obsługa menu – zmiana stanu elementu menu Elementy menu mogą przyjmować dwa dodatkowe stany: Stan Opis 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 Framework Ten działa tylko w aplikacyjnym sandboxie.
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. <script type="text/javascript" src="AIRMenuBuilder.js"></script> Środowisko Aptana Studio 2.0, umożliwia automatyczne dodanie frameworka (na etapie tworzenia nowego projektu) poprzez zaznaczenie odpowiedniej opcji. Środowisko Aptana Studio 2.0, umożliwia automatyczne dodanie frameworka (na etapie tworzenia nowego projektu) poprzez zaznaczenie odpowiedniej opcji.", "width": "800" }

54 Tworzenie menu z użyciem frameworka MenuBuilder
Aby dodać do aplikacji menu wykorzystujące framework MenuBuilder należy: Utworzyć strukturę menu w pliku XML lub JSON, Załadować plik ze strukturą menu wywołując metodę Menu.createFromXML(‘plikXML’) lub Menu.createFromJSON(‘plikJSON’) Podłączyć menu do aplikacji za pomocą jednej z metod: Menu.setAsMenu() – by ustawić główne menu aplikacji. Menu.setAsContextMenu() – by wyświetlić menu jako menu kontekstowe elementu drzewa DOM. Menu.setAsIconMenu() by ustawić menu jako kontekstowe dla zasobnika systemowego(ang. system tray) lub ikony paska zadań (ang. dock icon) Zasobnik systemowy (ang. system tray) - obszar w prawej części paska zadań, w którym niektóre programy lub aplikacje systemowe (np. Data/Godzina) umieszczają swoje panele kontrolne. AutoIt umożliwia tworzenie tego typu menu, oraz manipulowanie nim za pomocą zestawu stosownych funkcji.

55 Przykład definicji struktury menu w formacie XML.
Tworzenie menu z użyciem frameworka MenuBuilder Przykład definicji struktury menu w formacie XML. <?xml version="1.0" encoding="UTF-8"?> <root> <menuitem label=„File"> <menuitem label="Open" enabled="false" keyEquivalent="o"/> <menuitem label="Save" keyEquivalent="s"/> <menuitem label="Save _As..." keyEquivalent="s" onSelect="doSave"/> <menuitem label="Close" keyEquivalent="w"/> <menuitem label="Other" type="check"/> <menuitem label=„Edit"> <menuitem label="Cut" keyEquivalent="x"/> <menuitem label="Copy" keyEquivalent="c"/> <menuitem label="Paste" keyEquivalent="v"/> </menuitem> </root> <?xml version="1.0" encoding="utf-8" ?> <root> <menuitem label="File"> <menuitem label="Open" keyEquivalent="o" enabled="false"/> <menuitem label="Save" keyEquivalent="s"/> <menuitem label="Save _As..." keyEquivalent="s" shiftKey="true" onSelect="doSave"/> <menuitem label="Close" keyEquivalent="w"/> <menuitem label="Other" type="check" toggled="true"/> <menuitem label="Menu kontekstowe"> <menuitem label="Przycisk 1"/> <menuitem label="Przycisk 2"/> </menuitem> <menuitem label="Edit"> <menuitem label="Cut" keyEquivalent="x"/> <menuitem label="Copy" keyEquivalent="c"/> <menuitem label="Paste" keyEquivalent="v"/> </root> Przykład dodawania menu kontekstowego do węzła DOM. var treeContextMenu = air.ui.Menu.createFromXML("treeContextMenu.xml"); air.ui.Menu.setAsContextMenu(treeContextMenu, "id_DOM_node");

56 Przykład definicji struktury menu w formacie JSON.
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"} ] } <?xml version="1.0" encoding="utf-8" ?> <root> <menuitem label="File"> <menuitem label="Open" keyEquivalent="o" enabled="false"/> <menuitem label="Save" keyEquivalent="s"/> <menuitem label="Save _As..." keyEquivalent="s" shiftKey="true" onSelect="doSave"/> <menuitem label="Close" keyEquivalent="w"/> <menuitem label="Other" type="check" toggled="true"/> <menuitem label="Menu kontekstowe"> <menuitem label="Przycisk 1"/> <menuitem label="Przycisk 2"/> </menuitem> <menuitem label="Edit"> <menuitem label="Cut" keyEquivalent="x"/> <menuitem label="Copy" keyEquivalent="c"/> <menuitem label="Paste" keyEquivalent="v"/> </root> Przykład dodawania głównego menu aplikacji. var mainMenu = air.ui.Menu.createFromJSON(„mainMenu.js"); air.ui.Menu.setAsMenu(mainMenu);

57 Korzystanie ze schowka

58 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 Schowek – Kopiowanie Aby nadpisać domyślne zachowanie aplikacji związane z kopiowaniem, należy: W znaczniku skojarzyć zdarzenie oncopy z nową funkcją 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 Schowek – typy przechowywanych danych
Typy MIME są wykorzystywane do rozróżniania typów danych przechowywanych w schowku. Typ MIME Znaczenie 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 Schowek może przechowywać te same dane w różnych formatach.
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 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: W znaczniku skojarzyć zdarzenie oncut z nową funkcją 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 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 Zaimplementować funkcję „wklejającą”, w której należy:
Schowek – Wklejanie Aby nadpisać domyślne zachowanie aplikacji związane z wklejaniem, należy: Powiadomić aplikację w jaki sposób powinna obsługiwać zdarzenie onpaste. 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 Schowek – Wklejanie

66 Adobe AIR obsługuje następujące formaty: Tekst, Adresy URL,
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 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 Mechanizm Przeciągnij Upuść(drag&drop)

69 Zdarzenia związane z mechanizmem drag&drop można podzielić na 2 typy:
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: Zdarzenia generowane przez źródło, Zdarzenia generowane przez cel.

70 Zdarzenia generowane przez źródło:
Mechanizm przeciągnij upuść – zdarzenia generowane przez źródło Zdarzenia generowane przez źródło: Zdarzenie Opis 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. 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 Zdarzenia generowane przez cel:
Mechanizm przeciągnij upuść – zdarzenia generowane przez cel Zdarzenia generowane przez cel: Zdarzenie Opis 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.

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

73 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 Efekty przeciągania: Wartość dla efektu Znaczenie efektu none
Mechanizm przeciągnij upuść – efekt przeciągania (2) Efekty przeciągania: 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

75 event.dataTransfer.dropEffect = ‘copy’;
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 Obsługa plików i katalogów

77 File – najważniejsza klasa do obsługi plików i katalogów,
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: File – najważniejsza klasa do obsługi plików i katalogów, FileStream – klasa umożliwiająca odczytanie/zapisanie danych z/do pliku, FileMode – klasa definiująca cztery stałe, wykorzystywane przez FileStream, definiujące tryb dostępu do pliku.

78 var file = new air.File(‘ścieżka’);
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: 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’); poprzez wykorzystanie predefiniowanych atrybutów. var file = air.File.atrybut

79 Wykorzystanie operatora new wygląda tak...
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 var file = air.File.applicationDirectory;
Obsługa plików i katalogów – predefiniowane atrybuty 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. Atrybut Ścieżka w systemie Windows XP userDirectory C:\Documents and Settings\uzytkownik documentsDirectory C:\Documents and Settings\uzytkownik\Moje dokumenty desktopDirectory C:\Documents and Settings\uzytkownik\Pulpit applicationStorageDirectory C:\Documents and Settings\uzytkownik\Dane Aplikacji applicationDirectory Katalog instalacyjny aplikacji Przykładowe użycie: var file = air.File.applicationDirectory;

81 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 np. new air.File(‘app-storage:/plik.txt’); znaczy tyle co:
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: file np. file://nazwahosta/katalog app-storage np. new air.File(‘app-storage:/plik.txt’); znaczy tyle co: air.File.applicationStorageDirectory. resolvePath(‘plik.txt’); app np. new air.File(‘app:/plik.txt’)znaczy tyle co: air.File.applicationDirectory.

83 browseForDirectory(‘etykieta okna’) – umożliwia wskazanie katalogu.
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: browseForOpen(‘etykieta okna’) – otwiera się okno umożliwiające wybór pliku, browseForOpenMultiple(‘etykieta okna’) – umożliwia wybranie wielu plików, browseForDirectory(‘etykieta okna’) – umożliwia wskazanie katalogu.

84 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 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 Obsługa plików i katalogów – atrybuty klasy File
Klasa air.File posiada wiele właściwości; najważniejsze z nich zostały przedstawione poniżej: 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

87 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: getDirectoryListing() – wersja synchroniczna, 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 Aby usunąć dany plik lub katalog należy wywołać od tego obiektu metodę
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 Aby utworzyć nowy katalog należy określić jego nazwę…
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 Aby skopiować plik lub katalog, należy użyć poniższych konstrukcji.
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 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 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ła Znaczenie 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 Aby zapisać dane do pliku tekstowego (w trybie synchronicznym) należy:
Praca wewnątrz plików – zapis danych tekstowych Aby zapisać dane do pliku tekstowego (w trybie synchronicznym) należy: Utworzyć obiekty File i FileStream, Otworzyć plik wywołując metodę open klasy FileStream, - należy w niej wskazać plik do otwarcia oraz tryb dostępu do tego pliku, Zapisać dane wywołując metodę writeUTFBytes klasy FileStream, w której należy wskazać dane do zapisania, Zamknąć strumień, wywołując metodę close; Zawartość pliku Przed Zawartość pliku Po

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

95 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 Przed Zawartość pliku Po

96 Praca wewnątrz plików – zapis do pliku z wykorzystaniem okna
Do zapisu, aktualizacji lub dopisania do pliku można wykorzystać, metodę browseForSave klasy File.

97 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 Praca wewnątrz plików – transakcje asynchroniczne – zdarzenia
W przypadku asynchronicznego odczytu/zapisu danych należy obserwować następujące zdarzenia: ProgressEvent.PROGRESS – wywoływana wielokrotnie podczas odczytu, gdyż dane wczytywane są porcjami, OutputProgressEvent.OUTPUT_PROGRESS – wywoływania wielokrotnie podczas zapisywania danych – dane zapisywane są porcjami, Event.COMPLETE – wywoływana po zakończeniu transakcji dotyczącej zapisu/odczytu.

99 liczbę bajtów do wczytania, kodowanie znaków. np.’iso-8859-1’.
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 Praca wewnątrz plików – transakcje asynchroniczne – przykład

101 Aby go obsłużyć, należy do strumienia FileStream dodać nasłuch.
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 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 Praca wewnątrz plików – odczyt danych binarnych
W podobny sposób postępujemy w przypadku odczytania danych binarnych ze wskazanego pliku.

104 Obsługa baz danych

105 System ten jest bardzo łatwy w użyciu (stąd jego popularność),
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 Plik bazy SQLite może składać się z jednej lub większej liczby stron,
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 Zawartość bazy danych przetrzymywana jest w jednym pliku binarnym.
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żą: Możliwość korzystania z bazy danych bez potrzeby tworzenia nowego procesu, Wysoka wydajność, szczególnie przy zapytaniach typu SELECT, INSERT, Wieloplatformowość,

108 Obsługa baz danych – SQLite – wady i ograniczenia
Do ograniczeń, należą: Brak systemu zarządzania użytkownikami i uprawnieniami – każdy może otworzyć plik, dlatego programista samodzielnie musi implementować warstwę kontroli dostępu. Niepełne wsparcie dla wyzwalaczy, Niepełne wsparcie dla ALTER TABLE, 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 var con = new air.SQLConnection();
Obsługa baz danych – nawiązywanie połączenia Aby połączyć się z bazą danych należy: Utworzyć obiekt SQLConnection, var con = new air.SQLConnection(); Utworzyć obiekt File – każda baza w SQLite jest zwykłym plikiem, var dbFile = air.File.applicationStorageDirectory. resolvePath(‘baza.db’); Otworzyć połączenie z bazą danych wywołując metodę open/openAsync od obiektu klasy SQLConnection. con.open(dbFile);

110 UWAGA: Baza danych zostanie utworzona w katalogu:
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 con.open(dbFile, air.SQLMode.CREATE);
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ła Znaczenie 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 Obsługa baz danych – obsługiwane typy danych
SQLite obsługuje tylko 4 typy danych, które zostały przedstawione poniżej: Nazwa typu Znaczenie 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 Do wykonywania zapytań do baz danych służy klasa SQLStatement.
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: Otworzyć połączenie z bazą danych var con … Utworzyć obiekt SQLStatement var stmt = new air.SQLStatement(); Do właściwości sqlConnection obiektu klasy SQLStatement przypisać utworzone wcześniej połączenie z bazą danych. stmt.sqlConnection = con; Do właściwości text, obiektu klasy SQLStatement, przypisać zapytanie. stmt.text = ‘CREATE TABLE …’; Wywołać metodę execute od obiektu klasy SQLStatement. stmt.execute(); 6. Zamknąć połączenie z bazą danych wywołujące metodę close.

114 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 Przykładowe operacje wykonane na bazie danych
Obsługa baz danych – wykonywanie zapytań – przykład Przykładowe operacje wykonane na bazie danych

116 Można pobrać wartość automatycznie inkrementowanego klucza głównego:
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 Obsługa baz danych – pobieranie rekordów – przykład

118 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 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: dla transakcji synchronicznych kod, który może spowodować błędy zawrzeć w bloku try…catch…finally. dla transakcji asynchronicznych dodać słuchacza zdarzenia SQLErrorEvent.ERROR do obiektów klas SQLConnection, SQLStatement.

120 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 Przykład obsługi błędów w operacjach asynchronicznych
Obsługa baz danych – obsługa błędów – przykład (1) Przykład obsługi błędów w operacjach asynchronicznych

122 Przykład obsługi błędów w operacjach synchronicznych
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 w celu późniejszego rozpowszechniania.
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 Z ich stosowania wynikają dwie korzyści:
Obsługa baz danych – zapytania parametryzowane Większość systemów bazodanowych obsługuje tzw. zapytania parametryzowane. Z ich stosowania wynikają dwie korzyści: Pozwalają one uniknąć potencjalnych niebezpieczeństw związanych z SQL injection, 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 Parametry te dzielimy na dwa typy:
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: Parametry anonimowe – ‘?’ Parametry jawne lub :nazwaParametru

126 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 begin – rozpoczęcie transakcji, commit – zatwierdzenie transakcji,
Obsługa baz danych – obsługa transakcji Transakcje w SQLite są wspierane w postaci 3 metod obiektu klasy SQLConnection. begin – rozpoczęcie transakcji, commit – zatwierdzenie transakcji, 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 Obsługa sieci

129 Adobe AIR oferuje bogaty wachlarz możliwości sieciowych.
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: Klasa Opis 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 Obsługa sieci – asynchroniczne połączenia XMLHttpRequest – przykład

131 Zasoby można monitorować używając klasy URLMonitor.
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 . <script type="application/x-shockwave-flash" src="lib/air/servicemonitor.swf"/>

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

133 Sprawdzić zmienną available monitora w funkcji obsługowej z kroku 3,
Obsługa sieci – monitorowanie zasobów URL (2) Uruchomić monitor, monitor.start(); Sprawdzić zmienną available monitora w funkcji obsługowej z kroku 3, monitor.available;

134 Obsługa sieci – monitorowanie zasobów URL – przykład

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

136 Obsługa sieci – pobieranie danych z zasobów URL – przykład

137 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 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 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 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: method – określa sposób wykonania żądania. Jest ją najczęściej URLRequestMethod.GET (wartość domyślna) lub URLRequestMethod.POST, data – dane do wysłania.

141 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 stream.load(request);
Obsługa sieci – pobieranie danych binarnych z zasobów URL Aby pobrać binarny plik należy: Utworzyć obiekty klas URLRequest i URLStream, var request = new air.URLRequest(‘adres URL’); var stream = new air.URLStream(); 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); Wywołać metodę load obiektu klasy URLStream, w celu rozpoczęcia procesu pobierania danych binarnych. stream.load(request);

143 Na zakończenie należy zamknąć strumień – metoda close().
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 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 Dane binarne można wysyłać na różne sposoby:
Obsługa sieci – wysyłanie danych binarnych do zasobów URL (1) Dane binarne można wysyłać na różne sposoby: Skorzystać z klas Socket i SocketMonitor. 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 Obsługa sieci – wysyłanie danych binarnych do zasobów URL (2)
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 Obsługa mediów

148 Adobe AIR obsługuje takie media jak:
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 W zakresie obsługi dźwięków mamy następujące możliwości:
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 <script src="[swfFile].swf" type="application/x-shockwave-flash"/>) – 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 W zakresie obsługi dźwięków mamy następujące klasy:
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: Klasa Opis 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. Obsługa mediów – obsługa dokumentów XML

151 W zakresie obsługi dźwięków mamy następujące klasy:
Obsługa dźwięków – API do obsługi dźwięków (2) W zakresie obsługi dźwięków mamy następujące klasy: Klasa Opis 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. Obsługa mediów – obsługa dokumentów XML

152 Aby odtworzyć dźwięk z lokalnego lub zdalnego źródła należy:
Obsługa dźwięków – odtwarzanie Aby odtworzyć dźwięk z lokalnego lub zdalnego źródła należy: 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’); Utworzyć obiekt klasy Sound(). var sound = new air.Sound(); Pobrać plik dźwiękowy wywołując metodę load() od obiektu klasy Sound. sound.load(url); I wreszcie odtworzyć plik dźwiękowy wywołjuąc metody play() obiektu klasy Sound; sound.play();

153 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. Zdarzenie Opis 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 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 Obsługa dźwięków – odtwarzanie długich dźwięków - przykład

156 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 Aby odtwarzać plik dźwiękowy strumieniowo:
Obsługa dźwięków – strumieniowe odtwarzanie dźwięków (2) Aby odtwarzać plik dźwiękowy strumieniowo: Utworzyć obiekty klas URLRequest, Sound i SoundLoaderContext. Dodać do obiektu Sound obsługę zdarzenia ProgressEvent.PROGRESS. Wywołać metodę load, przekazując jej oprócz obiektu URLRequest także obiekt SoundLoaderContext. 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 Obsługa dźwięków – strumieniowe odtwarzanie dźwięków – przykład

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

160 player.play(czas_w_milisekundach);
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 var position = sc.position;
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 Pauzowany dźwięk może pochodzić z pliku, albo ze strumienia.
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 Konstruktor tej klasy posiada 2 argumenty:
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 player.play(position, 0, st);
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 soundMixer.soundTransform = new air.SoundTransform(1, -1);
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 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 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 Poniżej lista niektórych właściwości znacznika ID3.
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. Poniżej lista niektórych właściwości znacznika ID3. Atrybut znacznika ID3 Opis 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

169 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 Obsługa dźwięków – znaczniki ID3 – przykłady
ID3v2 UWAGA: Dostęp do znaczników ID3 zależy również od kwestii bezpieczeństwa i konfiguracji SoundContextLoader.

171 Może ona przyjmować 3 parametry:
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: 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. 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) 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 Obsługa dźwięków – dostęp do surowych danych
Zwiększenie wartości stretchFactor powoduje wygładzenie postaci fali lub częstotliwości kosztem szczegółów. (Wynik dla stretchFactor = 10 poniżej) Program reaguje na aktualne ustawienia SoundTransform. Po prawej wizualizacja z wyciszoną głośnością

173 W zakresie obsługi wideo mamy następujące możliwości:
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 Obsługa wideo – klasy(1)
W zakresie obsługi wideo w Adobe AIR do dyspozycji mamy następujące klasy: Nazwa klasy Opis 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 Do sterowania głośnością odtwarzania wideo. Camera
Obsługa wideo – klasy(2) Nazwa klasy Opis 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 Aby odtwarzać plik wideo należy:
Obsługa wideo – odtwarzanie Aby odtwarzać plik wideo należy: Utworzyć obiekt klasy NetConnection. 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). Utworzyć obiekt klasy Video, i dodać go do aplikacji. Utworzyć obiekt NetStream, przekazując obiekt NetConnection jako argument konstruktora. Podłączyć do obiektu Video obiekt strumienia przy użyciu funkcji attachNetStream. Uruchomić ładowanie pliku za pomocą metody play() przekazując jako parametr nazwę pliku do odtworzenia.

177 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 Obsługa wideo – sterowanie odtwarzaniem
Proces odtwarzania wideo można kontrolować za pomocą następujących funkcji należących do klasy NetStream. Nazwa klasy Opis 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 Obsługa wideo – sterowanie odtwarzaniem – przykład
function pauseVideo() { ns.pause();//zapauzowanie wideo } function playVideo() ns.resume();//wznawianie odtwarzania wideo function stopVideo() 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 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 Obsługa wideo – zdarzenia(2)
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. 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]"); } 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.

182 Aby odczytać metadane dotyczące pliku wideo należy:
Obsługa wideo – metadane Aby odczytać metadane dotyczące pliku wideo należy: Utworzyć obiekt klasy Object. Utworzyć w nim dynamiczną właściwość onMetaData i przypisać do niej funkcję, która będzie reagowała na metadane. 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 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: Nawigacyjne punkty sygnalizacji: użytkownicy mogą wyszukiwać konkretne miejsca w pliku. Punkty sygnalizacji zdarzeń: można obsługiwać zdarzenia wywoływane w określonych momentach podczas odtwarzania wideo. 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 Aby dodać obsługę punktów sygnalizacji zdarzeń należy:
Obsługa wideo – punkty sygnalizacji zdarzeń Aby dodać obsługę punktów sygnalizacji zdarzeń należy: Utworzyć obiekt klasy Object. 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. 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 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 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 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 Zatem dane XML wymagają również specjalnej obsługi.
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 Obsługa pozostałych mediów – obsługa dokumentów XML – przykład

190 Aktualizacja aplikacji - schemat
Pobierz wersję aktualnie działającej aplikacji Pobierz numer najnowszej dostępnej wersji Nowa wersja dostępna NIE Komunikat TAK Aktualizować NIE Koniec TAK Pobierz nową wersję aplikacji Zapisz nową wersję aplikacji Aktualizuj aplikację Koniec

191 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 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 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 "Środowiska Programowania Aplikacji Wirtualnych i Multimedialnych"

Podobne prezentacje


Reklamy Google