Przykład dotyczący możliwości: wykrywanie możliwości systemu

Flash Player 9 i nowsze wersje

Przykład CapabilitiesExplorer ilustruje wykorzystanie klasy flash.system.Capabilities do sprawdzania, jakie funkcje obsługuje wersja środowiska wykonawczego Flash, z której korzysta użytkownik. W przykładzie zastosowano następujące techniki:

  • Wykrywanie możliwości wersji programu środowiska wykonawczego Flash przy użyciu klasy Capabilities.

  • Wykorzystanie klasy ExternalInterface do wykrywania ustawień przeglądarki obsługiwanych przez przeglądarkę użytkownika.

Aby pobrać pliki tej przykładowej aplikacji, należy przejść na stronę www.adobe.com/go/learn_programmingAS3samples_flash_pl . Pliki aplikacji CapabilitiesExplorer znajdują się w folderze Samples/CapabilitiesExplorer. Aplikacja składa się z następujących plików:

File

Opis

CapabilitiesExplorer.fla

lub

CapabilitiesExplorer.mxml

Główny plik aplikacji w formacie Flash (FLA) lub Flex (MXML).

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

Klasa realizująca główną funkcjonalność aplikacji, w tym dodawanie możliwości systemu do tablicy, sortowanie elementów i pobieranie możliwości przeglądarki za pomocą klasy ExternalInterface.

capabilities.html

Kontener w języku HTML zawierający skrypt JavaScript niezbędny do komunikacji z zewnętrznym interfejsem API.

Przegląd aplikacji CapabilitiesExplorer

Plik CapabilitiesExplorer.mxml ma za zadanie przygotowanie interfejsu użytkownika dla aplikacji CapabilitiesExplorer. Możliwości wersji środowiska wykonawczego Flash używanej przez użytkownika będą wyświetlane w składniku DataGrid na stole montażowym. Zostaną także wyświetlone możliwości przeglądarki użytkownika, jeśli aplikacja jest uruchamiana w kontenerze HTML i dostępny jest zewnętrzny interfejs API.

Po wywołaniu zdarzenia creationComplete głównego pliku aplikacji wywoływana jest metoda initApp() . Metoda initApp() wywołuje metodę getCapabilities() z klasy com.example.programmingas3.capabilities.CapabilitiesGrabber. Oto kod metody initApp() :

private function initApp():void 
{ 
    var dp:Array = CapabilitiesGrabber.getCapabilities(); 
    capabilitiesGrid.dataProvider = dp; 
}

Metoda CapabilitiesGrabber.getCapabilities() zwraca posortowaną tablicę informacji o możliwościach środowiska wykonawczego Flash oraz przeglądarki. Tablica ta jest następnie wpisywana do właściwości dataProvider składnika DataGrid o nazwie capabilitiesGrid umieszczonego na stole montażowym.

Przegląd klasy CapabilitiesGrabber

Statyczna metoda getCapabilities() klasy CapabilitiesGrabber dodaje właściwość z klasy flash.system.Capabilities do tablicy ( capDP ). Następnie wywołuje statyczną metodę getBrowserObjects() w klasie CapabilitiesGrabber. Metoda getBrowserObjects() wykorzystuje zewnętrzny interfejs API do przeglądania w pętli obiektu navigator przeglądarki. Obiekt ten zawiera informacje o możliwościach przeglądarki. Metoda getCapabilities() ma następującą postać:

public static function getCapabilities():Array 
{ 
    var capDP:Array = new Array(); 
    capDP.push({name:"Capabilities.avHardwareDisable", value:Capabilities.avHardwareDisable});  
    capDP.push({name:"Capabilities.hasAccessibility", value:Capabilities.hasAccessibility});  
    capDP.push({name:"Capabilities.hasAudio", value:Capabilities.hasAudio}); 
    ... 
    capDP.push({name:"Capabilities.version", value:Capabilities.version}); 
    var navArr:Array = CapabilitiesGrabber.getBrowserObjects(); 
    if (navArr.length > 0) 
    { 
        capDP = capDP.concat(navArr); 
    } 
    capDP.sortOn("name", Array.CASEINSENSITIVE); 
    return capDP; 
}

