Esempio Capabilities: rilevazione delle caratteristiche del sistema

Flash Player 9 e versioni successive

L'esempio CapabilitiesExplorer dimostra come utilizzare la classe flash.system.Capabilities per determinare le caratteristiche supportate dalla versione del runtime di Flash. Nell'esempio vengono descritte le seguenti tecniche:

  • Rilevazione delle caratteristiche supportate dalla versione del runtime di Flash dell'utente utilizzando la classe Capabilities

  • Utilizzo della classe ExternalInterface per rilevare le impostazioni del browser supportate dal browser dell'utente

Per ottenere i file dell'applicazione per questo esempio, visitate la pagina www.adobe.com/go/learn_programmingAS3samples_flash_it . I file dell'applicazione CapabilitiesExplorer sono disponibili nella cartella Samples/CapabilitiesExplorer. L'applicazione è costituita dai seguenti file:

File

Descrizione

CapabilitiesExplorer.fla

o

CapabilitiesExplorer.mxml

Il file principale dell'applicazione in Flash (FLA) o Flex (MXML)

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

La classe che fornisce la funzionalità principale dell'applicazione, compresa l'aggiunta delle caratteristiche del sistema a un array, l'ordinamento degli elementi e l'utilizzo della classe ExternalInterface per recuperare le caratteristiche del browser.

capabilities.html

Un contenitore HTML che include il codice JavaScript necessario per comunicare con l'API esterna.

Panoramica di CapabilitiesExplorer

Il file CapabilitiesExplorer.mxml viene utilizzato per impostare l'interfaccia utente dell'applicazione CapabilitiesExplorer. Le caratteristiche della versione del runtime di Flash dell'utente verranno visualizzate all'interno di un'istanza del componente DataGrid dello Stage. Se l'applicazione viene eseguita da un contenitore HTML e se l'API esterna è disponibile, verranno visualizzate anche le caratteristiche del browser.

Quando viene inviato l'evento creationComplete del file dell'applicazione principale, viene chiamato il metodo initApp() . Il metodo initApp() chiama il metodo getCapabilities() dall'interno della classe com.example.programmingas3.capabilities.CapabilitiesGrabber. Di seguito è riportato il codice per il metodo initApp() :

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

Il metodo CapabilitiesGrabber.getCapabilities() restituisce un array ordinato delle caratteristiche del runtime di Flash e del browser, che viene quindi impostato sulla proprietà dataProvider dell'istanza del componente DataGrid capabilitiesGrid sullo stage.

Panoramica della classe CapabilitiesGrabber

Il metodo statico getCapabilities() della classe CapabilitiesGrabber aggiunge ogni proprietà della classe flash.system.Capabilities a un array ( capDP ). Quindi, chiama il metodo statico getBrowserObjects() nella classe CapabilitiesGrabber. Il metodo getBrowserObjects() utilizza l'API esterna per eseguire elaborazioni cicliche dell'oggetto navigator del browser, che contiene le caratteristiche del browser. Di seguito è riportato il metodo getCapabilities() :

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; 
}

Il metodo getBrowserObjects() restituisce un array di ogni proprietà dell'oggetto navigator del browser. Se questo array ha una lunghezza di uno o più elementi, l'array delle caratteristiche del browser ( navArr ) viene aggiunto all'array delle caratteristiche di Flash Player ( capDP ), quindi l'intero array viene ordinato alfabeticamente. Infine, l'array ordinato viene restituito al file dell'applicazione principale, che quindi completa la griglia di dati. Di seguito è riportato il codice per il metodo 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; 
}

Se nell'ambiente utente corrente è disponibile l'API esterna, il runtime di Flash chiama il metodo JavaScript JS_getBrowserObjects() , che esegue delle elaborazioni cicliche dell'oggetto navigator del browser e restituisce ad ActionScript una stringa di valori con codifica URL. Questa stringa viene quindi convertita in un oggetto URLVariables ( itemVars ) e aggiunta all'array itemArr , che viene restituito allo script chiamante.

Comunicazione con JavaScript

La fase finale nella creazione dell'applicazione CapabilitiesExplorer consiste nello scrivere il codice JavaScript necessario per eseguire elaborazioni cicliche di ogni elemento contenuto nell'oggetto navigator del browser e nell'aggiungere una coppia nome-valore a un array temporaneo. Di seguito è riportato il codice per il metodo JavaScript JS_getBrowserObjects() nel file container.html:

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

Il codice inizia con la creazione di un array temporaneo che includerà tutte le coppie nome-valore nell'oggetto navigator. Successivamente l'oggetto navigator viene eseguito ciclicamente utilizzando un ciclo for..in e il tipo di dati del valore corrente viene esaminato per escludere dei valori indesiderati. In questa applicazione vengono utilizzati solo i valori di tipo stringa o booleano, mentre gli altri tipi di dati (ad esempio, funzioni o array) vengono ignorati. Ogni valore stringa o booleano nell'oggetto navigator viene aggiunto all'array tempArr . Successivamente l'oggetto screen del browser viene eseguito ciclicamente utilizzando un ciclo for..in e ciascun valore numerico viene aggiunto all'array tempArr . Infine, l'array temporaneo viene convertito in una stringa utilizzando il metodo Array.join() . L'array utilizza la e commerciale (&) come delimitatore, consentendo ad ActionScript di analizzare facilmente i dati mediante la classe URLVariables.