機能の例:システム機能の検出

Flash Player 9 以降

この CapabilitiesExplorer の例は、flash.system.Capabilities クラスを使用してユーザーの Flash ランタイムがどのような機能をサポートしているかを判別する方法を示しています。この例から、次の手法を学習できます。

  • Capabilities クラスを使用してユーザーの Flash ランタイムのバージョンがサポートしている機能を検出する方法

  • ExternalInterface クラスを使用してユーザーのブラウザーがサポートしているブラウザー設定を検出する方法

このサンプルのアプリケーションのファイルを入手するには、 www.adobe.com/go/learn_programmingAS3samples_flash_jp を参照してください。 CapabilitiesExplorer アプリケーションのファイルは、Samples/CapabilitiesExplorer フォルダーにあります。 このアプリケーションは、次のファイルで構成されています。

ファイル

説明

CapabilitiesExplorer.fla

または

CapabilitiesExplorer.mxml

Flash(FLA)または Flex(MXML)のメインアプリケーションファイル。

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

配列へのシステム Capabilities の追加、項目のソート、ExternalInterface クラスを使用したブラウザー機能の取得など、アプリケーションの主要な機能を提供するクラス。

capabilities.html

External API との通信に必要な JavaScript を格納する HTML コンテナ。

CapabilitiesExplorer の概要

CapabilitiesExplorer.mxml ファイルは、CapabilitiesExplorer アプリケーションのユーザーインターフェイスを設定することに責任を負います。 ユーザーの Flash ランタイムのバージョンの機能は、ステージ上の DataGrid コンポーネントインスタンス内に表示されます。また、ユーザーが HTML コンテナからアプリケーションを実行している場合、しかも External 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() メソッドは、External 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() メソッドは、ブラウザーのナビゲーターオブジェクトに含まれる各プロパティの配列を返します。その配列の長さが 1 項目以上である場合、ブラウザー機能の配列( 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; 
}

現在のユーザー環境で External API が使用可能な場合、Flash ランタイムは JavaScript の JS_getBrowserObjects() メソッドを呼び出します。このメソッドはブラウザーのナビゲーターオブジェクトをループ処理し、URL エンコードされた値のストリングを ActionScript に返します。このストリングは、その後、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 クラスを使用してデータを簡単に解析できます。