Adobe Flex 3 ヘルプ

例:システム機能の検出

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

  • Capabilities クラスを使用してユーザーが使用するバージョンの Flash Player または AIR がサポートする機能を検出する方法
  • ExternalInterface クラスを使用してユーザーのブラウザがサポートしているブラウザ設定を検出する方法

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

ファイル

説明

CapabilitiesExplorer.fla

または

CapabilitiesExplorer.mxml

Flash(FLA)または Flex(MXML)で記述されたメインアプリケーションファイル。

com/example/programmingas3/capabilities/CapabilitiesGrabber.as

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

capabilities.html

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

サブトピック



CapabilitiesExplorer の概要

CapabilitiesExplorer.mxml ファイルは、CapabilitiesExplorer アプリケーションのユーザーインターフェイスを設定することに責任を負います。ユーザーが使用するバージョンの Flash Player または AIR の機能は、ステージ上の 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() メソッドは、AIR または Flash Player の機能およびブラウザ機能のソートされた配列を返し、その後、ステージ上の 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() メソッドは、ブラウザのナビゲータオブジェクトに含まれる各プロパティの配列を返します。その配列の長さが 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;
}

現在のユーザー環境で外部 API が使用可能な場合、Flash Player は 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 クラスを使用してデータを簡単に解析できます。

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート