功能範例:偵測系統功能

Flash Player 9 和更新的版本

CapabilitiesExplorer 範例會示範如何使用 flash.system.Capabilities 類別,以判斷使用者的 Flash 執行階段版本所支援的功能。此範例將教導您下列技巧:

  • 使用 Capabilities 類別,偵測使用者的 Flash 執行階段版本所支援的功能

  • 使用 ExternalInterface 類別,偵測使用者的瀏覽器所支援的瀏覽器設定

若要取得此樣本的應用程式檔案,請參閱 www.adobe.com/go/learn_programmingAS3samples_flash_tw。您可以在 Samples/CapabilitiesExplorer 檔案夾中找到 CapabilitiesExplorer 應用程式檔案,它是由下列檔案組成:

File

說明

CapabilitiesExplorer.fla

CapabilitiesExplorer.mxml

主應用程式檔案,在 Flash 中為 FLA,在 Flex 中為 MXML。

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

提供應用程式之主要功能的類別,這些功能包含將系統 Capabilities 加入陣列中、為項目排序,以即使用 ExternalInterface 類別擷取瀏覽器功能。

capabilities.html

包含必要之 JavaScript 的 HTML 容器,以便與外部 API 進行通訊。

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,以循環執行瀏覽器的 navigator 物件,此物件中包含瀏覽器的功能。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() 方法會傳回瀏覽器之 navigator 物件中每一個屬性的陣列。如果這個陣列的長度為一個或多個項目,則瀏覽器功能陣列 (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() 方法,循環執行瀏覽器的 navigator 物件,並將經過 URL 編碼的字串值傳回至 ActionScript。然後這個字串便會轉換為 URLVariables 物件 (itemVars),並加入 itemArr 陣列中,而此陣列會傳回至呼叫端指令碼。

與 JavaScript 進行通訊

建立 CapabilitiesExplorer 應用程式的最後一部分是撰寫必要的 JavaScript,以循環執行瀏覽器之 navigator 物件中的每一個項目,並將名稱/值配對附加到暫存陣列中。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>

程式碼是從建立暫存陣列開始,該陣列會保存 navigator 物件中的所有名稱/值配對。接著再使用 for..in 迴圈循環執行 navigator 物件,然後評估目前值的資料類型,以篩選出不想要的值。在此應用程式中,我們只要類型為 String 或 Boolean 的值,而其它類型 (例如函數或陣列) 則加以忽略。將 navigator 物件中的每一個 String 或 Boolean 值都附加到 tempArr 陣列,然後再使用 for..in 迴圈循環執行瀏覽器的 screen 物件,並將每一個數值加入至 tempArr 陣列。最後會使用 Array.join() 方法,將該暫存陣列轉換為字串。這個陣列會使用 & (and 符號) 做為分隔符號,讓 ActionScript 能夠使用 URLVariables 類別輕易剖析資料。