Ejemplo de Capabilities: Detección de las características del sistema

Flash Player 9 y posterior

En el ejemplo CapabilitiesExplorer se muestra la manera de utilizar la clase flash.system.Capabilities para determinar qué funciones admite la versión del motor de ejecución de Flash del usuario. Este ejemplo ilustra las técnicas siguientes:

  • Detectar las características de la versión del motor de ejecución de Flash del usuario mediante la clase Capabilities.

  • Utilizar la clase ExternalInterface para detectar la configuración del navegador del usuario

Para obtener los archivos de la aplicación de este ejemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_es. Los archivos de la aplicación CapabilitiesExplorer se encuentran en la carpeta Samples/CapabilitiesExplorer. La aplicación consta de los siguientes archivos:

Archivo

Descripción

CapabilitiesExplorer.fla

o

CapabilitiesExplorer.mxml

El archivo de aplicación principal en Flash (FLA) o Flex (MXML).

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

La clase que proporciona la funcionalidad principal de la aplicación, como añadir las características del sistema a un conjunto, ordenar los elementos y utilizar la clase ExternalInterface para obtener las características del navegador.

capabilities.html

Un contenedor HTML que contiene el código JavaScript necesario para comunicarse con la API externa.

Información general sobre CapabilitiesExplorer

El archivo CapabilitiesExplorer.mxml se encarga de configurar la interfaz de usuario para la aplicación CapabilitiesExplorer. Las capacidades de la versión del motor de ejecución de Flash del usuario se mostrarán en una instancia del componente DataGrid en el escenario. También se mostrarán las características del navegador si se ejecuta la aplicación desde un contenedor HTML y la API externa está disponible.

Cuando se distribuye el evento creationComplete del archivo de aplicación principal, se invoca el método initApp(). El método initApp() llama al método getCapabilities() desde la clase com.example.programmingas3.capabilities.CapabilitiesGrabber. El código del método initApp() es el siguiente:

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

El método CapabilitiesGrabber.getCapabilities() devuelve un conjunto ordenado de las capacidades del navegador y el motor de ejecución de Flash, que después se establece en la propiedad dataProvider de la instancia capabilitiesGrid del componente DataGrid en el escenario.

Información general sobre la clase CapabilitiesGrabber

El método estático getCapabilities() de la clase CapabilitiesGrabber añade cada propiedad de la clase flash.system.Capabilities a un conjunto (capDP). Después llama al método estático getBrowserObjects() de la clase CapabilitiesGrabber. El método getBrowserObjects() utiliza la API externa para recorrer el objeto navigator del navegador, que contiene las características del navegador. El código del método getCapabilities() es:

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

El método getBrowserObjects() devuelve un conjunto que contiene cada una de las propiedades del objeto navigator del navegador. Si este conjunto tiene una longitud de uno o más elementos, el conjunto de características del navegador (navArr) se añade a la matriz de características de Flash Player (capDP) y se ordena alfabéticamente el conjunto completo. Por último, el conjunto ordenado se devuelve al archivo de aplicación principal, que llena a continuación la cuadrícula de datos. El código del método getBrowserObjects() es el siguiente:

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

Si la API externa está disponible en el entorno de usuario actual, el motor de ejecución de Flash llama al método JS_getBrowserObjects() de JavaScript, que recorre el objeto navigator del navegador y devuelve a ActionScript una cadena de valores codificados en URL. Esta cadena se convierte en un objeto URLVariables (itemVars) y se añade al conjunto itemArr, que se devuelve al script que hizo la llamada.

Comunicación con JavaScript

La parte final de la creación de la aplicación CapabilitiesExplorer consiste en escribir el código JavaScript necesario para recorrer cada uno de los elementos del objeto navigator del navegador y añadir un par nombre-valor a un conjunto temporal. El código del método JS_getBrowserObjects() de JavaScript del archivo container.html es:

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

El código empieza creando un conjunto temporal que contendrá todos los pares nombre-valor del objeto navigator. A continuación, el objeto navigator se somete a un bucle for..in y se evalúa el tipo de datos del valor actual para filtrar y omitir los valores no deseados. En esta aplicación, solo estamos interesados en valores de cadena o booleanos, y los otros tipos de datos (como funciones o conjuntos) se omiten. Cada valor de tipo cadena o booleano del objeto navigator se añade al conjunto tempArr. A continuación, el objeto screen del navegador se somete a un bucle for..in y se añaden los valores numéricos encontrados al conjunto tempArr. Por último, el conjunto se convierte en una cadena mediante el método Array.join(). El conjunto usa un carácter ampersand (&) como delimitador, lo que permite a ActionScript analizar fácilmente los datos con la clase URLVariables.