Exemplo de recursos: detecção de capacidades do sistema

Flash Player 9 e posterior

O exemplo CapabilitiesExplorer demonstra como usar a classe flash.system.Capabilities para determinar quais recursos são suportados pela versão do usuário do tempo de execução do Flash. Este exemplo ensina as seguintes técnicas:

  • Detecção das capacidades suportadas pela versão do usuário do tempo de execução do Flash usando a classe Capabilities.

  • Uso da classe ExternalInterface para detectar quais configurações de navegador são suportadas pelo navegador do usuário.

Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br . Os arquivos do aplicativo CapabilitiesExplorer podem ser encontrados na pasta Amostras/CapabilitiesExplorer. Esse aplicativo consiste nos seguintes arquivos:

Arquivo

Descrição

CapabilitiesExplorer.fla

ou

CapabilitiesExplorer.mxml

O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

A classe que fornece a funcionalidade principal do aplicativo, incluindo a adição das capacidades do sistema a uma matriz, a classificação dos itens e o uso da classe ExternalInterface para recuperar as capacidades do navegador.

capabilities.html

Um contêiner HTML que contém o JavaScript necessário para se comunicar com a API externa.

Visão geral de CapabilitiesExplorer

O arquivo CapabilitiesExplorer.mxml é responsável por configurar a interface do usuário para o aplicativo CapabilitiesExplorer. As capacidades da versão do usuário do tempo de execução do Flash serão exibidas dentro de uma ocorrência do componente DataGrid no Palco. As capacidades do navegador também serão exibidas se eles estiverem executando o aplicativo em um contêiner HTML e se a API externa estiver disponível.

Quando o evento creationComplete do arquivo do aplicativo principal é despachado, o método initApp() é chamado. O método initApp() chama o método getCapabilities() de dentro da classe com.example.programmingas3.capabilities.CapabilitiesGrabber. O código do método initApp() é o seguinte:

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

O método CapabilitiesGrabber.getCapabilities() retorna uma matriz classificada do tempo de execução do Flash e as capacidades do navegador que, em seguida, são definidas para a propriedade dataProvider da ocorrência do componente DataGrid capabilitiesGrid no Palco.

Visão geral da classe CapabilitiesGrabber

O método estático getCapabilities() da classe CapabilitiesGrabber adiciona cada propriedade da classe flash.system.Capabilities a uma matriz ( capDP ). Em seguida, ele chama o método estático getBrowserObjects() na classe CapabilitiesGrabber. O método getBrowserObjects() usa a API externa para loop sobre o objeto navigator do navegador que contém as capacidades do navegador. O método getCapabilities() é o seguinte:

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

O método getBrowserObjects() retorna uma matriz de cada uma das propriedades do objeto navigator no navegador. Se essa matriz tiver um comprimento de um ou mais itens, a matriz de capacidades do navegador ( navArr ) será anexada à matriz de capacidades do Flash Player ( capDP ) e a matriz inteira será classificada alfabeticamente. Finalmente, a matriz classificada será retornada ao arquivo do aplicativo principal que, em seguida preencherá a grade de dados. O código para o método getBrowserObjects() é o seguinte:

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 a API externa estiver disponível no ambiente atual do usuário, o tempo de execução do Flash chamará o método JS_getBrowserObjects() do JavaScript que executa loop sobre o objeto navigator do navegador e retorna uma string de valores codificados de URL ao ActionScript. Em seguida, essa string é convertida em um objeto URLVariables ( itemVars ) e adicionada à matriz itemArr que é retornada para o script de chamada.

Comunicação com o JavaScript

A parte final da criação do aplicativo CapabilitiesExplorer é a escrita do JavaScript necessário para executar loop sobre cada um dos itens no objeto navigator do navegador e anexar um par de nome e valor a uma matriz temporária. O código do método JS_getBrowserObjects() do JavaScript no container.html é o seguinte:

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

O código começa com a criação de uma matriz temporária que conterá todos os pares de nome e valor no objeto navigator. Em seguida, um loop é executado no objeto navigator usando um loop for..in e o tipo de dados do valor atual é avaliado para filtrar valores indesejados. Neste aplicativo, estamos interessados somente nos valores de string ou boolianos e outros tipos de dados (como funções ou matrizes) são ignorados. Cada valor de string ou booliano no objeto navigator é anexado à matriz tempArr . Em seguida, é executado um loop no objeto da tela do navegador usando um for..in e cada valor numérico é adicionado à matriz tempArr . Finalmente, a matriz temporária é convertida em uma string usando o método Array.join() . A matriz usa um e comercial (&) como um delimitador, o que permite que o ActionScript analise os dados facilmente usando a classe URLVariables.