功能示例:检测系统功能

Flash Player 9 和更高版本

CapabilitiesExplorer 示例演示了如何使用 flash.system.Capabilities 类确定用户的 Flash 运行时版本支持的功能。该示例讲授以下方法:

  • 使用 Capabilities 类检测用户的 Flash 运行时版本支持的功能

  • 使用 ExternalInterface 类检测用户的浏览器支持哪些浏览器设置

若要获取此范例的应用程序文件,请参阅 www.adobe.com/go/learn_programmingAS3samples_flash_cn。可以在 Samples/CapabilitiesExplorer 文件夹中找到 CapabilitiesExplorer 应用程序文件。该应用程序包含下列文件:

文件

说明

CapabilitiesExplorer.fla

CapabilitiesExplorer.mxml

Flash 或 Flex 中的主应用程序文件(分别为 FLA 和 MXML)。

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

用于提供应用程序的主要功能的类,这些主要功能包括在数组中添加系统功能、对项目进行排序以及使用 ExternalInterface 类检索浏览器功能。

capabilities.html

包含与外部 API 进行通信所必需的 JavaScript 的 HTML 容器。

CapabilitiesExplorer 概述

CapabilitiesExplorer.mxml 文件负责设置 CapabilitiesExplorer 应用程序的用户界面。用户的 Flash 运行时版本的功能将在舞台上的 DataGrid 组件实例内显示。如果用户是从 HTML 容器运行应用程序且外部 API 可用,也将显示其浏览器功能。

调度主应用程序文件的 creationComplete 事件时,将调用 initApp() 方法。initApp() 方法从 com.example.programmingas3.capabilities.CapabilitiesGrabber 类中调用 getCapabilities() 方法。initApp() 方法的代码如下所示:

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

CapabilitiesGrabber.getCapabilities() 方法返回 Flash 运行时和浏览器功能的排序的数组,然后将其设置为舞台上的 capabilitiesGrid DataGrid 组件实例的 dataProvider 属性。

CapabilitiesGrabber 类概述

CapabilitiesGrabber 类的静态 getCapabilities() 方法将 flash.system.Capabilities 类中的每个属性添加到数组 (capDP)。然后调用 CapabilitiesGrabber 类中的静态 getBrowserObjects() 方法。getBrowserObjects() 方法使用外部 API 循环访问浏览器的导航器对象(包含浏览器的功能)。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; 
}

getBrowserObjects() 方法返回一个数组,该数组包含浏览器的导航器对象中的每个属性。如果该数组的长度为一个或多个项目,则将浏览器功能的数组 (navArr) 追加到 Flash Player 功能的数组 (capDP) 末尾,并按字母顺序对整个数组进行排序。最后,排序后的数组将返回到主应用程序文件,随后填充数据网格。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; 
}

如果当前用户环境中有外部 API,Flash 运行时将调用 JavaScript JS_getBrowserObjects() 方法,该方法循环访问浏览器的导航器对象并向 ActionScript 返回 URL 编码的值的字符串。该字符串随后将转换为 URLVariables 对象 (itemVars) 并添加到 itemArr 数组中,将向调用脚本返回该数组。

与 JavaScript 进行通信

作为构建 CapabilitiesExplorer 应用程序的最后一部分工作,要编写循环访问浏览器导航器对象中的每个项目所必需的 JavaScript,并将一个名称/值对追加到一个临时数组的末尾。container.html 文件中的 JavaScript JS_getBrowserObjects() 方法的代码如下所示:

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

代码首先创建一个临时数组,该数组用于保存导航器对象中的所有名称/值对。接下来,使用 for..in 循环对导航器对象进行循环访问,并计算出当前值的数据类型以过滤掉不需要的值。在此应用程序中,我们只需要 String 或 Boolean 值,其他数据类型(例如函数或数组)将被忽略。导航器对象中的每个 String 或 Boolean 值将追加到 tempArr 数组末尾。然后,使用 for..in 循环对浏览器的屏幕对象进行循环访问,并将每个数值添加到 tempArr 数组中。最后,使用 Array.join() 方法将临时数组转换为字符串。该数组使用 (&) 符号作为分隔符,这使得 ActionScript 可以使用 URLVariables 类轻松分析数据。