기능 예제: 시스템 기능 검색

Flash Player 9 이상

CapabilitiesExplorer 예제에서는 flash.system.Capabilities 클래스를 사용하여 사용자의 Flash 런타임 버전에서 지원하는 기능을 확인할 수 있는 방법을 보여 줍니다. 이 예제는 다음과 같은 기술에 대해 설명합니다.

  • Capabilities 클래스를 사용하여 사용자의 Flash 런타임 버전에서 지원하는 기능 검색

  • ExternalInterface 클래스를 사용하여 사용자의 브라우저에서 지원하는 브라우저 설정 검색

이 샘플에 대한 응용 프로그램 파일을 가져오려면 www.adobe.com/go/learn_programmingAS3samples_flash_kr 을 참조하십시오. 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 런타임 버전의 기능은 스테이지의 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 객체를 반복하고 현재 값의 데이터 유형을 평가하여 원치 않는 값을 제외합니다. 이 응용 프로그램에서는 문자열 또는 부울 값만 사용하고 다른 데이터 유형(함수 또는 배열)은 무시합니다. navigator 객체의 각 문자열 또는 부울 값은 tempArr 배열에 추가됩니다. 그 다음에는 for..in 루프를 사용하여 브라우저의 screen 객체가 반복되고 각 숫자 값이 tempArr 배열에 추가됩니다. 마지막으로 임시 배열은 Array.join() 메서드를 사용하여 문자열로 변환됩니다. 배열은 앰퍼샌드(&)를 구분 기호로 사용합니다. 그러므로 ActionScript에서 URLVariables 클래스를 사용하여 쉽게 데이터를 파싱할 수 있습니다.