Metoda getBrowserObjects() zwraca tablice dla poszczególnych właściwości w obiekcie navigator przeglądarki. Jeśli tablica ma co najmniej jeden element, informacja o możliwościach przeglądarki ( navArr ) jest dopisywana to tablicy możliwości programu Flash Player capDP ), a cała tablica jest sortowana alfabetycznie. Na koniec posortowana tablica jest zwracana do głównego pliku aplikacji, który zapełnia widoczną tabelę danych. Oto kod metody getBrowserObjects() :

private static function getBrowserObjects():Array 
{ 
    var itemArr:Array = new Array(); 
    var itemVars:URLVariables; 
    if (ExternalInterface.available) 
    { 
        try 
        { 
            var tempStr:String = ExternalInterface.call("JS_getBrowserObjects"); 
            itemVars = new URLVariables(tempStr); 
            for (var i:String in itemVars) 
            { 
                itemArr.push({name:i, value:itemVars[i]}); 
            } 
        } 
        catch (error:SecurityError) 
        { 
            // ignore 
        } 
    } 
    return itemArr; 
}

Jeśli w bieżącym środowisku użytkownika jest dostępny zewnętrzny interfejs API, środowisko wykonawcze Flash wywołuje metodę JavaScript JS_getBrowserObjects() , która w pętli przegląda obiekt navigator przeglądarki i zwraca do kodu ActionScript ciąg wartości zakodowanych jako adresy URL. Ten ciąg jest następnie konwertowany na obiekt URLVariables ( itemVars ) i dodawany do tablicy itemArr , która zostaje zwrócona do skryptu wywołującego.

Komunikacja z kodem JavaScript

Ostatnim etapem budowy aplikacji CapabilitiesExplorer jest napisanie kodu JavaScript potrzebnego do przeglądania elementów w obiekcie navigator przeglądarki i dołączania par nazwa-wartość do tablicy tymczasowej. Metoda JavaScript JS_getBrowserObjects() w pliku container.html ma następującą postać:

<script language="JavaScript"> 
    function JS_getBrowserObjects() 
    { 
        // Create an array to hold each of the browser's items. 
        var tempArr = new Array(); 
 
        // Loop over each item in the browser's navigator object. 
        for (var name in navigator) 
        { 
            var value = navigator[name]; 
 
            // If the current value is a string or Boolean object, add it to the 
            // array, otherwise ignore the item. 
            switch (typeof(value)) 
            { 
                case "string": 
                case "boolean": 
 
                    // Create a temporary string which will be added to the array. 
                    // Make sure that we URL-encode the values using JavaScript's 
                    // escape() function. 
                    var tempStr = "navigator." + name + "=" + escape(value); 
                    // Push the URL-encoded name/value pair onto the array. 
                    tempArr.push(tempStr); 
                    break; 
            } 
        } 
        // Loop over each item in the browser's screen object. 
        for (var name in screen) 
        { 
            var value = screen[name]; 
 
            // If the current value is a number, add it to the array, otherwise 
            // ignore the item. 
            switch (typeof(value)) 
            { 
                case "number": 
                    var tempStr = "screen." + name + "=" + escape(value); 
                    tempArr.push(tempStr); 
                    break; 
            } 
        } 
        // Return the array as a URL-encoded string of name-value pairs. 
        return tempArr.join("&"); 
    } 
</script>

Na początku kodu tworzona jest tymczasowa tablica, w której będą przechowywane wszystkie pary nazwa-wartość z obiektu navigator. Następnie obiekt navigator jest przeglądany przy użyciu pętli for..in , a typy danych poszczególnych wartości są filtrowane w celu wyeliminowania wartości niepożądanych. W tej aplikacji interesują nas wartości typu String i Boolean, a pozostałe typy danych (takie jak funkcje i tablice) są ignorowane. Każda wartość String lub Boolean w obiekcie navigator jest dopisywana do tablicy tempArr . Następnie obiekt screen przeglądarki jest przeglądany przy użyciu pętli for..in , a wszystkie wartości liczbowe są dodawane do tablicy tempArr . Na koniec tablica tymczasowa jest konwertowana na ciąg znaków przy użyciu metody Array.join() . W tablicy rolę ogranicznika pełni znak ampersand (&), dzięki czemu kod ActionScript może łatwo przeanalizować dane przy użyciu klasy URLVariables.